现在我怀疑在两种情况:
1。索引维护耗费的时间太长是因 为该索引创建不合理,这个表有60G,1亿行以上,大部分为insert 和update。该表分区的时候以partition_id这个字段分区,而索引创建在user_no上,而且创建索引用的local。
昨天晚上我将该索引按照user_no进行global分区重新创建,速度没有明显提高,基本没有什么影响。
索引的块大小在这里也没有得到明显的改观,也就是块大小在这种情况下不会对性能有多大的影响,因为update的速度很快,而单单只有insert速度很慢。
然后我drop掉这个索引后,速度飞速发展,insert和update速度均提高10倍以上。
2。后来有一个朋友跟我一起分析了一下10046的trace文件,贴一段给大家看看:
WAIT #4: nam='global cache open x' ela= 267 p1=138 p2=30311 p3=504403161335454208
WAIT #4: nam='global cache open x' ela= 23 p1=138 p2=30311 p3=504403161335454208
WAIT #4: nam='db file sequential read' ela= 14451 p1=138 p2=30311 p3=1
WAIT #4: nam='global cache open x' ela= 278 p1=143 p2=26994 p3=504403159137516512
WAIT #4: nam='global cache open x' ela= 19 p1=143 p2=26994 p3=504403159137516512
WAIT #4: nam='db file sequential read' ela= 7367 p1=143 p2=26994 p3=1
WAIT #4: nam='global cache open x' ela= 399 p1=144 p2=24777 p3=504403163617368128
WAIT #4: nam='global cache open x' ela= 19 p1=144 p2=24777 p3=504403163617368128
WAIT #4: nam='db file sequential read' ela= 29085 p1=144 p2=24777 p3=1
WAIT #4: nam='global cache open x' ela= 309 p1=144 p2=24782 p3=504403163717793248
WAIT #4: nam='global cache open x' ela= 20 p1=144 p2=24782 p3=504403163717793248
WAIT #4: nam='db file sequential read' ela= 1153 p1=144 p2=24782 p3=1
WAIT #4: nam='db file sequential read' ela= 15868 p1=145 p2=14881 p3=1
同时我在rac的另外一个机器上查询了gv$cache_transfer这个视图,发现大量的cache transfer刚好发生在这些文件上。根据trace文件中分析,每一个'db file sequential read' 前面都跟了一个'global cache open x' 并且p1(file#)参数都一样,几乎这两个等待都是发生在一起的,因此我又怀疑是否因为这个表的resource master根本就是在另外一个机器上(node2),而我的应该做的事情在本地这台机器上(node1),每一次需要修改索引的时候都需要gcs把索引块从node2上传输过来?
在网上看了一些帖子,在oracle9202以后,rac的资源动态分配就不能用了,而且据chao_pin和oraracdba的谈话中可以看出,rac的resource remaster功能要在10g中才能很好的使用,也就是这个问题在9i中根本不能解决?
目前我能做的就是要么将应用移到node2上去做,减少'global cache open x' 用以减少interconnect的传输block,或者现在我将分区索引分的更细?
各位有没有好的办法!