问一个严肃的问题,关于oracle sum group by 分组字段多了以后的执行效率问题

我有一个语句,有三个sum() 和15个分组字段,表中大概有30万行记录。我担心执行效率太差,所以跟踪了一下SQL_TRACE,请各位大侠帮忙分析分析!
没建立索引前的分析:

call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.01 0.01 0 1 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 15 0.01 0.00 0 28 0 1483
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 17 0.03 0.02 0 29 0 1483

Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 72

Rows Row Source Operation
------- ---------------------------------------------------
1483 SORT GROUP BY (cr=28 pr=0 pw=0 time=2455 us)
1484 TABLE ACCESS FULL TEST (cr=28 pr=0 pw=0 time=40 us)

建立索引后
call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.00 0 1 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 15 0.01 0.00 0 28 0 1483
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 17 0.01 0.01 0 29 0 1483

Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 72

Rows Row Source Operation
------- ---------------------------------------------------
1483 SORT GROUP BY (cr=28 pr=0 pw=0 time=3800 us)
1484 TABLE ACCESS FULL TEST (cr=28 pr=0 pw=0 time=42 us)

EXPLAIN PLAN 两者相同,都是 all_rows cost=9 cadinality=1484 bytes=1221332

请高手帮忙解释分析下执行计划和SQL_TRACE

另外,如果不用对15个字段分组,那还有什么好办法吗?

我严肃的答:
1如果表的列太多,可以这样设计
表1 表2
id 列1...列100 id 列101...列200

如果行太多,可以这样设计
表1(2000年数据) 表2 (2001年数据)

2正确的加上索引,这个不是一句话说的清的。
3更新时候尽量小批量的查,比如查这个月的数据,再加上以前的汇总结果
4等到没人用数据库的时候才汇总,比如下班后,半夜等追问

我严肃地追问:
这个表一共有18列,还好。不过系统用了半年后就有几十万行了。这个不是报表语句,所以没法下班后汇总,这是业务人员操作时要去查询的表,读取很频繁!请问有什么办法可以修改一下SQL语句(表结构我这边现在不好更改),让其效率更高点!

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-12-07
sum不是瓶颈,关键在表和表之间的链接,过滤条件如何设置,还有就是过滤条件的位置
第2个回答  2020-06-13
我严肃答:
1表列太多样设计
表1
表2
id
列1...列100
id
列101...列200
行太多样设计
表1(2000年数据)
表2
(2001年数据)
2正确加上索引句说清
3更新时候尽量小批量查比查月数据再加上前汇总结
4等没人用数据库时候才汇总比下班半夜等
第3个回答  2011-12-09
一楼正解
相似回答