本页介绍了如何监控列式引擎的利用率。
使用 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
使用 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
视图,查看有关表或包含列存储区中列的具体化视图的信息。
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
的 null 值表示统计信息是在创建扩展程序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();