Oracle Select查询在使用Not In子句时占用太多时间

gzjq41n4  于 2022-11-28  发布在  Oracle
关注(0)|答案(1)|浏览(162)

ORACLE版本:19摄氏度
我正在做一个遗留的选择查询,它返回大约60 k行。它是由9个连接和2个联合组成的。我想排除一小部分受众,如果他们在我指定的情况下。我写了一个选择查询使用四个连接,然后使用not in子句来排除这些受众。查询在大约15秒前执行,但在我写了这个not in子句后,它甚至没有在20分钟内完成,我中止了它。
它是这样编码的;

A.ID NOT IN (SELECT A.ID
         FROM A
         INNER JOIN B
         ON A.X = BX
         INNER JOIN C
         ON B.Y = C.Y
         INNER JOIN D
         ON C.Z = D.Z)

但是,如果我在select之前执行此子查询,并将其插入到表中,然后对表使用not in子句,它几乎在15秒内完成,与正常情况一样
它是这样编码的;

A.ID NOT IN (SELECT GT.ID FROM GENERATED_TABLE GT)

你知道为什么当它没有被填充到一个表中时会花费太多的时间吗?有什么方法可以让第一个运行得更快吗?
期望它花费更少的时间

eagi6jfj

eagi6jfj1#

请尝试使用EXISTS而不是IN语句。当子查询结果非常大时,EXISTS子句比IN语句快得多。
再一次-检查解释计划,搜索全面扫描关键字。那将是主要原因。

相关问题