enable_presorted_aggregate 是一个 配置参数,用于确定规划器是否会生成一个计划,该计划将为查询的 ORDER BY / DISTINCT 聚合函数提供必需的预排序行。
enable_presorted_aggregate 于 PostgreSQL 16 中引入。
默认值
enable_presorted_aggregate 的默认值为:on。
用法
在 PostgreSQL 16 中,提交 1349d279 改进了 ORDER BY / DISTINCT 聚合的性能。但在某些情况下,这可能导致规划器生成比以前效率较低的计划,因此 enable_presorted_aggregate 可用于恢复 PostgreSQL 15 及更早版本的行为。
按 PostgreSQL 版本详细信息
enable_presorted_aggregate (PostgreSQL 19)
| 设置 | 开启 |
| 单位 | |
| 类别 | 查询调优 / 规划器方法配置 |
| 简短描述 | 启用规划器生成为 ORDER BY / DISTINCT 聚合函数提供预排序输入的计划的能力。 |
| 扩展描述 | 允许查询规划器构建为带有 ORDER BY / DISTINCT 子句的聚合函数提供预排序输入的计划。禁用时,会在执行期间始终执行隐式排序。 |
| 上下文 | user |
| 变量类型 | bool |
| 来源 | 默认 |
| 最小值 | |
| 最大值 | |
| 枚举值 | |
| 启动值 | 开启 |
| 重置值 | 开启 |
| 源文件 | |
| 源行 | |
| 需要重启 | false |
enable_presorted_aggregate (PostgreSQL 18)
| 设置 | 开启 |
| 单位 | |
| 类别 | 查询调优 / 规划器方法配置 |
| 简短描述 | 启用规划器生成为 ORDER BY / DISTINCT 聚合函数提供预排序输入的计划的能力。 |
| 扩展描述 | 允许查询规划器构建为带有 ORDER BY / DISTINCT 子句的聚合函数提供预排序输入的计划。禁用时,会在执行期间始终执行隐式排序。 |
| 上下文 | user |
| 变量类型 | bool |
| 来源 | 默认 |
| 最小值 | |
| 最大值 | |
| 枚举值 | |
| 启动值 | 开启 |
| 重置值 | 开启 |
| 源文件 | |
| 源行 | |
| 需要重启 | false |
enable_presorted_aggregate (PostgreSQL 17)
| 设置 | 开启 |
| 单位 | |
| 类别 | 查询调优 / 规划器方法配置 |
| 简短描述 | 启用规划器生成为 ORDER BY / DISTINCT 聚合函数提供预排序输入的计划的能力。 |
| 扩展描述 | 允许查询规划器构建为带有 ORDER BY / DISTINCT 子句的聚合函数提供预排序输入的计划。禁用时,会在执行期间始终执行隐式排序。 |
| 上下文 | user |
| 变量类型 | bool |
| 来源 | 默认 |
| 最小值 | |
| 最大值 | |
| 枚举值 | |
| 启动值 | 开启 |
| 重置值 | 开启 |
| 源文件 | |
| 源行 | |
| 需要重启 | false |
enable_presorted_aggregate (PostgreSQL 16)
| 设置 | 开启 |
| 单位 | |
| 类别 | 查询调优 / 规划器方法配置 |
| 简短描述 | 启用规划器生成为 ORDER BY / DISTINCT 聚合函数提供预排序输入的计划的能力。 |
| 扩展描述 | 允许查询规划器构建为带有 ORDER BY / DISTINCT 子句的聚合函数提供预排序输入的计划。禁用时,会在执行期间始终执行隐式排序。 |
| 上下文 | user |
| 变量类型 | bool |
| 来源 | 默认 |
| 最小值 | |
| 最大值 | |
| 枚举值 | |
| 启动值 | 开启 |
| 重置值 | 开启 |
| 源文件 | |
| 源行 | |
| 需要重启 | false |
变更历史
- PostgreSQL 16
- 添加(提交 3226f472)
示例
使用 PostgreSQL 回归测试中的 tenk1 表,在 PostgreSQL 16 中,如下查询默认会生成一个带有排序键的计划。
postgres=# EXPLAIN (COSTS off) SELECT SUM(two ORDER BY two), MAX(four ORDER BY four), MIN(four ORDER BY four), MAX(two ORDER BY two) FROM tenk1; QUERY PLAN ------------------------------- Aggregate -> Sort Sort Key: two -> Seq Scan on tenk1 (4 rows)
将 enable_presorted_aggregate 设置为 off 将恢复 PostgreSQL 15 及更早版本中的行为。
postgres=# SET enable_presorted_aggregate TO off;
SET
postgres=# EXPLAIN (COSTS off)
SELECT SUM(two ORDER BY two),
MAX(four ORDER BY four),
MIN(four ORDER BY four),
MAX(two ORDER BY two)
FROM tenk1;
QUERY PLAN
-------------------------
Aggregate
-> Seq Scan on tenk1
(2 rows)
参考资料
- PostgreSQL 文档: enable_presorted_aggregate
