我在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的内部存储器。
必要的索引都已到位,包括外键索引。
从会话I / O中,我发现Invantive SQL首先下载详细信息并在客户端上执行分组。对于小卷来说这很好,但在这种情况下,我希望有更多的本机性能,例如5分钟来进行这样的查询。
周围的查询需要Invantive SQL,所以"强制原生SQL"开启数据库不是一种选择。
如何在不切换到"强制原生SQL"?
的情况下,如何提高此查询的性能答案 0 :(得分:0)
除了按照@GordonLinoff的建议创建视图外,您还可以使用:
local log on
切换各个语句之间的连接,insert into nativeplatformrequests(payload_text) values ( 'select avg...')
绕过Invantive SQL。它就像Oracle上的EXECUTE IMMEDIATE
。