【发布时间】:2015-02-26 17:12:30
【问题描述】:
我已经编写了下面的查询,它有很多“AND”运算符,我想知道如何优化下面查询的性能[我可以删除一些“AND”运算符吗]
SELECT I.date,
K.somcolumn,
L.somcolumn,
D.somcolumn
FROM Table1 I,
Table2 K,
Table3 L,
Table4 D
WHERE I._ID = K._ID
AND K.ID = L._ID
AND L._ID = I._ID
AND I._CODE = L._CODE
AND K.ID = D._ID(+)
AND L._ID IN ( SELECT _id
FROM I
WHERE UPPER (someflag) = 'TRUE'
GROUP BY _id
HAVING COUNT (*) > 1)
AND L._ID IN ( SELECT _id
FROM I
WHERE UPPER (code) = 'OPEN'
GROUP BY _id
HAVING COUNT (*) > 1)
ORDER BY I._ID, I._CODE;
【问题讨论】:
-
如果返回的行数很少,您可以尝试使用标量子查询将表 I 中的计数作为新返回的列。您也可以尝试使用 WITH 子句从表 I 构建临时表。只是想法。我无法给出答案,因为我无法验证我的想法。
-
另外,使用
EXISTS可能比IN快得多,因为可以使用索引。EXISTS ( SELECT NULL FROM I WHERE L._id=_id AND UPPER(code) = 'OPEN' GROUP BY _id HAVING COUNT (*) > 1)。因为索引可能用于 _id 代码,而 someflag 可能是位图索引的候选对象。
标签: oracle oracle11g oracle10g oracle-sqldeveloper