本頁說明如何監控資料欄引擎的使用率。
使用 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表示兩個關係之間的聯結使用了向量化雜湊聯結。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 ]------------------+--------------------- 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 用戶端
如要查看這些統計資料,請按照下列步驟操作:
- 啟用
pg_stat_statements擴充功能:CREATE EXTENSION pg_stat_statements;
- 執行要查看統計資料的查詢。您可以手動執行這項作業,也可以讓應用程式執行一段時間,產生資料。
- 查詢
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 | 最近一次自動重新整理的狀態 |