EnchanterBlue 发表于 2011-12-22 08:54

数据块(Data Block)原理深入剖析

<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 62.75pt"><b style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 18pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">数据块(</span></b><b style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 18pt; mso-font-kerning: 0pt" lang="EN-US"><font face="Times New Roman">Data Block</font></span></b><b style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 18pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">)原理深入剖析</span></b><b style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 18pt; mso-font-kerning: 0pt" lang="EN-US"></span></b></p><b><span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial; mso-font-kerning: 0pt">什么是数据块(</span></b><b><span style="mso-font-kerning: 0pt" lang="EN-US">Data Block</span></b><b><span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial; mso-font-kerning: 0pt">)</span></b><b><span style="mso-font-kerning: 0pt" lang="EN-US"></span></b><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">数据块(</span><span style="mso-font-kerning: 0pt" lang="EN-US"><font face="Times New Roman">Oracle Data Blocks</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">),本文简称为“块”,是</span><span style="mso-font-kerning: 0pt" lang="EN-US"><font face="Times New Roman">Oracle</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">最小的存储单位,</span><span style="mso-font-kerning: 0pt" lang="EN-US"><font face="Times New Roman">Oracle</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">数据存放在“块”中。一个块占用一定的磁盘空间。特别注意的是,这里的“块”是</span><span style="mso-font-kerning: 0pt" lang="EN-US"><font face="Times New Roman">Oracle</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">的“数据块”,不是操作系统的“块”。</span><span style="mso-font-kerning: 0pt" lang="EN-US"></span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span style="mso-font-kerning: 0pt" lang="EN-US"><font face="Times New Roman">Oracle</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">每次请求数据的时候,都是以块为单位。也就是说,</span><span style="mso-font-kerning: 0pt" lang="EN-US"><font face="Times New Roman">Oracle</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">每次请求的数据是块的整数倍。如果</span><span style="mso-font-kerning: 0pt" lang="EN-US"><font face="Times New Roman">Oracle</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">请求的数据量不到一块,</span><span style="mso-font-kerning: 0pt" lang="EN-US"><font face="Times New Roman">Oracle</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">也会读取整个块。所以说,“块”是</span><span style="mso-font-kerning: 0pt" lang="EN-US"><font face="Times New Roman">Oracle</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">读写数据的最小单位或者最基本的单位。</span><span style="mso-font-kerning: 0pt" lang="EN-US"></span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt"><font size="3">块的标准大小由初始化参数</font></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: Courier; mso-font-kerning: 0pt; mso-bidi-font-family: Courier" lang="EN-US">DB_BLOCK_SIZE</span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Courier; mso-hansi-font-family: Courier; mso-font-kerning: 0pt; mso-bidi-font-family: Courier">指定。具有标准大小的块称为标准块(</span><span style="FONT-SIZE: 10pt; FONT-FAMILY: Courier; mso-font-kerning: 0pt; mso-bidi-font-family: Courier" lang="EN-US">S</span><span style="mso-font-kerning: 0pt" lang="EN-US"><font face="Times New Roman" size="3">tandard Block</font></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Courier; mso-hansi-font-family: Courier; mso-font-kerning: 0pt; mso-bidi-font-family: Courier">)。块的大小和标准块的大小不同的块叫非标准块</span><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">(</span><span style="mso-font-kerning: 0pt" lang="EN-US"><font face="Times New Roman">Nonstandard Block</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">)。同一<a target="_self"><u><strong>数据库</strong></u></a>中,</span><span style="mso-font-kerning: 0pt" lang="EN-US"><font face="Times New Roman">Oracle9i</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">及以上版本支持同一数据库中同时使用标准块和非标准块。</span><span style="mso-font-kerning: 0pt" lang="EN-US"><font face="Times New Roman">Oracle</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">允许指定</span><span style="mso-font-kerning: 0pt" lang="EN-US"><font face="Times New Roman">5</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">种非标准块(</span><span style="mso-font-kerning: 0pt" lang="EN-US"><font face="Times New Roman">Nonstandard Block</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">)。</span><span style="mso-font-kerning: 0pt" lang="EN-US"></span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">操作系统每次执行</span><span style="mso-font-kerning: 0pt" lang="EN-US"><font face="Times New Roman">I/O</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">的时候,是以操作系统的块为单位;</span><span style="mso-font-kerning: 0pt" lang="EN-US"><font face="Times New Roman">Oracle</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">每次执行</span><span style="mso-font-kerning: 0pt" lang="EN-US"><font face="Times New Roman">I/O</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">的时候,都是以</span><span style="mso-font-kerning: 0pt" lang="EN-US"><font face="Times New Roman">Oracle</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">的块为单位。</span><span style="mso-font-kerning: 0pt" lang="EN-US"></span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span style="mso-font-kerning: 0pt" lang="EN-US"><font face="Times New Roman">Oracle</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt">数据块大小一般是操作系统块的整数倍。</span><span style="mso-font-kerning: 0pt" lang="EN-US"></span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="mso-font-kerning: 0pt" lang="EN-US"><font face="Times New Roman" size="3">&nbsp;</font></span></p><b><span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">数据块的格式(</span><span lang="EN-US">Data Block Format</span></b><b><span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">)</span><span lang="EN-US"></span></b><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">块中存放表的数据和索引的数据,无论存放哪种类型的数据,块的格式都是相同的,块由块头(</span><span lang="EN-US"><font face="Times New Roman">header/Common and Variable),</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">表目录(</span><span lang="EN-US"><font face="Times New Roman">Table Directory</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">)</span><span lang="EN-US"><font face="Times New Roman">,</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">行目录(</span><span lang="EN-US"><font face="Times New Roman">Row Directory</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">)</span><span lang="EN-US"><font face="Times New Roman">,</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">空余空间(</span><span lang="EN-US"><font face="Times New Roman">Free Space</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">)和行数据(</span><span lang="EN-US"><font face="Times New Roman">Row Data</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">)五部分组成,如下图所示。</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><b style="mso-bidi-font-weight: normal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">块头(</span><span lang="EN-US"><font face="Times New Roman">header/Common and Variable)</font></span></b><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">:存放块的基本信息,如:块的物理地址,块所属的段的类型(是数据段还是索引段)。</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><b style="mso-bidi-font-weight: normal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">表目录(</span><span lang="EN-US"><font face="Times New Roman">Table Directory</font></span></b><b style="mso-bidi-font-weight: normal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">)</span></b><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">:存放表的信息,即:如果一些表的数据被存放在这个块中,那么,这些表的相关信息将被存放在“表目录”中。</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><b style="mso-bidi-font-weight: normal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">行目录(</span><span lang="EN-US"><font face="Times New Roman">Row Directory</font></span></b><b style="mso-bidi-font-weight: normal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">)</span></b><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">:如果块中有行数据存在,则,这些行的信息将被记录在行目录中。这些信息包括行的地址等。</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><b style="mso-bidi-font-weight: normal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">行数据(</span><span lang="EN-US"><font face="Times New Roman">Row Data</font></span></b><b style="mso-bidi-font-weight: normal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">)</span></b><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">:是真正存放表数据和索引数据的地方。这部分空间是已被数据行占用的空间。</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><b style="mso-bidi-font-weight: normal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">空余空间(</span><span lang="EN-US"><font face="Times New Roman">Free Space</font></span></b><b style="mso-bidi-font-weight: normal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">)</span></b><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">:空余空间是一个块中未使用的区域,这片区域用于新行的插入和已经存在的行的更新。</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><b style="mso-bidi-font-weight: normal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">头部信息区(</span><span lang="EN-US"><font face="Times New Roman">Overhead</font></span></b><b style="mso-bidi-font-weight: normal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">)</span></b><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">:我们把块头(</span><span lang="EN-US"><font face="Times New Roman">header/Common and Variable),</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">表目录(</span><span lang="EN-US"><font face="Times New Roman">Table Directory</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">)</span><span lang="EN-US"><font face="Times New Roman">,</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">行目录(</span><span lang="EN-US"><font face="Times New Roman">Row Directory</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">)这三部分合称为头部信息区(</span><span lang="EN-US"><font face="Times New Roman">Overhead</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">)。头部信息区不存放数据,它存放的整个块的信息。头部信息区的大小是可变的。一般来说,头部信息区的大小介于</span><span lang="EN-US"><font face="Times New Roman">84</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">字节(</span><span lang="EN-US"><font face="Times New Roman">bytes</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">)到</span><span lang="EN-US"><font face="Times New Roman">107</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">字节(</span><span lang="EN-US"><font face="Times New Roman">bytes</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">)之间。</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><a href="http://space.itpub.net/batch.download.php?aid=5144" target="_blank" target="_blank"><img src="http://space.itpub.net/attachments/2008/06/13804621_200806041109501.jpg" border="0"></a></span></font></p><p class="a" style="MARGIN: 7.8pt 0cm 0pt"><span lang="EN-US"></span></p><b><span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">数据块中自由空间的使用</span><span lang="EN-US"></span></b><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当往数据库中插入(</span><span lang="EN-US"><font face="Times New Roman">INSERT</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">)数据的时候,块中的自由空间会减少;当对块中已经存在的行进行修改(</span><span lang="EN-US"><font face="Times New Roman">UPDATE</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">)的时候(使记录长度增加),块中的自由空间也会减少。</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><font face="Times New Roman">DELETE</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句和</span><span lang="EN-US"><font face="Times New Roman">UPDATE</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句会使块中的自由空间增加。当使用</span><span lang="EN-US"><font face="Times New Roman">DELETE</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句删除块中的记录或者使用</span><span lang="EN-US"><font face="Times New Roman">UPDATE</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句把列的值更改成一个更小值的时候,</span><span lang="EN-US"><font face="Times New Roman">Oracle</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">会释放出一部分自由空间。释放出的自由空间并不一定是连续的。通常情况下,</span><span lang="EN-US"><font face="Times New Roman">Oracle</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不会对块中不连续的自由空间进行合并。因为合并数据块中不连续的自由空间会影响数据库的性能。只有当用户进行数据插入(</span><span lang="EN-US"><font face="Times New Roman">INSERT</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">)或者更新(</span><span lang="EN-US"><font face="Times New Roman">UPDATE</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">)操作,却找不到连续的自由空间的时候,</span><span lang="EN-US"><font face="Times New Roman">Oracle</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">才会合并数据块中不连续的自由空间。</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对于块中的自由空间,</span><span lang="EN-US"><font face="Times New Roman">Oracle</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提供两种<a target="_self"><u><strong>管理</strong></u></a>方式:自动管理,手动管理</span></font></p><b><span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">行链接和行迁移(</span><span lang="EN-US">Row Chaining and Migrating</span></b><b><span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">)</span><span lang="EN-US"></span></b><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><b style="mso-bidi-font-weight: normal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">行链接(</span><span lang="EN-US"><font face="Times New Roman">Row Chaining</font></span></b><b style="mso-bidi-font-weight: normal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">)</span></b><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">:如果我们往数据库中插入(</span><span lang="EN-US"><font face="Times New Roman">INSERT</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">)一行数据,这行数据很大,以至于一个数据块存不下一整行,</span><span lang="EN-US"><font face="Times New Roman">Oracle</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就会把一行数据分作几段存在几个数据块中,这个过程叫行链接(</span><span lang="EN-US"><font face="Times New Roman">Row Chaining</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">)。如下图所示:</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><a href="http://space.itpub.net/batch.download.php?aid=5145" target="_blank" target="_blank"><img src="http://space.itpub.net/attachments/2008/06/13804621_200806041112071.jpg" border="0"></a></span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><font size="3">如果一行数据是普通行,这行数据能够存放在一个数据块中;如果一行数据是链接行,这行数据存放在多个数据块中。</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><b style="mso-bidi-font-weight: normal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">行迁移</span><span lang="EN-US"><font face="Times New Roman">(Row Migrating)</font></span></b><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">:数据块中存在一条记录,用户执行</span><span lang="EN-US"><font face="Times New Roman">UPDATE</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">更新这条记录,这个</span><span lang="EN-US"><font face="Times New Roman">UPDATE</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">操作使这条记录变长,这时候,</span><span lang="EN-US"><font face="Times New Roman">Oracle</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在这个数据块中进行查找,但是找不到能够容纳下这条记录的空间,无奈之下,</span><span lang="EN-US"><font face="Times New Roman">Oracle</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">只能把整行数据移到一个新的数据块。原来的数据块中保留一个“指针”,这个“指针”指向新的数据块。被移动的这条记录的</span><span lang="EN-US"><font face="Times New Roman">ROWID</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">保持不变。行迁移的原理如下图所示:</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><a href="http://space.itpub.net/batch.download.php?aid=5146" target="_blank" target="_blank"><img src="http://space.itpub.net/attachments/2008/06/13804621_200806041113261.jpg" border="0"></a></span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">无论是行链接还是行迁移,都会影响数据库的性能。</span><span lang="EN-US"><font face="Times New Roman">Oracle</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在读取这样的记录的时候,</span><span lang="EN-US"><font face="Times New Roman">Oracle</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">会扫描多个数据块,执行更多的</span><span lang="EN-US"><font face="Times New Roman">I/O</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span></font></p><b><span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">块中自由空间的自动管理</span><span lang="EN-US"></span></b><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><font face="Times New Roman">Oracle</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用位图(</span><span lang="EN-US"><font face="Times New Roman">bitmap</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">)来管理和跟踪数据块,这种块的空间管理方式叫“自动管理”。自动管理有下面的好处:</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 42.25pt; TEXT-INDENT: -21pt; LINE-HEIGHT: normal; TEXT-ALIGN: left; mso-list: l0 level1 lfo1; tab-stops: list 42.25pt; mso-layout-grid-align: none" align="left"><span style="FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings" lang="EN-US"><span style="mso-list: Ignore"><font size="3">Ø</font><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><font size="3">易于使用</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 42.25pt; TEXT-INDENT: -21pt; LINE-HEIGHT: normal; TEXT-ALIGN: left; mso-list: l0 level1 lfo1; tab-stops: list 42.25pt; mso-layout-grid-align: none" align="left"><span style="FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings" lang="EN-US"><span style="mso-list: Ignore"><font size="3">Ø</font><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><font size="3">更好地利用空间</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 42.25pt; TEXT-INDENT: -21pt; LINE-HEIGHT: normal; TEXT-ALIGN: left; mso-list: l0 level1 lfo1; tab-stops: list 42.25pt; mso-layout-grid-align: none" align="left"><span style="FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings" lang="EN-US"><span style="mso-list: Ignore"><font size="3">Ø</font><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><font size="3">可以对空间进行实时调整</font></span></p><b><span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">块中自由空间的手动管理</span><span lang="EN-US"></span></b><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用户可以通过</span><span lang="EN-US"><font face="Times New Roman">PCTFREE, PCTUSED</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来调整块中空间的使用,这种管理方式叫手动管理。相对于自动管理,手动管理方式比较麻烦,不容易掌握,容易造成块中空间的浪费。</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><font face="Times New Roman">PCTFREE</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">参数用于指定块中必须保留的最小空闲空间百分例。之所以要预留这样的空间,是因为</span><span lang="EN-US"><font face="Times New Roman">UPDATE</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">时,需要这些空间。如果</span><span lang="EN-US"><font face="Times New Roman">UPDATE</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">时,没有空余空间,</span><span lang="EN-US"><font face="Times New Roman">Oracle</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就会分配一个新的块,这会产生行迁移(</span><span lang="EN-US"><font face="Times New Roman">Row Migrating</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">)。</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><font face="Times New Roman">PCTUSED</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">也是用于设置一个百分比,当块中已使用的空间的比例小于这个百分比的时候,这个块才被标识为有效状态。只有有效的块才被允许插入数据。</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman" size="3">&nbsp;</font></span></p><b><span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">行链接,行迁移的解决之道</span><span lang="EN-US"></span></b><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">&nbsp;</font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果数据库中存在行链接,行迁移,将会严重影响数据库的性能。因此,我们应该想办法消除行链接和行迁移。请按照下面的步骤消除行链接和行迁移。</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 12pt; COLOR: #993300" lang="EN-US"><font face="Times New Roman">STEP1</font></span></b><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">:创建数据字典表</span><span lang="EN-US"><font face="Times New Roman">CHAINED_ROWS</font></span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt"><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">数据字典表</span><span lang="EN-US"><font face="Times New Roman">CHAINED_ROWS</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用于接收</span><span lang="EN-US"><font face="Times New Roman">ANALYZE...LIST CHAINED ROWS</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的数据,数据字典表</span><span lang="EN-US"><font face="Times New Roman">CHAINED_ROWS</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">由脚本</span><span lang="EN-US"><font face="Times New Roman">UTLCHAIN.SQL</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或者脚本</span><span lang="EN-US"><font face="Times New Roman">UTLCHN1.SQL</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">创建。</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt"><span lang="EN-US"><font face="Times New Roman" size="3">&nbsp;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 12pt; COLOR: #993300" lang="EN-US"><font face="Times New Roman">STEP2</font></span></b><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><font size="3">:对表进行分析</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 20.75pt"><span lang="EN-US"><font face="Times New Roman" size="3">ANALYZE TABLE student_infor LIST CHAINED ROWS;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 20.75pt"><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">执行这个命令将会把分析的结果写入表</span><span lang="EN-US"><font face="Times New Roman">CHAINED_ROWS</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 20.75pt"><span lang="EN-US"><font face="Times New Roman" size="3">&nbsp;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 12pt; COLOR: #993300" lang="EN-US"><font face="Times New Roman">STEP3</font></span></b><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><font size="3">:查出链接行或者迁移行</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>SELECT *</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 20.75pt"><span lang="EN-US"><font face="Times New Roman" size="3">FROM CHAINED_ROWS</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 20.75pt"><span lang="EN-US"><font face="Times New Roman" size="3">WHERE TABLE_NAME = 'student_infor';</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 20.75pt"><span lang="EN-US"><font face="Times New Roman" size="3">OWNER_NAME TABLE_NAME CLUST... HEAD_ROWID TIMESTAMP</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 20.75pt"><span lang="EN-US"><font face="Times New Roman" size="3">---------- ---------- -----... ------------------ ---------</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 20.75pt"><span lang="EN-US"><font face="Times New Roman" size="3">TT student_infor ... AAAAluAAHAAAAA1AAA 04-MAR-2008</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 20.75pt"><span lang="EN-US"><font face="Times New Roman" size="3">TT student_infor ... AAAAluAAHAAAAA1AAB 04-MAR-2008</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 20.75pt"><span lang="EN-US"><font face="Times New Roman" size="3">TT student_infor ... AAAAluAAHAAAAA1AAC 04-MAR-2008</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: 0cm; mso-para-margin-left: 4.0gd"><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">从数据字典表中</span><span lang="EN-US"><font face="Times New Roman">CHAINED_ROWS</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">查询出链接行或者迁移行。该语句将列出表</span><span lang="EN-US"><font face="Times New Roman">student_infor</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中存在的链接行或者迁移行。如果表中存在链接行或者迁移行,请执行下面的步骤;如果该语句没有任何输出,说明该表不存在链接行或者迁移行。</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: 0cm; mso-para-margin-left: 4.0gd"><span lang="EN-US"><font face="Times New Roman" size="3">&nbsp;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 12pt; COLOR: #993300" lang="EN-US"><font face="Times New Roman">STEP4</font></span></b><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><font size="3">:创建中间表</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>CREATE TABLE int_student_infor</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 20.75pt"><span lang="EN-US"><font face="Times New Roman" size="3">AS SELECT *</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 20.75pt"><span lang="EN-US"><font face="Times New Roman" size="3">FROM student_infor</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 20.75pt"><span lang="EN-US"><font face="Times New Roman" size="3">WHERE ROWID IN</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 20.75pt"><span lang="EN-US"><font face="Times New Roman" size="3">(SELECT HEAD_ROWID</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 20.75pt"><span lang="EN-US"><font face="Times New Roman" size="3">FROM CHAINED_ROWS</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 20.75pt"><span lang="EN-US"><font face="Times New Roman" size="3">WHERE TABLE_NAME = 'student_infor');</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 20.75pt; TEXT-INDENT: 21.5pt"><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中间表</span><span lang="EN-US"><font face="Times New Roman">int_student_infor</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用于临时存放链接行或者迁移行。该表的结构必须和表</span><span lang="EN-US"><font face="Times New Roman">student_infor</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">(本例中的表)的结构完全相同。执行完上面的命令,链接行或者迁移行已经被插入到中间表</span><span lang="EN-US"><font face="Times New Roman">int_student_infor</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中。</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 20.75pt; TEXT-INDENT: 21.5pt"><span lang="EN-US"><font face="Times New Roman" size="3">&nbsp;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 12pt; COLOR: #993300" lang="EN-US"><font face="Times New Roman">STEP5</font></span></b><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">:从已经存在的表</span><span lang="EN-US"><font face="Times New Roman">student_infor</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中删除链接行和迁移行</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>DELETE FROM student_infor</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 20.75pt"><span lang="EN-US"><font face="Times New Roman" size="3">WHERE ROWID IN</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 20.75pt"><span lang="EN-US"><font face="Times New Roman" size="3">(SELECT HEAD_ROWID</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 20.75pt"><span lang="EN-US"><font face="Times New Roman" size="3">FROM CHAINED_ROWS</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 20.75pt"><span lang="EN-US"><font face="Times New Roman" size="3">WHERE TABLE_NAME = 'student_infor');</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman" size="3">&nbsp;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 12pt; COLOR: #993300" lang="EN-US"><font face="Times New Roman">STEP6</font></span></b><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">:把中间表中的数据插入已经存在的表</span><span lang="EN-US"><font face="Times New Roman">student_infor</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font size="3"><font face="Times New Roman"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>INSERT INTO student_infor</font></font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 20.75pt"><span lang="EN-US"><font face="Times New Roman" size="3">SELECT *</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 20.75pt"><span lang="EN-US"><font face="Times New Roman" size="3">FROM int_student_infor;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span lang="EN-US"><span style="mso-tab-count: 1"><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这一步使原来的数据行被重新插入,从而消除行迁移。</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman" size="3">&nbsp;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><b style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 12pt; COLOR: #993300" lang="EN-US"><font face="Times New Roman">STEP7</font></span></b><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><font size="3">:链接行的消除</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 20.75pt"><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果</span><span lang="EN-US"><font face="Times New Roman">CHAINED_ROWS</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中存在链接行,只能通过提高数据块(</span><span lang="EN-US"><font face="Times New Roman">Data Block</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">)的大小,使一行数据能够被容纳在一个数据块中。但是,如果列的类型是</span><span lang="EN-US"><font face="Times New Roman">LONG</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">,或者是宽度比较大的</span><span lang="EN-US"><font face="Times New Roman">CHAR</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">,</span><span lang="EN-US"><font face="Times New Roman">VARCHAR2</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">,行链接将无法避免的。</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman" size="3">&nbsp;</font></span></p><b><span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">数据块大小(</span><span lang="EN-US">Data Block Size</span></b><b><span style="FONT-FAMILY: 黑体; mso-ascii-font-family: Arial">)的选择</span><span lang="EN-US"></span></b><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">通常数据库块的大小都是</span><span lang="EN-US"><font face="Times New Roman">8K</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">,但是</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对于不通的应用(</span><span lang="EN-US"><font face="Times New Roman">OLTP</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">,</span><span lang="EN-US"><font face="Times New Roman">DSS</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">)应该选择不通的块大小。数据库块大小的遵循如下的原则。</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><font size="3">下面的情况可以选择小尺寸数据块:</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 121.5pt; TEXT-INDENT: -21pt; mso-list: l1 level3 lfo2; tab-stops: list 121.5pt"><span style="FONT-FAMILY: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol" lang="EN-US"><span style="mso-list: Ignore"><font size="3"><img style="cursor: pointer;" title="点击图片可在新窗口打开" alt="*" src="file:///D:/DOCUME%7E1/zerocool/LOCALS%7E1/Temp/msohtml1/01/clip_image001.gif" height="11" width="11"></font><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">行的宽度很小,并伴有大量的随机访问(</span><span lang="EN-US"><font face="Times New Roman">Random Access</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">)</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 121.5pt; TEXT-INDENT: -21pt; mso-list: l1 level3 lfo2; tab-stops: list 121.5pt"><span style="FONT-FAMILY: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol" lang="EN-US"><span style="mso-list: Ignore"><font size="3"><img style="cursor: pointer;" title="点击图片可在新窗口打开" alt="*" src="file:///D:/DOCUME%7E1/zerocool/LOCALS%7E1/Temp/msohtml1/01/clip_image001.gif" height="11" width="11"></font><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><font size="3">减少块竞争</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 62.75pt; TEXT-INDENT: 37.75pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><font size="3">注:选择小尺寸数据块会浪费大量的存储空间,</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman" size="3">&nbsp;</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><font size="3">下面的情况可以选择大尺寸数据块:</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 121.5pt; TEXT-INDENT: -21pt; mso-list: l1 level3 lfo2; tab-stops: list 121.5pt"><span style="FONT-FAMILY: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol" lang="EN-US"><span style="mso-list: Ignore"><font size="3"><img style="cursor: pointer;" title="点击图片可在新窗口打开" alt="*" src="file:///D:/DOCUME%7E1/zerocool/LOCALS%7E1/Temp/msohtml1/01/clip_image001.gif" height="11" width="11"></font><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">行的宽度很大,或者含有</span><span lang="EN-US"><font face="Times New Roman">LOB</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">字段</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 121.5pt; TEXT-INDENT: -21pt; mso-list: l1 level3 lfo2; tab-stops: list 121.5pt"><span style="FONT-FAMILY: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol" lang="EN-US"><span style="mso-list: Ignore"><font size="3"><img style="cursor: pointer;" title="点击图片可在新窗口打开" alt="*" src="file:///D:/DOCUME%7E1/zerocool/LOCALS%7E1/Temp/msohtml1/01/clip_image001.gif" height="11" width="11"></font><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">应用中存在大量的顺序读(</span><span lang="EN-US"><font face="Times New Roman">Sequential Access</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">)</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 121.5pt; TEXT-INDENT: -21pt; mso-list: l1 level3 lfo2; tab-stops: list 121.5pt"><span style="FONT-FAMILY: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol" lang="EN-US"><span style="mso-list: Ignore"><font size="3"><img style="cursor: pointer;" title="点击图片可在新窗口打开" alt="*" src="file:///D:/DOCUME%7E1/zerocool/LOCALS%7E1/Temp/msohtml1/01/clip_image001.gif" height="11" width="11"></font><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><font size="3"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">节省</span><span lang="EN-US"><font face="Times New Roman">I/O,</font></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一次可以读入更多的数据量</span></font></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 121.5pt; TEXT-INDENT: -21pt; mso-list: l1 level3 lfo2; tab-stops: list 121.5pt"><span style="FONT-FAMILY: Symbol; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol" lang="EN-US"><span style="mso-list: Ignore"><font size="3"><img style="cursor: pointer;" title="点击图片可在新窗口打开" alt="*" src="file:///D:/DOCUME%7E1/zerocool/LOCALS%7E1/Temp/msohtml1/01/clip_image001.gif" height="11" width="11"></font><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><font size="3">节省存储空间</font></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman" size="3">&nbsp;</font></span></p>
页: [1]
查看完整版本: 数据块(Data Block)原理深入剖析