PostgreSQL 执行计划控制参数详解

一、参数作用范围

1. 会话级参数(Session-level)

sql 复制代码
-- 只影响当前会话/连接
SET enable_seqscan = off;  -- 当前会话生效

-- 在事务中,使用 SET LOCAL 只影响当前事务
BEGIN;
SET LOCAL enable_seqscan = off;
-- ... 执行查询 ...
COMMIT;  -- 事务结束后恢复原设置

2. 数据库级参数

sql 复制代码
-- 影响整个数据库(需要超级用户)
ALTER DATABASE your_db_name SET enable_seqscan = off;

-- 查看数据库特定设置
SELECT datname, setconfig 
FROM pg_database 
WHERE datname = 'your_db_name';

3. 用户级参数

sql 复制代码
-- 影响特定用户的所有会话
ALTER USER your_username SET enable_seqscan = off;

-- 查看用户特定设置
SELECT usename, useconfig 
FROM pg_user 
WHERE usename = 'your_username';

4. 全局参数

sql 复制代码
-- 修改 postgresql.conf 并重启
-- 或者使用 ALTER SYSTEM(需要超级用户)
ALTER SYSTEM SET enable_seqscan = off;
SELECT pg_reload_conf();  -- 重载配置,部分参数立即生效

二、主要执行计划控制参数

扫描方法控制

参数 默认值 功能描述 全局/会话
enable_seqscan on 启用顺序扫描(全表扫描) 会话级
enable_indexscan on 启用索引扫描 会话级
enable_indexonlyscan on 启用仅索引扫描 会话级
enable_bitmapscan on 启用位图扫描 会话级
enable_tidscan on 启用TID扫描(按行号) 会话级

连接方法控制

参数 默认值 功能描述 全局/会话
enable_nestloop on 启用嵌套循环连接 会话级
enable_mergejoin on 启用合并连接 会话级
enable_hashjoin on 启用哈希连接 会话级

其他计划控制

参数 默认值 功能描述 全局/会话
enable_sort on 启用显式排序 会话级
enable_material on 启用物化 会话级
enable_incremental_sort on 启用增量排序 会话级
enable_gathermerge on 启用聚集合并 会话级
enable_partitionwise_join on 启用分区智能连接 会话级
enable_partitionwise_aggregate on 启用分区智能聚合 会话级
enable_parallel_append on 启用并行追加 会话级
enable_parallel_hash on 启用并行哈希 会话级

并行查询控制

参数 默认值 功能描述 全局/会话
max_parallel_workers_per_gather 2 每个Gather节点的最大并行工作进程数 会话级
max_parallel_workers 8 系统最大并行工作进程数 全局级
parallel_leader_participation on 并行查询中leader进程是否参与工作 会话级
enable_partition_pruning on 启用分区裁剪 会话级

三、详细功能说明

1. 扫描方法参数

sql 复制代码
-- 禁用全表扫描,强制使用索引
SET enable_seqscan = off;
EXPLAIN SELECT * FROM users WHERE age > 30;

-- 禁用索引扫描,强制全表扫描
SET enable_indexscan = off;
SET enable_bitmapscan = off;
EXPLAIN SELECT * FROM users WHERE age > 30;

-- 仅索引扫描(覆盖索引)
SET enable_indexonlyscan = off;
EXPLAIN SELECT id FROM users WHERE id > 100;  -- 使用覆盖索引

2. 连接方法参数

sql 复制代码
-- 强制使用嵌套循环连接(适合小表驱动)
SET enable_hashjoin = off;
SET enable_mergejoin = off;
SET enable_nestloop = on;
EXPLAIN SELECT * FROM small_table s JOIN large_table l ON s.id = l.id;

-- 强制使用哈希连接(适合无索引的大表连接)
SET enable_nestloop = off;
SET enable_mergejoin = off;
SET enable_hashjoin = on;
EXPLAIN SELECT * FROM table1 JOIN table2 ON table1.id = table2.id;

