背景:
有一DW数据库的AWR报告中显示DWINX表空间的写次数是DW表空间的10倍。
问题:
为什么DWINX表空间的写次数是DW表空间的10倍?
分析:
1)正常情况下索引表空间写次数不应高于数据表的表空间的。还要这么多。
2)查看AWR报告中的TOP SQL没有发现直接问题,只发现有一SQL调用package.procedure()占用了大量物理读和写
3)于是翻查该package的全部代码,发现代码编写逻辑如下:
3.1 往一张事实表先清空当月的数据,再把当月最新的数据插入到当前分区表中。
3.2 收集统计值
3.3 如不存在索引则建立索引,如存在则rebuild ,代码如下:
alter index idx_01 reubild;
create index idx_01 on dw.t1(col1,col2,col3);
3.4 dw.t1是一个存放了约10年的数据,是一个分区表,索引的类型是本地分区索引。
3.5 根据3.3索引重建语法,可以看出程序员的本意是导入一个新月份的数据后,重建索引防止碎片的出现,但是却误把这个分区表所有的分区索引都重建了一次,所以在AWR报告中就看到dwinx的表空间写次比dw表空间多了10倍,因为根本就没有那么多数据产生,却rebuild了所有分区的索引。
解决方案:
1. 因为采用truncate table 清空数据,再insert into select 当月数据,本地分区索引应不会出现碎片,所以我认为无需重建索引,就算要重建索引,也只重建操纵月的本地索引。
2. 正确rebuild分区索引的方法如下:
alter index idx_01 rebuild partition p201704 online;
PS: 在AWR报告中为什么不显示DDL语句呢?
转载请注明原文地址: https://www.6miu.com/read-1321.html