我在 PostgreSQL 上有一个数据库,其中包含一些非常大的表(包含事件和事件度量)。对于测量的日期范围和一种事件类型,我想使用 Invantive SQL 计算平均持续时间。
事件(简化后,大约 5 GB):
- 编号
- 类型代码
event_measurements,大约 50 GB:
- 事件编号
- 开始
- 结束
当我运行类似
的查询时select avg(ended - started)
from events
join event_measurements on events.id = event_measurements.event_id
where events.type_code = '...'
它会运行数小时,消耗 GB 的内存。
需要的索引都已经到位,包括外键索引。
从 session I/O 中,我看到 Invantive SQL 首先下载详细信息并在客户端执行分组。这对于小卷来说很好,但在这种情况下,我希望有更多的 native 性能,比如这样的查询需要 5 分钟。
周围的查询需要 Invantive SQL,因此不能在数据库上“强制使用 native SQL”开关。
如何在不切换到“强制原生 SQL”的情况下提高此查询的性能?
最佳答案
除了按照@GordonLinoff 的建议创建 View ,您还可以使用:
local log on
在各个语句之间切换连接,以及插入 nativeplatformrequests(payload_text) 值 ('select avg...')
以绕过 Invantive SQL。这就像 Oracle 上的EXECUTE IMMEDIATE
。
关于postgresql - 调整慢速分组函数 Invantive SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46155039/