STL_SCAN
分析查询的表扫描步骤。此表中行的步骤数始终为 0,因为扫描是分段中的第一步。
STL_SCAN 对所有用户可见。超级用户可以查看所有行;普通用户只能查看其自己的数据。有关更多信息,请参阅 系统表和视图中的数据可见性。
注意
STL_SCAN 仅包含在主集群上运行的查询。它不包含在并发扩展集群上运行的查询。要访问在主集群和并发扩展集群上运行的查询,我们建议您使用 SYS 监控视图 SYS_QUERY_DETAIL。SYS 监控视图中的数据经过格式化处理,便于使用和理解。
表列
列名称 | 数据类型 | 描述 |
---|---|---|
userid | integer | 生成该条目的用户 ID。 |
query | integer | 查询 ID。查询列可用于连接其他系统表和视图。 |
slice | integer | 标识运行查询所在切片的标识符。 |
segment | integer | 标识查询区段的数字。 |
step | integer | 运行的查询步骤。 |
starttime | 时间戳 | 查询开始的时间(采用 UTC 表示)。总时间包括排队和执行时间。秒的小数部分以 6 位精度表示。例如:2009-06-12 11:29:19.131358 。 |
endtime | 时间戳 | 查询完成的时间(采用 UTC 表示)。总时间包括排队和执行时间。秒的小数部分以 6 位精度表示。例如:2009-06-12 11:29:19.131358 。 |
tasknum | 整数 | 分配用于运行步骤的查询任务进程的数量。 |
rows | bigint | 处理的总行数。 |
bytes | bigint | 该步骤中所有输出行的大小(以字节为单位)。 |
fetches | bigint | 此信息仅供内部使用。 |
type | integer | 扫描类型的 ID。有关有效值的列表,请参阅下表。 |
tbl | integer | 表 ID。 |
is_rrscan | character(1) | 如果为 true (t),则表示对步骤使用了限制范围的扫描。 |
is_delayed_scan | character(1) | 此信息仅供内部使用。 |
rows_pre_filter | bigint | 对于永久表的扫描,这是在筛选标记为删除的行(虚影行)之前和应用用户定义的查询筛选条件之前发出的行的总数。 |
rows_pre_user_filter | bigint | 对于永久表的扫描,这是在筛选标记为删除的行(虚影行)之后但在应用用户定义的查询筛选条件之前处理的行的数量。 |
perm_table_name | character(136) | 对于永久表的扫描,这是扫描的表的名称。 |
is_rlf_scan | character(1) | 如果为 true (t),则表示对步骤使用了行级别筛选。 |
is_rlf_scan_reason | integer | 此信息仅供内部使用。 |
num_em_blocks | integer | 此信息仅供内部使用。 |
checksum | bigint | 此信息仅供内部使用。 |
runtime_filtering | character(1) | 如果为 true (t),则表示应用了运行时筛选器。 |
scan_region | 整数 | 此信息仅供内部使用。 |
num_sortkey_as_predicate | 整数 | 此信息仅供内部使用。 |
row_fetcher_state | 整数 | 此信息仅供内部使用。 |
consumed_scan_ranges | bigint | 此信息仅供内部使用。 |
work_stealing_reason | bigint | 此信息仅供内部使用。 |
is_vectorized_scan | character(1) | 此信息仅供内部使用。 |
is_vectorized_scan_reason | 整数 | 此信息仅供内部使用。 |
row_fetcher_reason | bigint | 此信息仅供内部使用。 |
topology_signature | bigint | 此信息仅供内部使用。 |
use_tpm_partition | character(1) | 此信息仅供内部使用。 |
is_rrscan_expr | character(1) | 此信息仅供内部使用。 |
scanned_mega_value | character(1) | 此信息仅供内部使用。此信息显示给定的扫描步骤是否扫描了大值。大值将存储在多个块中。原定设置情况下,块大小为 1 MB,大值大于原定设置中的 1 MB。 |
扫描类型
类型 ID | 描述 |
---|---|
1 | 网络中的数据。 |
2 | 压缩共享内存中的永久用户表。 |
3 | 临时行式表。 |
21 | 从 Amazon S3 加载文件。 |
22 | 从 Amazon DynamoDB 中加载表。 |
23 | 从远程 SSH 连接中加载数据。 |
24 | 从远程集群(已排序区域)中加载数据。这可用于调整大小。 |
25 | 从远程集群(未排序区域)中加载数据。这可用于调整大小。 |
28 | 在多个表上使用 UNION ALL 从时间序列视图读取数据。 |
29 | 从 Amazon S3 外部表中读取数据。 |
30 | 读取 Amazon S3 外部表的分区信息。 |
33 | 从远程 Postgres 表中读取数据。 |
36 | 从远程 MySQL 表中读取数据。 |
37 | 从远程 Kinesis 流中读取数据。 |
使用说明
理想情况下,rows
应相对接近于 rows_pre_filter
。rows
与 rows_pre_filter
之间的一个很大的区别是,它意味着执行引擎将要扫描稍后将被丢弃的行(这样做的效率较低)。rows_pre_filter
与 rows_pre_user_filter
之间的区别是扫描中虚影行的数量。运行 VACUUM 可移除标记为删除的行。rows
与 rows_pre_user_filter
之间的区别是查询筛选的行的数量。如果用户筛选器丢弃了大量行,则查看您选择的排序列,或者,如果这是由于大量未排序的区域造成的,请运行 vacuum。
示例查询
以下示例显示 rows_pre_filter
大于 rows_pre_user_filter
,因为该表已删除尚未真空化的行(虚影行)。
SELECT query, slice, segment,step,rows, rows_pre_filter, rows_pre_user_filter from stl_scan where query = pg_last_query_id(); query | slice | segment | step | rows | rows_pre_filter | rows_pre_user_filter -------+--------+---------+------+-------+-----------------+---------------------- 42915 | 0 | 0 | 0 | 43159 | 86318 | 43159 42915 | 0 | 1 | 0 | 1 | 0 | 0 42915 | 1 | 0 | 0 | 43091 | 86182 | 43091 42915 | 1 | 1 | 0 | 1 | 0 | 0 42915 | 2 | 0 | 0 | 42778 | 85556 | 42778 42915 | 2 | 1 | 0 | 1 | 0 | 0 42915 | 3 | 0 | 0 | 43428 | 86856 | 43428 42915 | 3 | 1 | 0 | 1 | 0 | 0 42915 | 10000 | 2 | 0 | 4 | 0 | 0 (9 rows)