【发布时间】:2021-07-01 12:58:42
【问题描述】:
我们制作了一个控制台应用程序,它将更新表 b 上的 y 列。在服务器上运行这个查询,它很慢,我不知道为什么。表 t 大小为 21 GB,表 l 大小为 13 GB。
SELECT DISTINCT a.x,
a.y
FROM a
JOIN b ON a.x = b.x
-- x is uuid that we use on both tables
WHERE b.y IS NULL
AND a.y IS NOT NULL
LIMIT 500;
到目前为止我尝试过的是;
-
像这样在两个表上使用 where 语句创建索引
创建索引 idx_name 在 b(x) 上 其中(y 为 NULL);
创建索引 idx_name 在 (x) 上 其中 (y IS NOT NULL);
-
使用 group_by 而不是 distinct
-
尝试将最小的表连接到更大的表
你能帮帮我吗?
谢谢。
【问题讨论】:
-
请edit您的问题并添加使用
explain (analyze, buffers, format text)生成的execution plan(不是只是一个“简单”解释)为formatted text,并确保保留计划的缩进。粘贴文本,然后将```放在计划前一行和计划后一行。 -
添加执行计划。根据您的描述:您似乎没有尝试实现
Index Only Scan。在CREATE INDEX中查找选项INCLUDE。我想CREATE INDEX idx_name on a(x) INCLUDE (y) WHERE (y IS NOT NULL)可以做到这一点 -
解释分析也花费了太多时间来返回结果 - 从 1 小时开始它仍在尝试
标签: postgresql query-optimization