一段时间前做了一个STATSPACK,发现cache buffers chains等待较多,通过对x$bh的查询找到热点对象。(ORACLE9208)
SQL> select owner,object_name from dba_objects where data_object_id in (select obj from (select obj from x$bh order by tch desc) where rownum < 11);
OWNER OBJECT_NAME
------------------------------ --------------------
WWW FORUM_THREAD
WWW FUNCTIONS_INFO
WWW SYS_C003869
WWW SYS_C003120
现在只以FORUM_THREAD对象为例做调优。
先查看FORUM_THREAD对象的块分布:
SQL> select file_id,extent_id,block_id,blocks from dba_extents where segment_name='FORUM_THREAD';
FILE_ID EXTENT_ID BLOCK_ID BLOCKS
---------- ---------- ---------- ----------
12 0 27441 8
12 1 27449 8
12 2 27457 8
12 3 27465 8
12 4 27473 8
12 5 27481 8
12 6 27489 8
12 7 27497 8
12 8 27505 8
12 9 27513 8
12 10 27521 8
FILE_ID EXTENT_ID BLOCK_ID BLOCKS
---------- ---------- ---------- ----------
12 11 27529 8
12 12 27537 8
12 13 27545 8
12 14 27553 8
12 15 27561 8
12 16 27657 128
12 17 27785 128
12 18 27913 128
12 19 28041 128
12 20 47497 128
12 21 47625 128
FILE_ID EXTENT_ID BLOCK_ID BLOCKS
---------- ---------- ---------- ----------
12 22 47753 128
12 23 47881 128
12 24 48009 128
12 25 48137 128
12 26 48265 128
12 27 48393 128
12 28 48521 128
12 29 48649 128
12 30 48777 128
12 31 48905 128
12 32 49033 128
FILE_ID EXTENT_ID BLOCK_ID BLOCKS
---------- ---------- ---------- ----------
12 33 49161 128
12 34 49289 128
12 35 49417 128
12 36 49545 128
已选择37行
以上信息表示FORUM_THREAD对象在保存在37个extent中,由于此对象是一个表,我们再查看表的PCTFREE参数(表空间是非ASSM的)
SQL> select table_name,pct_free from dba_tables where table_name='FORUM_THREAD';
TABLE_NAME PCT_FREE
------------------------------ ----------
FORUM_THREAD 10
PCTFREE参数为默认的10,对于我的系统访问量来说这个值已经不合适,应该适当增大
SQL> alter table forum_thread pctfree 40;
PCTFREE修改为40之后,通过一段时间的观察FORUM_THREAD对象仍然是排在前列的热点对象,通过对dba_extents的查看,数据分布仍然与之前差不多,此时可判断表的PCTFREE变化不影响已有块的数据分布。
通过对表进行move操作重组storage(注意move操作不能在线做)
SQL> alter table forum_thread move;
SQL> select file_id,extent_id,block_id,blocks from dba_extents where segment_name='FORUM_THREAD';
FILE_ID EXTENT_ID BLOCK_ID BLOCKS
---------- ---------- ---------- ----------
12 0 27569 8
12 1 27577 8
12 2 27585 8
12 3 27593 8
12 4 47073 8
12 5 47081 8
12 6 47089 8
12 7 47097 8
12 8 47105 8
12 9 49673 8
12 10 49681 8
FILE_ID EXTENT_ID BLOCK_ID BLOCKS
---------- ---------- ---------- ----------
12 11 49689 8
12 12 49697 8
12 13 49705 8
12 14 49713 8
12 15 49721 8
12 16 49801 128
12 17 49929 128
12 18 50057 128
12 19 50185 128
12 20 50313 128
12 21 50441 128
FILE_ID EXTENT_ID BLOCK_ID BLOCKS
---------- ---------- ---------- ----------
12 22 50569 128
12 23 50697 128
12 24 50825 128
12 25 50953 128
12 26 51081 128
12 27 51209 128
12 28 51337 128
12 29 51465 128
12 30 51593 128
12 31 51721 128
12 32 51849 128
FILE_ID EXTENT_ID BLOCK_ID BLOCKS
---------- ---------- ---------- ----------
12 33 51977 128
12 34 52105 128
12 35 52233 128
12 36 52361 128
12 37 52489 128
12 38 52617 128
12 39 52745 128
12 40 52873 128
12 41 53001 128
12 42 53129 128
12 43 53257 128
FILE_ID EXTENT_ID BLOCK_ID BLOCKS
---------- ---------- ---------- ----------
12 44 53385 128
12 45 53513 128
12 46 53641 128
12 47 53769 128
12 48 53897 128
已选择49行
move表之后,可看到FORUM_THREAD对象被分布到了49个extent中了,数据分布增大。
随机选取某几个数据块,通过DUMP信息的对比:
l PCTFREE=10,dump出的数据块信息片断
SQL> alter system dump datafile 12 block 27458;
Start dump data blocks tsn: 14 file#: 12 minblk 27458 maxblk 27458
……
ntab=1
nrow=45
frre=-1
fsbo=0x6c
fseo=0x3b1
avsp=0x345
tosp=0x345
0xe:pti[0] nrow=45 offs=0
以上信息中可看出27458数据块中包含45行数据。
l PCTFREE=40,且对表做MOVE操作后,dump出的数据块信息片断:
SQL> alter system dump datafile 12 block 27586;
Start dump data blocks tsn: 14 file#: 12 minblk 27586 maxblk 27586
……
ntab=1
nrow=7
frre=-1
fsbo=0x20
fseo=0xd87
avsp=0xd67
tosp=0xd67
0xe:pti[0] nrow=7 offs=0
以上信息中可看出27586数据块中包含7行数据。
对比数据块导出信息,可看到在MOVE表之后一个块包含的行数减小,数据得到了更大的分布,从而在一定程度上减少了热点块问题发生。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/17997/viewspace-257139/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/17997/viewspace-257139/