优化SQL查询
我有一个SQL查询,它在两个表上执行内部联接,每个表的行数都大于50M。我希望通过减少基于其中一个表上的列连接的行来减少搜索连接所需的时间 假设我的表1有A、B、C列,表2有A、D、E列。我希望基于A列进行联接,但只希望那些表2的E列的值为“E”的行 我的SQL查询:优化SQL查询,sql,oracle,inner-join,Sql,Oracle,Inner Join,我有一个SQL查询,它在两个表上执行内部联接,每个表的行数都大于50M。我希望通过减少基于其中一个表上的列连接的行来减少搜索连接所需的时间 假设我的表1有A、B、C列,表2有A、D、E列。我希望基于A列进行联接,但只希望那些表2的E列的值为“E”的行 我的SQL查询: SELECT one.B, two.D FROM table1 one INNER JOIN table2 two WHERE two.E IN ('e') ON one.A = two.A WHERE one.B > 10
SELECT one.B, two.D
FROM table1 one
INNER JOIN table2 two WHERE two.E IN ('e')
ON one.A = two.A
WHERE one.B > 10
AND two.D IN ('...')
它给出了错误:
ORA-00905: missing keyword
我哪里做错了?我如何达到预期的结果
SELECT one.B, two.D
FROM table1 one
INNER JOIN table2 two -- WHERE two.E IN ('e') --> shouldn't use where here
ON one.A = two.A and two.E = 'e'
WHERE one.B > 10
AND two.D IN ('...')
代码中包含的注释。您还可以将条件放在Where子句中
SELECT one.B, two.D
FROM table1 a
JOIN table2 b
ON b.A = a.A
WHERE a.B > 10
And b.E = 'e'
AND b.D In ('...')
编辑以删除第二条不正确的建议正如vkp指出的,此处使用不当。相反,您也可以创建一个子查询来包含where语句。以便:
INNER JOIN table2 two WHERE two.E IN ('e')
变成
INNER JOIN (select * from table2 WHERE E IN ('e')) two
也许还可以使用
和two.E='E'
,因为您实际上并没有要求DB计算元组。不过,查询优化器很有可能知道这一点。出于好奇,您是如何决定IN会受到性能问题的影响的?在我的经验中,我从来没有遇到过这样的情况——特别是因为Oracle会在幕后将in列表转换为OR谓词。你知道,这只是基于我的主观经验——但由于你的评论而进行的在线研究表明我错了。。。我删除了我答案的那部分。谢谢;也许你把它和其他一些性能问题混淆了(如果你的大脑和我的一样!),或者你在某个时间点遇到了一个影响特定场景的bug*{:-)