监控列式引擎

选择文档版本:

本页面介绍了如何监控列式引擎的利用率。

使用 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;

在 Web 界面中查看列存储区

您还可以在 AlloyDB Omni Web 界面中查看列存储区清单:

  1. 连接到 Web 界面,然后选择您的集群。
  2. 在导航菜单中,点击列式引擎。
  3. 在列式存储区数据表中,查看列存储区中填充的列:
    • 数据库名称:包含关系的数据库。
    • 架构名称:关系的架构。
    • 关系名称:表或具体化视图的名称。
    • 列名称:列式列的名称。
    • 列类型:列的 SQL 数据类型。
    • 状态:列存储中列的就绪状态(例如 Usable)。
    • 大小:列存储区中列的内存占用。
    • 访问次数:列式扫描访问该列的次数。
    • 上次访问时间:最近一次列式扫描访问的时间戳。

查看近期查询的列式引擎执行统计信息

您可以使用 g_columnar_stat_statements 视图查看近期查询的列式引擎执行统计信息。此视图会将列式引擎统计信息添加到 pg_stat_statements 扩展程序提供的 pg_stat_statements 视图。如需使用此视图,您必须先启用 pg_stat_statements 扩展程序。

  1. 启用 pg_stat_statements 扩展程序:
    CREATE EXTENSION pg_stat_statements;
    
  2. 运行要查看其统计信息的查询。您可以手动执行此操作,也可以等待足够的时间,以便您的应用在启用 pg_stat_statements 的情况下运行这些查询。
  3. 查询 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                             │
    └─────────────────────┴───────────────────────────────┘
    

在 Web 界面中查看列式查询统计信息

启用 pg_stat_statements 扩展程序后,您还可以在 AlloyDB Omni Web 用户界面中检查列式查询执行统计信息:

  1. 连接到 Web 界面,然后选择您的集群。
  2. 在导航菜单中,点击列式引擎。
  3. 在列式查询表中,查看使用列存储区的分析查询的执行统计信息:
    • 查询 ID:经过排查的查询的标识符。
    • 查询:经过清理的 SQL 语句文本,其中常量值已替换为占位符。
    • 调用次数:查询执行的次数。
    • 平均提取行数:每次执行返回的平均行数。
    • 平均延迟时间:查询的平均执行延迟时间。
    • 最长延迟时间:为查询记录的最长执行延迟时间。
    • 列式单元读取数:从列式存储区读取的列式单元数。
    • 读取的页面数:执行期间读取的页面数。

查看列存储区内存用量

如需查看列式引擎可使用而未使用的 RAM 量,您可以查询 google_columnar_engine_memory_available 函数。输出整数显示可用内存(以兆字节 [MB] 为单位)。

SELECT google_columnar_engine_memory_available();

在 Web 界面中查看列存储区内存大小和设置

您还可以在 AlloyDB Omni Web 界面中查看列存储区内存消耗和配置设置:

  1. 连接到 Web 界面,然后选择您的集群。
  2. 在导航菜单中,点击列式引擎。
  3. 查看列式存储区设置部分,其中会显示以下状态和内存指标:
    • 列式引擎:指示列式引擎是否处于活跃状态(例如 Enabled)。
    • 内存大小:显示已使用的列存储区内存量占已分配的列式内存总量的比例(例如 2.0 MB used of 1024.0 MB)。
    • 自动列式处理:指示是否启用了自动列式处理(例如 Enabled)。
    • 运行频率:显示自动列式处理运行的时间间隔(例如 Every 5 minutes)。
    • 列式扫描:指示是否启用了列式扫描执行(例如 Enabled)。

查看列式引擎存储缓存

如需查看和监控有关列式引擎存储缓存的数据,您可以使用以下命令:

命令 说明
SELECT google_columnar_engine_storage_cache_used(); 返回已使用的列式引擎存储缓存的大小。
SELECT google_columnar_engine_storage_cache_available(); 返回未使用的列式引擎存储缓存的大小。
SHOW google_columnar_engine.storage_cache_size; 返回列式引擎的存储缓存的配置大小总量。