更新时间: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所示。

表1 Seq Scan算子输出信息

信息名称

含义

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所示。

表2 Seq Scan算子输出信息

信息名称

含义

Seq Scan

算子的名称。

Filter

该算子的过滤谓词,示例中的过滤条件为c1列的值小于等于80000。在查询执行时,满足这些条件的行会被包含在最终的结果集中。