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