pg_hint_plan
1. 概述
pg_hint_plan 是一个扩展,允许通过 SQL 注释中的 hints 来控制 PostgreSQL/IvorySQL 的执行计划。它能够在不修改 SQL 逻辑的情况下优化查询性能,在 PostgreSQL 和 Oracle 兼容模式下均可正常工作。
2. 安装
| 源码安装环境为 Ubuntu 24.04(x86_64),环境中已经安装了IvorySQL 5及以上版本,安装路径为/usr/ivory-5 |
2.1. 源码安装
# 克隆 PG18 分支源码 git clone --branch PG18 https://github.com/ossc-db/pg_hint_plan.git cd pg_hint_plan # 编译安装插件 make PG_CONFIG=/usr/ivory-5/bin/pg_config make PG_CONFIG=/usr/ivory-5/bin/pg_config install
3. Hint 类型
pg_hint_plan 提供了多种类型的 hints 来控制查询执行计划的不同方面。
3.1. 扫描方法 Hints
指定表扫描方法的 hints:
-
SeqScan(table)- 顺序扫描 -
IndexScan(table[ index])- 索引扫描,可指定索引名 -
BitmapScan(table[ index])- 位图扫描,可指定索引名 -
TidScan(table)- TID 扫描
否定形式的 hints(禁止使用某种扫描方法):
-
NoSeqScan(table) -
NoIndexScan(table) -
NoBitmapScan(table) -
NoTidScan(table)
3.2. 连接方法 Hints
指定表连接方法的 hints:
-
HashJoin(table table[ table…])- 哈希连接 -
NestedLoop(table table[ table…])- 嵌套循环连接 -
MergeJoin(table table[ table…])- 合并连接
否定形式的 hints:
-
NoHashJoin(table table) -
NoNestedLoop(table table) -
NoMergeJoin(table table)
4. 使用示例
4.1. 基本用法示例
使用 HashJoin 和 SeqScan hints:
postgres=# /*+ HashJoin(a b) SeqScan(a) */ EXPLAIN SELECT * FROM pgbench_branches b JOIN pgbench_accounts a ON b.bid = a.bid ORDER BY a.aid;
4.2. 复杂多 Hint 示例
组合使用多个 hints 来控制复杂查询的执行计划:
postgres=# /*+ NestedLoop(t1 t2) IndexScan(t2 t2_pkey) MergeJoin(t1 t2 t3) Leading(t1 t2 t3) */ EXPLAIN SELECT * FROM table1 t1 JOIN table2 t2 ON t1.id = t2.id JOIN table3 t3 ON t2.id = t3.id;
5. Hint 表(可选功能)
pg_hint_plan 提供了一个可选的 hint 表功能,可以在表中持久化存储 hints。