Max vs Count巨大的查询性能差异

时间:2015-11-19 18:41:51

标签: sql oracle oracle11g

我必须进行类似的查询,唯一的区别是一个是一个列的总和而另一个是另一个列的计数(不同)。 第一个在几秒钟(17秒)内运行,另一个从不停止(1小时计数)。我已经看过计数查询的计划,但成本很高。我不明白为什么。 他们正在达成完全相同的观点。 为什么会发生这种情况,我该怎么办?

运行正常的那个:

select  a11.SOURCEPP  SOURCEPP,
    a12.DUMMY  DUMMY,
    a11.SIM_NAME  SIM_NAME,
    a13.THEORETICAL  THEORETICAL,
    sum(a11.REVENUE)  WJXBFS1
from    CLIENT_SOURCE_DATA  a11
    join    DUMMY_V a12
      on    (a11.SOURCEPP = a12.SOURCEPP)
    join    SIM_INFO    a13
      on    (a11.SIM_NAME = a13.SIM_NAME)
where   (a13.THEORETICAL in (0)
 and a11.SIM_NAME in ('ETS40'))
group by    a11.SOURCEPP,
    a12.DUMMY,
    a11.SIM_NAME,
    a13.THEORETICAL

没有运行的那个:

select  a12.SOURCEPP  SOURCEPP,
    a12.SIM_NAME  SIM_NAME,
    a13.THEORETICAL  THEORETICAL,
    count(distinct a12.CLIENTID)  WJXBFS1
from    CLIENT_SOURCE_DATA  a12
    join    SIM_INFO    a13
      on    (a12.SIM_NAME = a13.SIM_NAME)
where   (a13.THEORETICAL in (0)
 and a12.SIM_NAME in ('ETS40'))
group by    a12.SOURCEPP,
    a12.SIM_NAME,
    a13.THEORETICAL

2 个答案:

答案 0 :(得分:0)

当有许多DISTINCT值时,

DISTINCT非常慢,数据库需要SORT / HASH并将所有值(或集)存储在内存/临时表空间中。此外,它使并行执行更难以应用。

如果有办法在不使用DISTINCT的情况下重写查询,那么你一定要这样做。

答案 1 :(得分:0)

如上所述,DISTINCT必须进行表扫描,然后对数据进行散列,聚合和排序。这会增加整个电路板所需的时间(CPU,磁盘访问和返回数据所需的时间)。如果可能的话,我建议尝试使用子查询。这将限制聚合执行仅限于您想要分离的数据,而不是让引擎在所有数据上执行它。 Here's an article关于如何在实践中发挥作用,并举例说明。