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

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

WBOY
WBOYOriginal
2016-06-07 17:41:081135Durchsuche

引言: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.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn