監控資料欄引擎

監控資料欄引擎,可確認查詢是否使用資料欄儲存庫,並決定是否要變更內容或記憶體大小。您可以使用 EXPLAIN 陳述式查看查詢計畫,以及資料欄儲存庫的資料表、資料欄和索引,以及執行統計資料和記憶體用量。如要修改資料欄引擎設定,請參閱「調整資料欄引擎」。

使用 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 會列出已掃描的有限資料列數量。

使用 join 時,資料欄掃描運算子也可以使用 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。 當規劃工具透過延遲具體化部分資料欄值來最佳化投影時,資料欄運算子會自動選擇這個模式。

查看資料欄引擎向量化 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: 列出資料分割成的分區數量。

為 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 檢視表,查看資料表或 materialized view 的相關資訊,以及資料欄儲存庫中的資料欄。

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 NAME 索引所在的資料庫名稱
schema_name NAME 索引所屬結構定義的名稱
index_name NAME 索引名稱
status NAME 資料欄引擎中的索引狀態
size 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 PostgreSQL 啟動後,自動重新整理失敗的總次數
auto_refresh_trigger_timestamp BIGINT 最近一次觸發自動重新整理的時間戳記
auto_refresh_start_timestamp BIGINT 最近一次啟動自動重新整理的時間戳記
auto_refresh_end_timestamp BIGINT 最近一次完成自動重新整理的時間戳記
auto_refresh_recent_status TEXT 最近一次自動重新整理的狀態