enable_seqscan 是一个 配置参数,用于确定规划器是否应使用顺序扫描。
enable_seqscan 添加于 PostgreSQL 7.0。
默认值
enable_seqscan 的默认值为:on。
用法
如果设置为 off,规划器将不鼓励使用顺序扫描。
但是,完全禁用顺序扫描是不可能的,特别是当没有可用的或可行的替代扫描类型时。
按 PostgreSQL 版本详细信息
enable_seqscan (PostgreSQL 19)
| 设置 | 开启 |
| 单位 | |
| 类别 | 查询调优 / 规划器方法配置 |
| 简短描述 | 启用规划器使用顺序扫描计划。 |
| 扩展描述 | |
| 上下文 | user |
| 变量类型 | bool |
| 来源 | 默认 |
| 最小值 | |
| 最大值 | |
| 枚举值 | |
| 启动值 | 开启 |
| 重置值 | 开启 |
| 源文件 | |
| 源行 | |
| 需要重启 | false |
文档: enable_seqscan
enable_seqscan (PostgreSQL 18)
| 设置 | 开启 |
| 单位 | |
| 类别 | 查询调优 / 规划器方法配置 |
| 简短描述 | 启用规划器使用顺序扫描计划。 |
| 扩展描述 | |
| 上下文 | user |
| 变量类型 | bool |
| 来源 | 默认 |
| 最小值 | |
| 最大值 | |
| 枚举值 | |
| 启动值 | 开启 |
| 重置值 | 开启 |
| 源文件 | |
| 源行 | |
| 需要重启 | false |
文档: enable_seqscan
enable_seqscan (PostgreSQL 17)
| 设置 | 开启 |
| 单位 | |
| 类别 | 查询调优 / 规划器方法配置 |
| 简短描述 | 启用规划器使用顺序扫描计划。 |
| 扩展描述 | |
| 上下文 | user |
| 变量类型 | bool |
| 来源 | 默认 |
| 最小值 | |
| 最大值 | |
| 枚举值 | |
| 启动值 | 开启 |
| 重置值 | 开启 |
| 源文件 | |
| 源行 | |
| 需要重启 | false |
文档: enable_seqscan
enable_seqscan (PostgreSQL 16)
| 设置 | 开启 |
| 单位 | |
| 类别 | 查询调优 / 规划器方法配置 |
| 简短描述 | 启用规划器使用顺序扫描计划。 |
| 扩展描述 | |
| 上下文 | user |
| 变量类型 | bool |
| 来源 | 默认 |
| 最小值 | |
| 最大值 | |
| 枚举值 | |
| 启动值 | 开启 |
| 重置值 | 开启 |
| 源文件 | |
| 源行 | |
| 需要重启 | false |
文档: enable_seqscan
enable_seqscan (PostgreSQL 15)
| 设置 | 开启 |
| 单位 | |
| 类别 | 查询调优 / 规划器方法配置 |
| 简短描述 | 启用规划器使用顺序扫描计划。 |
| 扩展描述 | |
| 上下文 | user |
| 变量类型 | bool |
| 来源 | 默认 |
| 最小值 | |
| 最大值 | |
| 枚举值 | |
| 启动值 | 开启 |
| 重置值 | 开启 |
| 源文件 | |
| 源行 | |
| 需要重启 | false |
文档: enable_seqscan
enable_seqscan (PostgreSQL 14)
| 设置 | 开启 |
| 单位 | |
| 类别 | 查询调优 / 规划器方法配置 |
| 简短描述 | 启用规划器使用顺序扫描计划。 |
| 扩展描述 | |
| 上下文 | user |
| 变量类型 | bool |
| 来源 | 默认 |
| 最小值 | |
| 最大值 | |
| 枚举值 | |
| 启动值 | 开启 |
| 重置值 | 开启 |
| 源文件 | |
| 源行 | |
| 需要重启 | false |
文档: enable_seqscan
enable_seqscan (PostgreSQL 13)
| 设置 | 开启 |
| 单位 | |
| 类别 | 查询调优 / 规划器方法配置 |
| 简短描述 | 启用规划器使用顺序扫描计划。 |
| 扩展描述 | |
| 上下文 | user |
| 变量类型 | bool |
| 来源 | 默认 |
| 最小值 | |
| 最大值 | |
| 枚举值 | |
| 启动值 | 开启 |
| 重置值 | 开启 |
| 源文件 | |
| 源行 | |
| 需要重启 | false |
文档: enable_seqscan
enable_seqscan (PostgreSQL 12)
| 设置 | 开启 |
| 单位 | |
| 类别 | 查询调优 / 规划器方法配置 |
| 简短描述 | 启用规划器使用顺序扫描计划。 |
| 扩展描述 | |
| 上下文 | user |
| 变量类型 | bool |
| 来源 | 默认 |
| 最小值 | |
| 最大值 | |
| 枚举值 | |
| 启动值 | 开启 |
| 重置值 | 开启 |
| 源文件 | |
| 源行 | |
| 需要重启 | false |
文档: enable_seqscan
enable_seqscan (PostgreSQL 11)
| 设置 | 开启 |
| 单位 | |
| 类别 | 查询调优 / 规划器方法配置 |
| 简短描述 | 启用规划器使用顺序扫描计划。 |
| 扩展描述 | |
| 上下文 | user |
| 变量类型 | bool |
| 来源 | 默认 |
| 最小值 | |
| 最大值 | |
| 枚举值 | |
| 启动值 | 开启 |
| 重置值 | 开启 |
| 源文件 | |
| 源行 | |
| 需要重启 | false |
文档: enable_seqscan
enable_seqscan (PostgreSQL 10)
| 设置 | 开启 |
| 单位 | |
| 类别 | 查询调优 / 规划器方法配置 |
| 简短描述 | 启用规划器使用顺序扫描计划。 |
| 扩展描述 | |
| 上下文 | user |
| 变量类型 | bool |
| 来源 | 默认 |
| 最小值 | |
| 最大值 | |
| 枚举值 | |
| 启动值 | 开启 |
| 重置值 | 开启 |
| 源文件 | |
| 源行 | |
| 需要重启 | false |
文档: enable_seqscan
enable_seqscan (PostgreSQL 9.6)
| 设置 | 开启 |
| 单位 | |
| 类别 | 查询调优 / 规划器方法配置 |
| 简短描述 | 启用规划器使用顺序扫描计划。 |
| 扩展描述 | |
| 上下文 | user |
| 变量类型 | bool |
| 来源 | 默认 |
| 最小值 | |
| 最大值 | |
| 枚举值 | |
| 启动值 | 开启 |
| 重置值 | 开启 |
| 源文件 | |
| 源行 | |
| 需要重启 | false |
文档: enable_seqscan
enable_seqscan (PostgreSQL 9.5)
| 设置 | 开启 |
| 单位 | |
| 类别 | 查询调优 / 规划器方法配置 |
| 简短描述 | 启用规划器使用顺序扫描计划。 |
| 扩展描述 | |
| 上下文 | user |
| 变量类型 | bool |
| 来源 | 默认 |
| 最小值 | |
| 最大值 | |
| 枚举值 | |
| 启动值 | 开启 |
| 重置值 | 开启 |
| 源文件 | |
| 源行 | |
| 需要重启 | false |
文档: enable_seqscan
enable_seqscan (PostgreSQL 9.4)
| 设置 | 开启 |
| 单位 | |
| 类别 | 查询调优 / 规划器方法配置 |
| 简短描述 | 启用规划器使用顺序扫描计划。 |
| 扩展描述 | |
| 上下文 | user |
| 变量类型 | bool |
| 来源 | 默认 |
| 最小值 | |
| 最大值 | |
| 枚举值 | |
| 启动值 | 开启 |
| 重置值 | 开启 |
| 源文件 | |
| 源行 |
文档: enable_seqscan
enable_seqscan (PostgreSQL 9.3)
| 设置 | 开启 |
| 单位 | |
| 类别 | 查询调优 / 规划器方法配置 |
| 简短描述 | 启用规划器使用顺序扫描计划。 |
| 扩展描述 | |
| 上下文 | user |
| 变量类型 | bool |
| 来源 | 默认 |
| 最小值 | |
| 最大值 | |
| 枚举值 | |
| 启动值 | 开启 |
| 重置值 | 开启 |
| 源文件 | |
| 源行 |
文档: enable_seqscan
enable_seqscan (PostgreSQL 9.2)
| 设置 | 开启 |
| 单位 | |
| 类别 | 查询调优 / 规划器方法配置 |
| 简短描述 | 启用规划器使用顺序扫描计划。 |
| 扩展描述 | |
| 上下文 | user |
| 变量类型 | bool |
| 来源 | 默认 |
| 最小值 | |
| 最大值 | |
| 枚举值 | |
| 启动值 | 开启 |
| 重置值 | 开启 |
| 源文件 | |
| 源行 |
文档: enable_seqscan
enable_seqscan (PostgreSQL 9.1)
| 设置 | 开启 |
| 单位 | |
| 类别 | 查询调优 / 规划器方法配置 |
| 简短描述 | 启用规划器使用顺序扫描计划。 |
| 扩展描述 | |
| 上下文 | user |
| 变量类型 | bool |
| 来源 | 默认 |
| 最小值 | |
| 最大值 | |
| 枚举值 | |
| 启动值 | 开启 |
| 重置值 | 开启 |
| 源文件 | |
| 源行 |
文档: enable_seqscan
enable_seqscan (PostgreSQL 9.0)
| 设置 | 开启 |
| 单位 | |
| 类别 | 查询调优 / 规划器方法配置 |
| 简短描述 | 启用规划器使用顺序扫描计划。 |
| 扩展描述 | |
| 上下文 | user |
| 变量类型 | bool |
| 来源 | 默认 |
| 最小值 | |
| 最大值 | |
| 枚举值 | |
| 启动值 | 开启 |
| 重置值 | 开启 |
| 源文件 | |
| 源行 |
文档: enable_seqscan
enable_seqscan (PostgreSQL 8.4)
| 设置 | 开启 |
| 单位 | |
| 类别 | 查询调优 / 规划器方法配置 |
| 简短描述 | 启用规划器使用顺序扫描计划。 |
| 扩展描述 | |
| 上下文 | user |
| 变量类型 | bool |
| 来源 | 默认 |
| 最小值 | |
| 最大值 | |
| 枚举值 | |
| 启动值 | 开启 |
| 重置值 | 开启 |
| 源文件 | |
| 源行 |
文档: enable_seqscan
enable_seqscan (PostgreSQL 8.3)
| 设置 | |
| 单位 | |
| 类别 | 查询调优 / 规划器方法配置 |
| 简短描述 | 启用规划器使用顺序扫描计划。 |
| 扩展描述 | |
| 上下文 | user |
| 变量类型 | bool |
| 来源 | 默认 |
| 最小值 | |
| 最大值 |
文档: enable_seqscan
enable_seqscan (PostgreSQL 8.2)
| 设置 | |
| 单位 | |
| 类别 | 查询调优 / 规划器方法配置 |
| 简短描述 | 启用规划器使用顺序扫描计划。 |
| 扩展描述 | |
| 上下文 | user |
| 变量类型 | bool |
| 来源 | 默认 |
| 最小值 | |
| 最大值 |
文档: enable_seqscan
变更历史
- PostgreSQL 7.0
- 添加于 (提交 b1577a7c)
示例
给定以下(简单的)表
postgres=# CREATE TABLE foo (id INT) ; CREATE TABLE postgres=# INSERT INTO foo VALUES (generate_series(1,100)); INSERT 0 100 postgres=# ANALYZE foo; ANALYZE
具有低选择性的查询的典型计划将导致顺序扫描
postgres=# EXPLAIN ANALYZE SELECT * FROM foo WHERE id %2 = 1;
QUERY PLAN
----------------------------------------------------------------------------------------------
Seq Scan on foo (cost=0.00..2.50 rows=1 width=4) (actual time=0.029..0.062 rows=50 loops=1)
Filter: ((id % 2) = 1)
Rows Removed by Filter: 50
Planning Time: 0.278 ms
Execution Time: 0.105 ms
(5 rows)
将 enable_seqscan 设置为 off 不会阻止顺序扫描,但是成本估算将被人为地“膨胀”,以确保如果存在另一种可用计划类型,则会使用该计划。
postgres=# EXPLAIN ANALYZE SELECT * FROM foo WHERE id %2 = 1;
QUERY PLAN
------------------------------------------------------------------------------------------------------------------
Seq Scan on foo (cost=10000000000.00..10000000002.50 rows=1 width=4) (actual time=0.049..0.128 rows=50 loops=1)
Filter: ((id % 2) = 1)
Rows Removed by Filter: 50
Planning Time: 0.112 ms
Execution Time: 0.180 ms
(5 rows)
但是,如果出现可用的替代扫描方法(例如,通过添加索引),则将使用该方法
postgres=# CREATE INDEX foo_id ON foo(id);
CREATE INDEX
postgres=# ANALYZE foo;
ANALYZE
postgres=# EXPLAIN ANALYZE SELECT * FROM foo WHERE id %2 = 1;
QUERY PLAN
-------------------------------------------------------------------------------------------------------------------
Index Only Scan using foo_id on foo (cost=0.14..14.14 rows=1 width=4) (actual time=0.179..0.279 rows=50 loops=1)
Filter: ((id % 2) = 1)
Rows Removed by Filter: 50
Heap Fetches: 100
Planning Time: 0.181 ms
Execution Time: 0.378 ms
(6 rows)
即使规划器通常可能不使用它
postgres=# SET enable_seqscan = on;
SET
postgres=# EXPLAIN ANALYZE SELECT * FROM foo WHERE id %2 = 1;
QUERY PLAN
----------------------------------------------------------------------------------------------
Seq Scan on foo (cost=0.00..2.50 rows=1 width=4) (actual time=0.038..0.072 rows=50 loops=1)
Filter: ((id % 2) = 1)
Rows Removed by Filter: 50
Planning Time: 0.152 ms
Execution Time: 0.117 ms
(5 rows)
参考资料
- PostgreSQL 文档: enable_seqscan
反馈
在此处 提交有关“enable_seqscan”的任何评论、建议或更正。