使用 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會列出已掃描的有限資料列數量。
使用 join 時,資料欄掃描運算子也可以使用 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。
當規劃工具延後部分資料欄值的具體化作業,藉此最佳化投影時,欄狀運算子會自動選擇這個模式。
查看資料欄引擎向量化 join 使用情形
您可以使用 EXPLAIN 陳述式,觀察查詢產生的查詢計畫中,是否出現新的 Vectorized Hash Join 運算子,藉此驗證新的向量化 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 檢視畫面,查看資料表或 materialized view (含資料欄儲存庫中的資料欄) 的相關資訊。
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擴充功能之前收集的統計資料。10的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();
查看資料欄引擎儲存空間快取
如要查看及監控資料欄引擎的儲存空間快取資料,可以使用下列指令:
| 指令 | 說明 |
|---|---|
SELECT google_columnar_engine_storage_cache_used(); |
傳回已使用的資料欄引擎儲存空間快取大小。 |
SELECT google_columnar_engine_storage_cache_available(); |
傳回未使用的資料欄引擎儲存空間快取大小。 |
SHOW google_columnar_engine.storage_cache_size; |
傳回為資料欄引擎設定的儲存空間快取大小總量。 |