監控資料欄引擎

本頁說明如何監控資料欄引擎的使用率。

使用 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 onlynativerow 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 表示兩個關係之間的聯結使用了向量化雜湊聯結。
  • Vectorized partitioning, Partitions: 列出資料分割的分區數量。

使用「EXPLAIN」的「COLUMNAR_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 ]------------------+---------------------
database_name                  | postgres
schema_name                    | public
relation_name                  | uuid_mod_test_stored
status                         | Usable
size                           | 700672237
invalid_block_count            | 0
block_count_in_cc              | 123907
total_block_count              | 123907
auto_refresh_trigger_count     | 0
auto_refresh_failure_count     | 0
auto_refresh_trigger_timestamp | NULL
auto_refresh_start_timestamp   | NULL
auto_refresh_end_timestamp     | NULL
auto_refresh_recent_status     | NONE YET

查看資料欄商店中資料欄的相關資訊

您可以查詢 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 擴充功能。

psql 用戶端

如要查看這些統計資料,請按照下列步驟操作:

  1. 啟用 pg_stat_statements 擴充功能:
    CREATE EXTENSION pg_stat_statements;
    
  2. 執行要查看統計資料的查詢。您可以手動執行這項作業,也可以讓應用程式執行一段時間,產生資料。
  3. 查詢 g_columnar_stat_statements 檢視區塊,即可查看收集到的統計資料。
    SELECT * FROM g_columnar_stat_statements WHERE page_read > 0;
    

    輸出結果會與下列內容相似:

    -[ RECORD 1 ]--------------------------+--------------------
    user_id                              | 16391
    db_id                                | 1008530
    query_id                             | 6672321263128921833
    columnar_unit_read                   | 32
    page_read                            | 128003
    rows_filtered                        | 0
    columnar_scan_time                   | 0
    vectorized_join_time                 | 0
    vectorized_aggregation_time          | 0
    vectorized_aggregation_vj_time       | 0
    -[ RECORD 2 ]--------------------------+--------------------
    user_id                              | 16391
    db_id                                | 1008530
    query_id                             | -816808861243589285
    columnar_unit_read                   | 30
    page_read                            | 119811
    rows_filtered                        | 0
    columnar_scan_time                   | 0
    vectorized_join_time                 | 0
    vectorized_aggregation_time          | 0
    vectorized_aggregation_vj_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 自 PostgreSQL 啟動以來觸發的自動重新整理總次數。
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 TEXT 最近一次自動重新整理的狀態