当前位置:  开发笔记 > 数据库 > 正文

左外连接在两列性能问题上

如何解决《左外连接在两列性能问题上》经验,为你挑选了2个好方法。

我正在使用类似于以下形式的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: 这些实际上是我加入的观点.不幸的是,它们位于我无法控制的数据库上,因此我无法(轻松)对索引进行任何更改.我倾向于同意这是一个索引问题.我会等一会儿才接受答案,以防有一些神奇的方法来调整我不知道的查询.否则,我会接受当前的答案之一,并尝试找出另一种方法来做我想做的事情.感谢大家的帮助到目前为止.



1> cletus..:

请记住,陈述2和陈述与第一陈述不同.

怎么样?好吧,你正在做一个左外连接,你的WHERE子句没有考虑到这一点(就像ON子句那样).至少,尝试:

SELECT col1, col2
FROM table1, table2
WHERE table1.person_uid = table2.person_uid (+)
AND table1.period = table2.period (+)

看看你是否遇到了同样的性能问题.

你对这些表有什么索引?这种关系是由外键约束定义的吗?

您可能需要的是person_uid和period(在两个表上)的复合索引.



2> HLGEM..:

我想你需要理解为什么最后两个与第一个查询不同.如果你做左连接然后添加一个where子句引用连接右侧表格中的一个字段(可能并不总是有一个记录与第一个表匹配),那么你已经有效地将连接更改为内部联接.有一个例外,那就是你引用的东西

SELECT col1, col2
FROM table1
LEFT OUTER JOIN table2
ON table1.person_uid = table2.person_uid
WHERE table2.person_uid is null

在这种情况下,您要求记录在第二个表中没有记录.但除了这种特殊情况之外,如果在where子句中反映table2中的字段,则将左连接更改为内连接.

如果您的查询速度不够快,我会查看您的索引.

推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有