问题描述:
Oracle有两百多个会话在等待latch free等待事件,系统发生堵塞。
问题分析:
当时等待会话中的latch地址是'00000010ECD379E8',在该地址上等待最多的对象是主键PK_PRD_TAB1。
点击(此处)折叠或打开
- SQL> select /*+ RULE */
- 2 x.tch,
- 3 l.child#,
- 4 x.OBJ,
- 5 o.object_name
- 6 from sys.v$latch_children l, sys.x$bh x, dba_objects o
- 7 where x.hladdr = '00000010ECD379E8'
- 8 and x.hladdr = l.addr
- 9 and o.data_object_id = x.obj
- 10 order by x.tch desc;
- TCH CHILD# OBJ OBJECT_NAME
- ---------- ---------- ---------- ------------------------------
- 50 18672 703092 PK_PRD_TAB1
由于该索引的访问次数非常多,导致该索引上的热块。
针对热块最好的方式应该是采用中间件缓存计算,将重复访问的结果缓存在中间件中。这样减少数据库的访问压力。由于当时采用的缓存技术有缺陷,只要采用另外一种方法,将索引的热点打散,进行hash分区操作。
点击(此处)折叠或打开
- create table PRD_TAB1
- (
- CREATED_BY VARCHAR2(100),
- CREATED_DATE DATE,
- UPDATED_BY VARCHAR2(100),
- UPDATED_DATE DATE,
- TAB1_ID NUMBER(10),
- ......
- GROUP_ID NUMBER(8),
- ......
- )PARTITION BY HASH(GROUP_ID)
- ;
- alter table PRD_TAB1
- add constraint PK_PRD_TAB1 primary key (GROUP_ID, TAB1_ID)
- using index PK_PRD_TAB1;
结论:
针对热块最好的方式应该是采用中间件缓存计算,将重复访问的结果缓存在中间件中。这样减少数据库的访问压力。如果没有中间件缓存,可以将索引的热点打散,进行hash分区操作。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25105315/viewspace-2132126/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/25105315/viewspace-2132126/