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

Jas*_*ker 11 sql oracle join left-join oracle10g

我正在使用类似于以下形式的SQL查询:

SELECT col1, col2
FROM table1
LEFT OUTER JOIN table2
ON table1.person_uid = table2.person_uid
AND table1.period = table2.period
Run Code Online (Sandbox Code Playgroud)

而且它要么太慢,要么死机,因为它至少需要4分钟才能返回.如果我要将其更改为:

SELECT col1, col2
FROM table1
LEFT OUTER JOIN table2
ON table1.person_uid = table2.person_uid
WHERE table1.period = table2.period
Run Code Online (Sandbox Code Playgroud)

然后它工作正常(尽管没有返回正确数量的列).有什么方法可以加快速度吗?

更新:如果我切换后一个查询的最后两行,它会做同样的事情:

SELECT col1, col2
FROM table1
LEFT OUTER JOIN table2
ON table1.period = table2.period
WHERE table1.person_uid = table2.person_uid
Run Code Online (Sandbox Code Playgroud)

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

cle*_*tus 16

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

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

SELECT col1, col2
FROM table1, table2
WHERE table1.person_uid = table2.person_uid (+)
AND table1.period = table2.period (+)
Run Code Online (Sandbox Code Playgroud)

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

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

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


HLG*_*GEM 5

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

SELECT col1, col2
FROM table1
LEFT OUTER JOIN table2
ON table1.person_uid = table2.person_uid
WHERE table2.person_uid is null
Run Code Online (Sandbox Code Playgroud)

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

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