本頁說明如何監控資料欄引擎的使用率。
使用 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:列出資料分割的分區數量。
使用 COLUMNAR_ENGINE 選項進行 EXPLAIN
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的空值表示統計資料是在建立擴充功能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 | 自 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 | 最近一次自動重新整理的狀態 |