问题描述:
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博客 ” ,链接:https://blog.itpub.net/25105315/viewspace-2132126/
,如需转载,请注明出处,否则将追究法律责任。