pg_hint_plan

添加强制指定执行计划的能力

概览

扩展包名版本分类许可证语言
pg_hint_plan1.8.0FEATBSD 3-ClauseC
ID扩展名BinLibLoadCreateTrustReloc模式
2780pg_hint_planhint_plan
相关扩展pg_show_plans pg_store_plans pg_stat_statements hypopg pg_qualstats auto_explain index_advisor pg_profile

版本

类型仓库版本PG 大版本包名依赖
EXTPGDG1.8.01817161514pg_hint_plan-
RPMPGDG1.8.01817161514pg_hint_plan_$v-
DEBPGDG1.8.01817161514postgresql-$v-pg-hint-plan-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
PGDG 1.8.0
PGDG 1.7.1
PGDG 1.6.2
PGDG 1.5.3
PGDG 1.4.4
d12.aarch64
PGDG 1.8.0
PGDG 1.7.1
PGDG 1.6.2
PGDG 1.5.3
PGDG 1.4.4
d13.x86_64
PGDG 1.8.0
PGDG 1.7.1
PGDG 1.6.2
PGDG 1.5.3
PGDG 1.4.4
d13.aarch64
PGDG 1.8.0
PGDG 1.7.1
PGDG 1.6.2
PGDG 1.5.3
PGDG 1.4.4
u22.x86_64
PGDG 1.8.0
PGDG 1.7.1
PGDG 1.6.2
PGDG 1.5.3
PGDG 1.4.4
u22.aarch64
PGDG 1.8.0
PGDG 1.7.1
PGDG 1.6.2
PGDG 1.5.3
PGDG 1.4.4
u24.x86_64
PGDG 1.8.0
PGDG 1.7.1
PGDG 1.6.2
PGDG 1.5.3
PGDG 1.4.4
u24.aarch64
PGDG 1.8.0
PGDG 1.7.1
PGDG 1.6.2
PGDG 1.5.3
PGDG 1.4.4

安装

您可以直接安装 pg_hint_plan 扩展包的预置二进制包,首先确保 PGDG 仓库已经添加并启用:

pig repo add pgdg -u          # 添加 PGDG 仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pg_hint_plan;          # 当前活跃 PG 版本安装
pig ext install -y pg_hint_plan -v 18  # PG 18
pig ext install -y pg_hint_plan -v 17  # PG 17
pig ext install -y pg_hint_plan -v 16  # PG 16
pig ext install -y pg_hint_plan -v 15  # PG 15
pig ext install -y pg_hint_plan -v 14  # PG 14
dnf install -y pg_hint_plan_18       # PG 18
dnf install -y pg_hint_plan_17       # PG 17
dnf install -y pg_hint_plan_16       # PG 16
dnf install -y pg_hint_plan_15       # PG 15
dnf install -y pg_hint_plan_14       # PG 14
apt install -y postgresql-18-pg-hint-plan   # PG 18
apt install -y postgresql-17-pg-hint-plan   # PG 17
apt install -y postgresql-16-pg-hint-plan   # PG 16
apt install -y postgresql-15-pg-hint-plan   # PG 15
apt install -y postgresql-14-pg-hint-plan   # PG 14

预加载配置

shared_preload_libraries = 'pg_hint_plan';

创建扩展

CREATE EXTENSION pg_hint_plan;

用法

pg_hint_plan: 赋予 PostgreSQL 手动干预执行计划的能力

pg_hint_plan 通过 SQL 注释提示覆盖 PostgreSQL 查询规划器的决策,允许你强制指定扫描方法、连接策略和连接顺序。

提示语法

提示嵌入在以 /*+ 开头、*/ 结尾的 SQL 注释中:

/*+
  HashJoin(a b)
  SeqScan(a)
*/
SELECT *
FROM pgbench_branches b
JOIN pgbench_accounts a ON b.bid = a.bid
ORDER BY a.aid;

扫描方法提示

提示描述
SeqScan(table)强制顺序扫描
IndexScan(table [index...])强制索引扫描(可选限定特定索引)
IndexOnlyScan(table [index...])强制仅索引扫描
BitmapScan(table [index...])强制位图扫描
TidScan(table)强制 TID 扫描
NoSeqScan(table)禁止顺序扫描
NoIndexScan(table)禁止索引扫描和仅索引扫描
NoIndexOnlyScan(table)禁止仅索引扫描
NoBitmapScan(table)禁止位图扫描
NoTidScan(table)禁止 TID 扫描
IndexScanRegexp(table [regexp...])使用正则表达式匹配索引名的强制索引扫描
DisableIndex(table index...)在规划期间禁用特定索引

连接方法提示

提示描述
NestLoop(t1 t2 [t3...])强制嵌套循环连接
HashJoin(t1 t2 [t3...])强制哈希连接
MergeJoin(t1 t2 [t3...])强制归并连接
NoNestLoop(t1 t2 [t3...])禁止嵌套循环连接
NoHashJoin(t1 t2 [t3...])禁止哈希连接
NoMergeJoin(t1 t2 [t3...])禁止归并连接
Memoize(t1 t2 [t3...])允许缓存内层结果
NoMemoize(t1 t2 [t3...])禁止缓存

连接顺序提示

-- 简单的左深连接顺序
/*+ Leading(a b c) */

-- 带嵌套的显式连接树
/*+ Leading((a (b c))) */

行数修正

/*+ Rows(a b #100) */    -- 设置为绝对数量
/*+ Rows(a b +100) */    -- 增加估计值
/*+ Rows(a b -100) */    -- 减少估计值
/*+ Rows(a b *2.0) */    -- 倍乘估计值

并行查询控制

/*+ Parallel(table 4 hard) */   -- 强制 4 个并行工作进程
/*+ Parallel(table 0 hard) */   -- 禁用并行

GUC 参数覆盖

/*+ Set(random_page_cost 1.0) Set(seq_page_cost 1.0) */
SELECT * FROM my_table WHERE id = 42;

GUC 配置

参数描述默认值
pg_hint_plan.enable_hint全局启用或禁用提示on
pg_hint_plan.enable_hint_table启用基于查询的提示表off
pg_hint_plan.debug_print打印已应用提示的调试信息off
pg_hint_plan.parse_messages提示解析消息的日志级别INFO
pg_hint_plan.message_level调试消息的日志级别LOG

最后修改 2026-03-14: update extension metadata (953cbd0)