【发布时间】:2017-04-24 01:36:19
【问题描述】:
我有一个查询需要很长时间才能执行。我已经等了大约 10 分钟,它仍然没有完成执行。
查询看起来像这样:
SELECT
one.ID,
two.NAME,
two.STATUS,
four.KEY,
four.VALUE,
count(one.ID) as num
FROM TABLE_ONE one, TABLE_TWO two, TABLE_THREE three, TABLE_FOUR four
WHERE one.STATE='RED'
AND (two.STATUS='ON' OR two.STATUS='OFF')
AND (
four.KEY='FINAL'
OR four.KEY='LIMIT'
OR (
four.KEY='MODE'
AND (
four.VALUE='T'
OR four.VALUE='R')))
GROUP BY one.ID, two.NAME, two.STATUS, four.KEY, four.VALUE
ORDER BY group_name ASC;
我有另一个等效的查询,但执行速度非常快(执行大约需要 1 秒)。
这是那个查询:
SELECT
one.ID,
two.NAME,
two.STATUS,
four.KEY,
four.VALUE,
count(one.ID) as num
FROM TABLE_ONE one
INNER JOIN TABLE_TWO two
ON one.ID=two.ID
INNER JOIN TABLE_THREE three
ON two.ID=three.GROUP_ID
INNER JOIN TABLE_FOUR four
ON three.ID=four.ID
WHERE one.STATE='RED'
AND (two.STATUS='ON' OR two.STATUS='OFF')
AND (
four.KEY='FINAL'
OR four.KEY='LIMIT'
OR (
four.KEY='MODE'
AND (
four.VALUE='T'
OR four.VALUE='R')))
GROUP BY one.ID, two.NAME, two.STATUS, four.KEY, four.VALUE
ORDER BY group_name ASC;
我有点困惑,为什么带有 INNER JOIN 的查询执行得非常快(大约 1 秒),而没有的查询需要很长时间(等待大约 10 分钟但仍未完成执行)。
如果没有INNER JOIN,我可以对查询做些什么来加快执行时间?
我正在使用 ORACLE。
【问题讨论】:
-
您应该查看执行计划(或“解释计划”)。我的猜测是
inner join版本正在使用索引来提高性能,而将连接条件与过滤条件混合在一起的版本出于某种原因不使用索引。或者其他一些在您查看执行计划时应该很明显的区别。
标签: sql performance join oracle11g inner-join