カラム型エンジンをモニタリングする

このページでは、列エンジンの使用率をモニタリングする方法について説明します。

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 modecolumnar filter onlynative、または 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 modelate materialization にできます。列オペレーターは、プランナーが一部列値のマテリアライゼーションを遅らせて投影を最適化するときに、このモードを自動的に選択します。

EXPLAINCOLUMNAR_ENGINE オプションを使用する

EXPLAIN コマンドは COLUMNAR_ENGINE オプションをサポートしています。指定すると、このコマンドは EXPLAIN プランに Columnar Check メッセージを出力し、プランナーまたはエグゼキュータがプランに特定の列エンジン関連の選択を行うに至った原因を表示します。このコマンドは、列エンジンに固有の追加情報を出力します。このメッセージは、列以外のスキャンノードに関連付けられています。通常、これは、スキャンに列スキャンが選択されない最初の原因を示します。たとえば、the table is too smalla needed column of the table is not in the CE storea 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 クライアント

  1. pg_stat_statements 拡張機能を有効にします。
    CREATE EXTENSION pg_stat_statements;
    
  2. 統計情報を表示するクエリを作成します。これは手動で行うことも、アプリケーションが pg_stat_statements を有効にしてこれらのクエリを実行するまで十分な時間を待つこともできます。
  3. 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();