使用 EXPLAIN 驗證資料欄引擎的使用情況
如要觀察查詢產生的查詢計畫中顯示的新直欄運算子,可以使用 EXPLAIN 陳述式驗證直欄引擎的使用情形。
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 模式。
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:列出資料分割的分區數量。
在資料欄商店中查看含有資料欄的資料表相關資訊
您可以查詢 g_columnar_relations 檢視區塊,查看資料表或具體化檢視區塊的相關資訊,以及資料欄商店中的資料欄。
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 檢視區塊,查看資料欄商店中的資料欄相關資訊,包括資料欄大小和上次存取時間。
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 擴充功能。
- 啟用
pg_stat_statements擴充功能:CREATE EXTENSION pg_stat_statements;
- 執行要查看統計資料的查詢。
您可以手動執行這項作業,也可以等待一段時間,讓應用程式在啟用
pg_stat_statements的情況下執行這些查詢。 - 查詢
g_columnar_stat_statements和pg_stat_statements檢視區塊。請注意,下列查詢會擷取所有資料欄執行統計資料,包括在建立pg_stat_statements擴充功能前收集的資料。10userid值表示系統是在擴充功能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();
查看資料欄引擎儲存空間快取
如要查看及監控資料欄引擎的儲存空間快取資料,可以使用下列指令:
| 指令 | 說明 |
|---|---|
SELECT google_columnar_engine_storage_cache_used(); |
傳回已使用的資料欄引擎儲存空間快取大小。 |
SELECT google_columnar_engine_storage_cache_available(); |
傳回未使用的資料欄引擎儲存空間快取大小。 |
SHOW google_columnar_engine.storage_cache_size; |
傳回資料欄引擎設定的儲存空間快取總大小。 |