更新时间:2025-03-13 GMT+08:00
Seq Scan
算子说明
Seq Scan算子是所有扫描算子中具有普适性的一种,这个算子本质上的原理为对表按某个方向(前向/后向)进行顺序扫描,然后返回符合筛选条件的所有行。
典型场景
- 表无索引,需要对表进行扫描操作。
- 表有索引,但需要对表大部分数据进行扫描操作。
示例
示例1:表无索引,需要对表进行扫描操作。
--数据准备。 gaussdb=# DROP TABLE IF EXISTS t1; gaussdb=# CREATE TABLE t1 (c1 number, c2 number, c3 number); CREATE TABLE gaussdb=# INSERT INTO t1 VALUES(generate_series(1,100), 2, 3); INSERT 0 100 -- 执行结果。 gaussdb=# EXPLAIN SELECT * FROM t1 WHERE c1 = 2; QUERY PLAN -------------------------------------------------------------- Streaming (type: GATHER) (cost=0.06..13.26 rows=1 width=96) Node/s: datanode1 -> Seq Scan on t1 (cost=0.00..13.16 rows=1 width=96) Filter: (c1 = 2::numeric) (4 rows) --删除表。 gaussdb=# DROP TABLE t1;
上述示例中,Seq Scan算子输出信息如表1所示。
信息名称 |
含义 |
---|---|
Seq Scan |
算子的名称。 |
Filter |
该算子的过滤谓词,示例中的过滤条件为c1列的值等于2。在查询执行时,满足这些条件的行会被包含在最终的结果集中。 |
示例2:表有索引,但需要对表大部分数据进行扫描操作。
--数据准备。 gaussdb=# DROP TABLE IF EXISTS t1; gaussdb=# CREATE TABLE t1(c1 number, c2 number, c3 number); CREATE TABLE gaussdb=# CREATE INDEX idx_c1 on t1(c1); CREATE INDEX gaussdb=# INSERT INTO t1 VALUES(generate_series(1, 100000), 2, 3); INSERT 0 100000 --收集统计信息。 gaussdb=# ANALYZE t1; --执行结果。 gaussdb=# EXPLAIN SELECT * FROM t1 WHERE c1 <= 80000; QUERY PLAN -------------------------------------------------------------------- Streaming (type: GATHER) (cost=4.00..4698.38 rows=80136 width=16) Node/s: All datanodes -> Seq Scan on t1 (cost=0.00..942.00 rows=80136 width=16) Filter: (c1 <= 80000::numeric) (4 rows) --删除表。 gaussdb=# DROP TABLE t1;
上述示例中,Seq Scan算子输出信息如表2所示。
父主题: 表访问方式