我在这个网站上做了一些搜索,无法找到我正在寻找的内容,所以我希望这不是重复的。我有一个问题,即视图中的查询运行大约需要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
运行得很快,所以我不认为基础表是问题。
答案 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;