替代<>在SQL Developer中

时间:2015-10-01 16:39:17

标签: sql oracle-sqldeveloper

我在这个网站上做了一些搜索,无法找到我正在寻找的内容,所以我希望这不是重复的。我有一个问题,即视图中的查询运行大约需要39秒,这会拖动多次连接到此视图的报表查询。

为了保持这个简单,我要保持代码简单,但保持结构与视图完全一样。这是SELECT语句:

SELECT ....
FROM A a
JOIN B b on a.x = b.x
JOIN C c ON c.s = 'P' AND c.y = b.y
JOIN B AS b2 ON b2.y = c.y AND b2.x <> a.x
JOIN B b3 ON b3.x = b2.x

x和y在所有连接谓词中都是相同的列名。

我遇到的问题是AND b2.x&lt;&gt;行斧头。没有它,它会在大约1秒内运行,但是它总是需要超过30秒。我曾尝试多次重写此谓词:

b2.x IN (select b2.x FROM B b2 join A a on b2.x <> a.x) 


b2.x NOT IN (select b2.x FROM b b2 JOIN A a on b2.x <> a.x)

NOT b2.x = a.x

或者甚至删除它并在连接之后放入一个where子句,以及所有上述变量以及:

WHERE b2.x NOT IN (SELECT x FROM a)

WHERE b2.x (NOT IN SELECT DISTINCT x FROM a)

我没有想法,需要找出一种优化方法。关于我还能看到什么的任何建议或提示?刚刚运行

SELECT b2.x from B b2 JOIN A a ON b2.x <> a.x

运行得很快,所以我不认为基础表是问题。

1 个答案:

答案 0 :(得分:1)

如果查询在没有条件的情况下运行得非常快,但是它很差,那么我可能会建议实现CTE:

WITH abc as (
      SELECT /*+ materialize */...., b2.x as b2x, a.x as ax
      FROM A a JOIN
           B b
           ON a.x = b.x JOIN
           C c
           ON c.s = 'P' AND c.y = b.y JOIN
           B b2
           ON b2.y = c.y AND b2.x <> a.x JOIN
           B b3
           ON b3.x = b2.x
     )
SELECT abc.*
FROM ABC
WHERE b2x <> ax;