このページでは、カラム型エンジンの使用率をモニタリングする方法について説明します。
EXPLAIN を使用してカラム型エンジンの使用を確認する
EXPLAIN ステートメントを使用して、クエリに生成されたクエリプランに表示される新しいカラム型オペレーターをモニタリングすることで、カラム型エンジンの使用状況を確認できます。
psql クライアント
EXPLAIN (ANALYZE,COSTS OFF,BUFFERS,TIMING OFF,SUMMARY OFF)
SELECT l_returnflag, l_linestatus, l_quantity, l_extendedprice,
l_discount, l_tax
FROM lineitem
WHERE l_shipdate <= date '1992-08-06'
;
QUERY PLAN
-----------------------------------------------------------------------------
Append (actual rows=3941797 loops=1)
Buffers: shared hit=9
-> Custom Scan (columnar scan) on lineitem (actual rows=3941797 loops=1)
Filter: (l_shipdate <= '1992-08-06'::date)
Rows Removed by Columnar Filter: 56054083
Columnar cache search mode: columnar filter only
Buffers: shared hit=9
-> Seq Scan on lineitem (never executed)
Filter: (l_shipdate <= '1992-08-06'::date)
Custom Scan (columnar scan)は、クエリプランにカラム型エンジン スキャンが含まれていることを表しています。Rows Removed by Columnar Filterは、ベクトル化カラム型実行によって除外された行数です。Columnar cache search modeは、columnar filter only、native、row store scanのいずれかです。プランナーは、費用とプッシュダウン評価機能に基づいて検索モードを自動的に選択します。
プランナーが native モードを選択すると、一部のカラム型オペレーターがスキャンにプッシュダウンされます。
Rows Aggregated by Columnar Scanは、集計された行数を表します。Rows Sorted by Columnar Scanは、並べ替えられた行数を表します。Rows Limited by Columnar Scanは、スキャンされた行数の制限付きのリストです。
結合により、カラム型スキャン オペレーターで Late Materialization モードを使用することもできます。
psql クライアント
EXPLAIN (ANALYZE,COSTS OFF,BUFFERS,TIMING OFF,SUMMARY OFF)
SELECT l_shipmode, o_orderpriority
FROM orders, lineitem
WHERE o_orderkey = l_orderkey
AND l_shipmode in ('AIR', 'FOB')
AND l_receiptdate >= date '1995-01-01'
;
QUERY PLAN
-----------------------------------------------------------------------------
Hash Join (actual rows=9865288 loops=1)
Hash Cond: (lineitem.l_orderkey = orders.o_orderkey)
Buffers: temp read=127738 written=127738
-> Append (actual rows=9865288 loops=1)
-> Custom Scan (columnar scan) on lineitem (actual rows=9865288 loops=1)
Filter: ((l_shipmode = ANY ('{AIR,FOB}'::bpchar[])) AND
(l_receiptdate >= '1995-01-01'::date))
Rows Removed by Columnar Filter: 50130592
Columnar cache search mode: native
-> Index Scan using idx_lineitem_orderkey_fkidx on lineitem
(never executed)
Filter: ((l_shipmode = ANY ('{AIR,FOB}'::bpchar[])) AND
(l_receiptdate >= '1995-01-01'::date))
-> Hash (actual rows=15000000 loops=1)
Buckets: 1048576 Batches: 32 Memory Usage: 37006kB
Buffers: temp written=83357
-> Append (actual rows=15000000 loops=1)
-> Custom Scan (columnar scan) on orders (actual rows=15000000
loops=1)
Rows Removed by Columnar Filter: 0
Columnar projection mode: late materialization
Columnar cache search mode: native
-> Seq Scan on orders (never executed)
Columnar projection mode は late materialization です。カラム型オペレーターは、プランナーが一部の列値の実体化を遅らせて投影を最適化するときに、このモードを自動的に選択します。
カラム型エンジンのベクトル化結合の使用状況を確認する
新しいベクトル化結合オペレーターを検証するには、EXPLAIN ステートメントを使用して、クエリに生成されたクエリプランに表示される新しい Vectorized Hash Join オペレーターを調べます。
EXPLAIN (ANALYZE,COSTS OFF,BUFFERS,TIMING OFF,SUMMARY OFF)
SELECT l_quantity, l_extendedprice, l_discount, l_tax
FROM lineitem, orders
WHERE l_shipdate <= date '2022-08-06'
AND l_orderkey = o_orderkey
AND o_orderdate <= date '2025-03-07';
QUERY PLAN
---------------------------------------------------------------------------------------
Vectorized Hash Join (actual rows=3934686 loops=1)
Vectorized partitioning, Partitions: 16 (Disk usage: 208MB)
(Peak Memory Usage: 27MB, Threads: 1)
Hash Cond: (lineitem.l_orderkey = orders.o_orderkey)
Rows Removed by Bloom Filter: 0
Buffers: temp read=26728 written=26728
-> Append (actual rows=3934686 loops=1)
-> Custom Scan (columnar scan) on lineitem (actual rows=3934686 loops=1)
Filter: (l_shipdate <= '2022-08-06'::date)
Rows Removed by Columnar Filter: 56051366
Columnar cache search mode: native
-> Seq Scan on lineitem (never executed)
Filter: (l_shipdate <= '2022-08-06'::date)
-> Vectorized Hash (actual rows=7245824 loops=1)
Build bloom filter, Memory Usage: 1024kB
-> Append (actual rows=7245824 loops=1)
-> Custom Scan (columnar scan) on orders (actual rows=7245824 loops=1)
Filter: (o_orderdate <= '2025-03-07'::date)
Rows Removed by Columnar Filter: 7754176
Columnar cache search mode: native
-> Seq Scan on orders (never executed)
Filter: (o_orderdate <= '2025-03-07'::date)
Vectorized Hash Joinは、2 つのリレーション間の結合でベクトル化ハッシュ結合が使用されたことを示します。Vectorized partitioning, Partitions:は、データが分割されたパーティションの数です。
EXPLAIN に COLUMNAR_ENGINE オプションを使用する
EXPLAIN コマンドは COLUMNAR_ENGINE オプションをサポートしています。指定すると、このコマンドは EXPLAIN プランに Columnar Check メッセージを出力し、プランナーまたはエグゼキュータがプランに特定のカラム型エンジン関連の選択を行った原因を示します。このコマンドは、カラム型エンジンに固有の追加情報を出力します。このメッセージは、列以外のスキャンノードに関連付けられています。通常、これは、スキャンにカラムスキャンが選択されない最初の原因を示します。たとえば、the table is too small、a needed column of the table is not in the CE store、a needed column has a CE unsupported data type などです。
次のコマンドの出力例では、Columnar Check メッセージが出力されます。
psql クライアント
EXPLAIN (COLUMNAR_ENGINE, COSTS OFF)
SELECT * FROM sample_small_table
WHERE col1 > 10000;
QUERY PLAN
--------------------------------------
Seq Scan on sample_small_table
Filter: (col1 > 10000)
Columnar Check: table is too small
メッセージに応じて、ユーザーは次のいずれかを行います。
- 具体的な原因に対処し、コマンドを再実行して列形式のプランを確認します。
- 同じプロセスを繰り返します。原因は複数ある場合があり、この句では最初の原因のみをリストしようとします。
次の例は、カラム型エンジンに固有の詳細が印刷されていることを示しています。
psql クライアント
EXPLAIN (ANALYZE, COLUMNAR_ENGINE, COSTS OFF, TIMING OFF, SUMMARY OFF, VERBOSE) SELECT SUM(c1) FROM counter_table WHERE c2 > 0 and c2 < 80000;
QUERY PLAN
---------------------------------------------------------------------------------------------
Aggregate (actual rows=1 loops=1)
Output: sum(c1)
-> Append (actual rows=79999 loops=1)
-> Custom Scan (columnar scan) on public.counter_table (actual rows=79999 loops=1)
Output: c1
Filter: ((counter_table.c2 > 0) AND (counter_table.c2 < 80000))
Rows Removed by Columnar Filter: 1
Rows Aggregated by Columnar Scan: 79999
Bytes fetched from storage cache: 1392655
Columnar cache search mode: native
-> Seq Scan on public.counter_table (never executed)
Output: c1
Filter: ((counter_table.c2 > 0) AND (counter_table.c2 < 80000))
(13 rows)
カラムストア内の列を含むテーブルの情報を確認する
カラムストア内の列を含むテーブルまたはマテリアライズド ビューに関する情報を表示するには、g_columnar_relations ビューをクエリします。
psql クライアント
SELECT * FROM g_columnar_relations; ┌─[ RECORD 1 ]────────┬───────────────────┐ │ relation_name │ tbl_parallel_test │ │ schema_name │ public │ │ database_name │ advisor │ │ status │ Usable │ │ size │ 581431259 │ │ columnar_unit_count │ 3 │ │ invalid_block_count │ 0 │ │ total_block_count │ 8337 │ ├─[ RECORD 2 ]────────┼───────────────────┤ │ relation_name │ lineitem │ │ schema_name │ public │ │ database_name │ advisor │ │ status │ Usable │ │ size │ 423224944 │ │ columnar_unit_count │ 29 │ │ invalid_block_count │ 0 │ │ total_block_count │ 115662 │ ├─[ RECORD 3 ]────────┼───────────────────┤
カラムストア内の列に関する情報を確認する
カラムストア内の列に関する情報(列のサイズや最終アクセス時間など)は、g_columnar_columns ビューをクエリすることで確認できます。
psql クライアント
SELECT database_name, schema_name, relation_name, column_name, size_in_bytes, last_accessed_time FROM g_columnar_columns;
最近のクエリでのカラム型エンジンの実行統計情報を確認する
最近のクエリのカラム型エンジン実行統計情報は、g_columnar_stat_statements ビューで表示できます。このビューは、pg_stat_statements 拡張機能によって提供される pg_stat_statements ビューにカラム型エンジンの統計情報を追加します。このビューを使用するには、まず pg_stat_statements 拡張機能を有効にする必要があります。
psql クライアント
pg_stat_statements拡張機能を有効にします。CREATE EXTENSION pg_stat_statements;
- 統計情報を表示するクエリを作成します。これは手動で行うことも、アプリケーションで
pg_stat_statementsを有効にしてクエリを作成することもできます。 g_columnar_stat_statementsビューとpg_stat_statementsビューをクエリします。次のクエリは、拡張機能pg_stat_statementsの作成前に収集された統計情報を含む、すべてのカラム化実行の統計情報を取得します。useridの null 値は、拡張機能pg_stat_statementsが作成される前に統計情報が収集されたことを示します。SELECT * FROM pg_stat_statements(TRUE) AS pg_stats FULL JOIN g_columnar_stat_statements AS g_stats ON pg_stats.userid = g_stats.user_id AND pg_stats.dbid = g_stats.db_id AND pg_stats.queryid = g_stats.query_id WHERE columnar_unit_read > 0; ┌─[ RECORD 1 ]────────┬─────────────────────────────── │ userid │ 10 │ │ dbid │ 33004 │ │ queryid │ 6779068104316758833 │ │ query │ SELECT l_returnflag, ↵│ │ │ l_linestatus, ↵│ │ │ l_quantity, ↵│ │ │ l_extendedprice, ↵│ │ │ l_discount, ↵│ │ │ l_tax ↵│ │ │FROM lineitem ↵│ │ │WHERE l_shipdate <= date $1│ │ calls │ 1 │ │ total_time │ 299.969983 │ │ min_time │ 299.969983 │ │ max_time │ 299.969983 │ │ mean_time │ 299.969983 │ │ stddev_time │ 0 │ │ rows │ 392164 │ │ shared_blks_hit │ 0 │ │ shared_blks_read │ 0 │ │ shared_blks_dirtied │ 0 │ │ shared_blks_written │ 0 │ │ local_blks_hit │ 0 │ │ local_blks_read │ 0 │ │ local_blks_dirtied │ 0 │ │ local_blks_written │ 0 │ │ temp_blks_read │ 0 │ │ temp_blks_written │ 0 │ │ blk_read_time │ 0 │ │ blk_write_time │ 0 │ │ user_id │ 10 │ │ db_id │ 33004 │ │ query_id │ 6779068104316758833 │ │ columnar_unit_read │ 29 │ │ page_read │ 115662 │ │ rows_filtered │ 0 │ │ columnar_scan_time │ 0 │ └─────────────────────┴───────────────────────────────┘
カラムストアのメモリ使用量を確認する
カラム型エンジンで使用可能な未使用の RAM の量を確認するには、google_columnar_engine_memory_available() 関数をクエリします。結果の整数は、メガバイト(MB)単位の使用可能メモリを示します。
SELECT google_columnar_engine_memory_available();
カラムストア内のインデックスに関する情報を確認する
列インデックスのステータス、サイズ、パフォーマンスに関連するさまざまな指標に関する情報を表示するには、g_columnar_indexes ビューをクエリします。
psql クライアント
SELECT
database_name, schema_name, index_name, status, size,
total_partition_count, non_leaf_partition_count, leaf_partition_count,
invalid_block_count, block_count_in_cc, total_block_count,
creation_time, auto_refresh_trigger_count,
auto_refresh_failure_count, auto_refresh_trigger_timestamp,
auto_refresh_start_timestamp, auto_refresh_end_timestamp,
auto_refresh_recent_status
FROM g_columnar_indexes;
次の表に、g_columnar_indexes ビューのフィールドを示します。
| フィールド | データ型 | 説明 |
|---|---|---|
| database_name | 名前 | |
| schema_name | 名前 | インデックスが属するスキーマの名前 |
| index_name | 名前 | インデックスの名前 |
| ステータス | 名前 | カラム型エンジンのインデックスのステータス |
| サイズ | BIGINT | カラム型エンジンのインデックスのサイズ |
| total_partition_count | BIGINT | カラム型エンジンのインデックス パーティションの合計数 |
| non_leaf_partition_count | BIGINT | カラム型エンジン内のインデックスの非リーフ パーティションの合計数 |
| leaf_partition_count | BIGINT | カラム型エンジン内のインデックスのリーフ パーティションの合計数 |
| invalid_block_count | BIGINT | インデックスのカラム型エンジンの無効なブロックの合計数 |
| block_count_in_cc | BIGINT | カラム型エンジンのインデックス ブロックの総数 |
| total_block_count | BIGINT | インデックスのブロックの合計数 |
| creation_time | BIGINT | カラム型エンジンのインデックス作成時間 |
| auto_refresh_trigger_count | BIGINT | Postgres の起動以降にトリガーされた自動更新の合計数。 |
| auto_refresh_failure_count | BIGINT | Postgres の起動以降の自動更新の失敗の合計数 |
| auto_refresh_trigger_timestamp | BIGINT | トリガーされた最新の自動更新のタイムスタンプ |
| auto_refresh_start_timestamp | BIGINT | 開始された最新の自動更新のタイムスタンプ |
| auto_refresh_end_timestamp | BIGINT | 完了した最新の自動更新のタイムスタンプ。 |
| auto_refresh_recent_status | テキスト | 最新の自動更新のステータス |