我正在使用类似于以下形式的 SQL 查询:
SELECT col1, col2
FROM table1
LEFT OUTER JOIN table2
ON table1.person_uid = table2.person_uid
AND table1.period = table2.period
它要么太慢,要么陷入僵局,因为它至少需要 4 分钟才能返回。如果我要把它改成这样:
SELECT col1, col2
FROM table1
LEFT OUTER JOIN table2
ON table1.person_uid = table2.person_uid
WHERE table1.period = table2.period
然后它工作正常(尽管没有返回正确的列数)。有没有办法加快这个速度?
更新 :如果我切换后一个查询的最后两行,它会做同样的事情:
SELECT col1, col2
FROM table1
LEFT OUTER JOIN table2
ON table1.period = table2.period
WHERE table1.person_uid = table2.person_uid
更新 2:这些实际上是我加入的观点。不幸的是,它们位于我无法控制的数据库上,因此我无法(轻松)对索引进行任何更改。我倾向于同意这是一个索引问题。我会等一会儿再接受答案,以防万一有一些我不知道的神奇方法来调整这个查询。否则,我将接受当前的答案之一,并尝试找出另一种方法来做我想做的事情。到目前为止,感谢大家的帮助。
最佳答案
请记住,陈述 2 和 3 与第一个不同。
如何?好吧,你正在做一个左外连接,你的 WHERE 子句没有考虑到这一点(就像 ON 子句一样)。至少,请尝试:
SELECT col1, col2
FROM table1, table2
WHERE table1.person_uid = table2.person_uid (+)
AND table1.period = table2.period (+)
并查看您是否遇到相同的性能问题。
你在这些表上有什么索引?这种关系是否由外键约束定义?
您可能需要的是 person_uid 和 period(在两个表上)的复合索引。
关于sql - 两列性能问题的左外连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/444820/