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 17)
设置 | on |
单位 | |
类别 | 查询调整/计划程序方法配置 |
简短描述 | 启用计划程序生成计划的能力,这些计划为 ORDER BY / DISTINCT 聚合函数提供预排序的输入。 |
额外描述 | 允许查询计划程序构建计划,这些计划为带有 ORDER BY / DISTINCT 子句的聚合函数提供预排序的输入。禁用后,隐式排序始终在执行期间执行。 |
上下文 | 用户 |
变量类型 | bool |
来源 | 默认 |
最小值 | |
最大值 | |
枚举值 | |
引导值 | on |
重置值 | on |
源文件 | |
源代码行号 | |
待重启 | false |
enable_presorted_aggregate (PostgreSQL 16)
设置 | on |
单位 | |
类别 | 查询调整/计划程序方法配置 |
简短描述 | 启用计划程序生成计划的能力,这些计划为 ORDER BY / DISTINCT 聚合函数提供预排序的输入。 |
额外描述 | 允许查询计划程序构建计划,这些计划为带有 ORDER BY / DISTINCT 子句的聚合函数提供预排序的输入。禁用后,隐式排序始终在执行期间执行。 |
上下文 | 用户 |
变量类型 | bool |
来源 | 默认 |
最小值 | |
最大值 | |
枚举值 | |
引导值 | on |
重置值 | on |
源文件 | |
源代码行号 | |
待重启 | 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