我必须进行类似的查询,唯一的区别是一个是一个列的总和而另一个是另一个列的计数(不同)。 第一个在几秒钟(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
答案 0 :(得分:0)
DISTINCT
非常慢,数据库需要SORT / HASH并将所有值(或集)存储在内存/临时表空间中。此外,它使并行执行更难以应用。
如果有办法在不使用DISTINCT
的情况下重写查询,那么你一定要这样做。
答案 1 :(得分:0)
如上所述,DISTINCT
必须进行表扫描,然后对数据进行散列,聚合和排序。这会增加整个电路板所需的时间(CPU,磁盘访问和返回数据所需的时间)。如果可能的话,我建议尝试使用子查询。这将限制聚合执行仅限于您想要分离的数据,而不是让引擎在所有数据上执行它。 Here's an article关于如何在实践中发挥作用,并举例说明。