首页 > 解决方案 > 选择计数需要很长时间才能返回

问题描述

我正在做一个在 3 秒内完成的复杂查询:

WITH
Query1 as
( select ...
),
Query2 as
( select ... from Query1 ...
),
ComplexQuery AS
( select ... from Query2 ...
)
select * from ComplexQuery;

除了这些查询之外,还有很多操作,例如GROUP BY, ORDER BY, UNION.

但是当我用这个改变最后一行时:

select count (*) from ComplexQuery;

这会产生一种奇怪的效果。查询开始执行很长时间。我等了大约 30 分钟,然后停下来。

我预计,由于原始查询在 3 秒内执行,计数应该需要大约 0.01 秒,因此总时间为 3.01 秒。相反,我看到的是计数似乎开始了某种涉及所有先前子查询的递归——这是我能想象的。

正常Oracle/SQL吗?或者,为什么会这样?我怎样才能避免这个问题?

标签: sqloracleoracle11g

解决方案


您可以尝试提示优化器通过以下方式实现中间步骤/*+MATERIALIZE*/

WITH Query1 as       ( select /*+MATERIALIZE*/ ...)
    ,Query2 as       ( select /*+MATERIALIZE*/ ... from Query1 ...)
    ,ComplexQuery AS ( select /*+MATERIALIZE*/ ... from Query2 ...)
select count (*) from ComplexQuery;

推荐阅读