我正在使用类似于以下形式的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和陈述与第一陈述不同.
怎么样?好吧,你正在做一个左外连接,你的WHERE子句没有考虑到这一点(就像ON子句那样).至少,尝试:
SELECT col1, col2 FROM table1, table2 WHERE table1.person_uid = table2.person_uid (+) AND table1.period = table2.period (+)
看看你是否遇到了同样的性能问题.
你对这些表有什么索引?这种关系是由外键约束定义的吗?
您可能需要的是person_uid和period(在两个表上)的复合索引.
我想你需要理解为什么最后两个与第一个查询不同.如果你做左连接然后添加一个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中的字段,则将左连接更改为内连接.
如果您的查询速度不够快,我会查看您的索引.