我有一个查询,将结果分组为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
有什么建议吗?
答案 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());