使用SUM聚合函数提高group by子句的性能

时间:2014-07-01 16:21:00

标签: sql performance oracle10g

我有一个查询,将结果分组为300,000行。

我尝试过的是按列创建一个包含索引的索引。当我在没有SUM函数的情况下运行查询时,查询似乎运行得非常快,但是当我添加一个包含SUM的列时,响应时间会增加很多。例如,在20秒内没有SUM查询响应,小于1s(分页),SUM查询响应。

假设a,b,c,d,e列有索引,TableA中有300,000条记录:

响应时间不到1秒(在SQL开发人员中显示前50行):

SELECT a,b,c,d
FROM tableA
GROUP BY
a,b,c,d
18秒内的

响应(在SQL开发人员中,显示前50行):

SELECT a,b,c,d,SUM(e)
FROM tableA
GROUP BY
a,b,c,d

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

您的索引会使访问这些列值变得微不足道,但是当您添加SUM(e)时,必须扫描每一行以创建聚合。

代替COUNT(*)的{​​{1}}会快速运行,因为索引包含所有相关信息。

除非表格特别宽,否则包括要在索引中聚合的字段通常会提供可忽略的性能差异。实际上,从索引中删除SUM()可能会更好。

创建materialized view将提高效果

答案 1 :(得分:-3)

提供以下查询的输出。

explian plan for SELECT a,b,c,d,SUM(e)
FROM tableA
GROUP BY
a,b,c,d

select * from table(dbms_xplan.display());