【发布时间】:2021-06-11 23:53:05
【问题描述】:
我想在 Postgres 12 上执行查询期间缓存一个变量。我遵循了如下 CTE 的方法:
-- BEGIN PART 1
with cached_vars as (
select max(datetime) as datetime_threshold
from locations
where distance > 70
and user_id = 9087
)
-- END PART 1
-- BEGIN PART 2
select *
from locations
where user_id = 9087
and datetime > (select datetime_threshold from cached_vars)
-- END PART 2
运行上述查询会导致性能问题。我预计总运行时间大约等于(part1 runtime + part2 runtime),但它需要更长的时间。
值得注意的是,当我使用手动 datetime_threshold 仅运行第二部分时,没有性能问题。
locations表定义为:
id | user_id | datetime | location | distance | ...
-----------------------------------------------------
有没有办法将总运行时间减少到(part1 runtime + part2 runtime) 之类的东西?
【问题讨论】:
-
。 .我不明白你的问题。您的两个“性能估计”是同一个等式。
-
@partizaans 您是否考虑过使用临时表来保存第一次查询的日期?你可以试一试。请看我的回答。
-
为了获得最佳解决方案,请说明查询的目的。
distance > 70是常量过滤器吗?还有什么可变的?您需要SELECT *还是一小部分列就足够了?请按照此处的说明分享基本信息:stackoverflow.com/tags/postgresql-performance/info
标签: sql postgresql performance postgresql-performance