-- 强制使用合并连接(适合已排序的数据)
SET enable_nestloop = off;
SET enable_hashjoin = off;
SET enable_mergejoin = on;
EXPLAIN SELECT * FROM table1 JOIN table2 ON table1.id = table2.id;

3. 排序和物化参数

sql 复制代码
-- 禁用显式排序(可能导致哈希连接使用更多内存)
SET enable_sort = off;
EXPLAIN SELECT * FROM users ORDER BY name;

-- 禁用物化(可能影响子查询性能)
SET enable_material = off;
EXPLAIN SELECT * FROM (SELECT * FROM users WHERE age > 30) AS subquery;

4. 并行查询参数

sql 复制代码
-- 增加并行度
SET max_parallel_workers_per_gather = 4;
SET max_parallel_workers = 16;

-- 禁用并行查询
SET max_parallel_workers_per_gather = 0;
SET enable_parallel_hash = off;

-- leader进程不参与工作(释放更多CPU)
SET parallel_leader_participation = off;

四、代价参数调整(影响优化器选择)

重要代价参数

参数 默认值 功能描述 推荐调整场景
seq_page_cost 1.0 顺序扫描读取一页的代价 SSD盘可调低
random_page_cost 4.0 随机读取一页的代价 SSD盘可调低至1.1-1.5
cpu_tuple_cost 0.01 处理一个元组的CPU代价 CPU密集型查询
cpu_index_tuple_cost 0.005 处理一个索引元组的CPU代价 索引扫描优化
cpu_operator_cost 0.0025 执行一个操作的CPU代价 复杂表达式
effective_cache_size 4GB 估计可用于缓存的磁盘页数 根据实际内存调整

调整示例

sql 复制代码
-- 针对SSD优化(随机读代价降低)
SET random_page_cost = 1.1;
SET seq_page_cost = 1.0;

-- 针对内存数据库优化
SET random_page_cost = 1.0;
SET seq_page_cost = 1.0;
SET effective_cache_size = '8GB';

-- 鼓励使用索引(降低索引扫描代价)
SET cpu_index_tuple_cost = 0.0025;
SET random_page_cost = 2.0;  -- 相对提高随机读代价

五、查看当前参数设置

1. 查看所有参数

sql 复制代码
-- 查看所有参数及其来源
SELECT name, setting, unit, source, sourcefile, sourceline
FROM pg_settings
WHERE name LIKE 'enable_%' 
   OR name LIKE '%cost%'
   OR name LIKE 'max_parallel%'
ORDER BY name;

-- 查看会话级设置
SELECT name, setting, pending_restart
FROM pg_settings
WHERE source = 'session';  -- 会话级修改

2. 查看参数作用域

sql 复制代码
-- 查看参数上下文(决定在哪里设置)
SELECT name, context, vartype, min_val, max_val
FROM pg_settings
WHERE name IN (
    'enable_seqscan', 'enable_indexscan', 
    'random_page_cost', 'work_mem'
);

-- context 含义:
-- postmaster: 需要重启
-- sighup: 需要重新加载配置
-- backend: 每个后端可以单独设置
-- user: 用户可随时修改
-- superuser: 需要超级用户权限
-- internal: 只读参数
相关推荐
全栈老石2 小时前
拆解低代码引擎核心:元数据驱动的"万能表"架构
数据库·低代码
倔强的石头_21 小时前
kingbase备份与恢复实战(二)—— sys_dump库级逻辑备份与恢复(Windows详细步骤)
数据库
jiayou642 天前
KingbaseES 实战:深度解析数据库对象访问权限管理
数据库
李广坤3 天前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
爱可生开源社区4 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
随逸1774 天前
《从零搭建NestJS项目》
数据库·typescript
加号35 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
シ風箏5 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
李慕婉学姐5 天前
Springboot智慧社区系统设计与开发6n99s526(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
百锦再5 天前
Django实现接口token检测的实现方案
数据库·python·django·sqlite·flask·fastapi·pip