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: 只读参数
相关推荐
航Hang*2 小时前
第3章:复习篇——第1节:创建和管理数据库
开发语言·数据库·笔记·sql·sqlserver
铉铉这波能秀2 小时前
正则表达式从入门到精通(字符串模式匹配)
java·数据库·python·sql·正则表达式·模式匹配·表格处理
sc.溯琛2 小时前
MySQL 进阶实验:数据库与数据表管理完全指南
数据库·oracle
好记忆不如烂笔头abc2 小时前
oracle迁移到sqlserver的注意点
数据库·oracle·sqlserver
YJlio2 小时前
ZoomIt 学习笔记(11.11):休息计时器与演讲节奏控制——倒计时、番茄钟与现场掌控力
数据库·笔记·学习
sc.溯琛2 小时前
MySQL 性能优化核心:索引创建与管理实战指南
数据库·mysql·性能优化
锋君2 小时前
Orcale数据库在Asp.Net Core环境下使用EF Core 生成实体
数据库·后端·oracle·asp.net
啊吧怪不啊吧2 小时前
SQL之用户管理——权限与用户
大数据·数据库·sql
VX:Fegn08952 小时前
计算机毕业设计|基于springboot + vue电影院购票管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计