欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

用示例说明表数据中出现热块&Latch的场景,并给出解决方案?

程序员文章站 2022-06-03 08:45:24
...

引言:Latch争用就是由于多个会话同一时间访问同一个数据块引起的,这也是我们常说的热块。解决方法:把记录打散到多个数据块中,减少多个会话同一时间频繁访问

引言:Latch争用就是由于多个会话同一时间访问同一个数据块引起的,这也是我们常说的热块。解决方法:把记录打散到多个数据块中,网站空间,减少多个会话同一时间频繁访问一个数据块概率,防止由于记录都集中在一个数据块里产生热块现象。下面我们用实验来说明热块是如何产生和解决的。

session:19

LEO1@LEO1>select distinct sid from v$mystat; 大家先了解一下LEO1用户的SID是19

SID

-----------------

19

LEO1@LEO1>create table latch_table1 as select * from dba_objects; 创建latch_table1表

Table created.

LEO1@LEO1>select count(*) from latch_table1; 这个表中有71961条记录

COUNT(*)

----------------

71961

LEO1@LEO1>execute dbms_stats.gather_table_stats('LEO1','latch_table1'); 我们对表做一个全面分析让优化器了解表数据是如何分布的。

PL/SQL proceduresuccessfully completed.

下面我们用dbms_rowid.rowid_block_number 函数来查出一个数据块上有多少条记录

dbms_rowid.rowid_block_number作用:函数返回输入ROWID对应的数据块编号

selectdbms_rowid.rowid_block_number(rowid), count(*) block_sum_rows from latch_table1 group bydbms_rowid.rowid_block_number(rowid) order by block_sum_rows ;

这里显示出每个数据块上有多少条记录,按记录数从大到小排列

DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)BLOCK_SUM_ROWS

--------------------------------------------------

234 81

391 81

225 82

259 82

220 83

233 83

279 84

274 85

219 88

275 89

277 89

276 90

278 90

我们看到一个数据块中最多是90行记录

select'LATCH_TABLE1' , block_sum_rows , count(*) con_rows_sum_blocks from

(selectdbms_rowid.rowid_block_number(rowid), count(*) block_sum_rows from latch_table1 group bydbms_rowid.rowid_block_number(rowid) order by block_sum_rows)

group byblock_sum_rows order by con_rows_sum_blocks;

有一致记录数的数据块有多少个,举个例子好理解,上面我们看到276和278块上都用90条记录,现在我们想知道有90条记录的块一共有多少个我们用con_rows_sum_blocks列名表示(一致记录数的数据块总和),香港服务器租用,每个块上的记录数我们用block_sum_rows列名表示。

'LATCH_TABLE BLOCK_SUM_ROWS CON_ROWS_SUM_BLOCKS

-------------------------- ----------------------- -------------- -------------------

LATCH_TABLE1 85 1

LATCH_TABLE1 54 1

LATCH_TABLE1 84 1

LATCH_TABLE1 88 1

LATCH_TABLE1 25 1

LATCH_TABLE1 63 2

LATCH_TABLE1 90 2

LATCH_TABLE1 83 2

LATCH_TABLE1 82 2

LATCH_TABLE1 89 2

LATCH_TABLE1 64 4

LATCH_TABLE1 81 10

LATCH_TABLE1 80 17

LATCH_TABLE1 65 18

LATCH_TABLE1 79 20

LATCH_TABLE1 74 27

LATCH_TABLE1 73 28

LATCH_TABLE1 77 28

LATCH_TABLE1 72 29

LATCH_TABLE1 78 29

LATCH_TABLE1 75 33

LATCH_TABLE1 76 36

LATCH_TABLE1 71 54

LATCH_TABLE1 66 69

LATCH_TABLE1 70 75

LATCH_TABLE1 69 152

LATCH_TABLE1 67 158

LATCH_TABLE1 68 223

28 rows selected.