《《chap数据库存储》PPT课件》由会员分享,可在线阅读,更多相关《《chap数据库存储》PPT课件(205页珍藏版)》请在金锄头文库上搜索。
1、提纲提纲n物理存储介质nRAIDn缓冲区管理n索引n数据库文件n存储分配物理存储介质物理存储介质物理存储介质物理存储介质n高速缓冲存储器(cache)n最快最昂贵的存储介质n很小,由操作系统管理n主存储器(mainmemory)n存放可被处理的数据的存储介质n易失,相对整个数据库太小n快闪存储器(flashmemory)n读性能类似主存,写速度非常慢n电 子 可 擦 除 可 编 程 只 读 存 储 器 (ElectricallyErasableProgrammableRead-OnlyMemory)物理存储介质物理存储介质n磁盘存储器(Magnetic-diskstorage)n直接读取设备,
2、支持随机读取n非易失联机数据存储设备n访问数据时,磁盘内存;修改后的数据,内存磁盘n光学存储器(Opticalstorage)n只读(CD-ROM)、一次写多次读(WORM)、多次写(CD-RW)n磁带(tape)n顺序访问,归档存储,容量大,价格便宜磁盘磁盘磁盘磁盘n基本构成n盘片(platter)、磁道(track)、扇区(sector)、柱面(cylinder)n读写头(read-writehead):反转磁性物质磁化的方向n磁盘臂(diskarm)n磁盘控制器(diskcontroller):接受读写扇区命令,定位读写头。向扇区写入数据时附加校验和(checksum),读取时重新计算校
3、验和磁盘磁盘n扇区(sector)是盘片的最小可寻址单元,每个扇区可容纳512字节的数据,也叫磁盘块。扇区会被集合成簇(cluster),簇也叫数据块,操作系统通常以数据块为单位对硬盘进行读写。n磁道(track)在同一个盘片上以同心圆方式排列的扇区构成一个磁道,磁道的扇区数随同心圆的半径而变化,越靠外的磁道的扇区数越多。n柱面(cylinder)各盘片上位于同一位置的磁道构成一个柱面。构成硬盘的每个碟片都被划分为数目相等的磁道,并从外缘的“0”开始编号,具有相同编号的磁道形成一个圆柱,称之为磁盘的柱面。因此硬盘的柱面数和一个碟片上的磁道数是相同的。磁盘磁盘n磁盘性能度量n访问时间:从发出读写
4、请求到数据开始传输之间的时间。为到达指定扇区,需要先移动磁盘臂,定位到正确的磁道,然后旋转磁盘,直到指定的扇区出现在读写头下方n寻道时间(seektime):磁盘臂重定位时间,取决于目标磁道和磁盘臂当前距离,230毫秒。平均寻道时间是最大寻道时间的1/3n旋转等待时间(rotationallatencytiime):目标扇区旋转到读写头下面的时间,每转在411毫秒之间。平均旋转时间是旋转一周的1/2n数据传输率(data-transferrate),25100兆/秒磁盘访问优化磁盘访问优化n磁盘块的大小n小,更多的磁盘传输次数;大,空间浪费n调度n块在一个柱面上,按块经过读写头的顺序访问;块在
5、不同柱面上,按使磁盘臂移动距离最短的顺序访问n电梯算法n文件组织n按与预期数据访问方式最接近的方式组织磁盘块n碎片整理n日志磁盘n顺序写,消除了寻道时间磁盘的性能指标磁盘的性能指标n(1)容量n磁盘上信息的存储是以同心圆的形式排列的,每一个圆称为一个磁道。半径方向单位长度内的磁道数目称为道密度Dt,沿圆周单位长度上的信息比特数称为位密度Db,道密度与位密度的乘积叫做面密度Da,即Da=DtDb。Da越大表明一个盘片上能存储的信息量就越大。但面密度的提高会使相邻磁道间的数据干扰加大,磁头在磁道上进行数据读写时易发生偏离,差错机率增大。目前最新的垂直级化技术可有效地降低干扰因素。硬盘的容量与碟片数
6、、面密度关系密切,这两项数值越大则容量越大。但是碟片数的增加会使硬盘体积增厚,因此单碟容量的大小直接关系到整个硬盘容量的大小,但随着磁碟密度的提高,磁头就必须随之越来越灵敏。磁盘的性能指标磁盘的性能指标n(2)转速n转速是磁盘所有指标中除了容量之外最引人注目的性能参数,以每分钟多少转(RPM)为单位。转速对于硬盘传输速度和持续传输速度至关重要,转速越快,硬盘取得及传送数据的速度也就越快。目前,硬盘转速大致有4200RPM、5400RPM、7200RPM、10000RPM和15000RPM。磁盘的性能指标磁盘的性能指标n(4)缓存n缓存也是磁盘相当重要的一个参数,其大小也会直接影响到磁盘的整体性
7、能。在数据的读取过程中,硬盘里的控制芯片发出指令,将系统指令正在读取的簇的相邻的下一个或几个簇的数据读入硬盘高速缓存。这样,当系统指令开始要读取下一个簇的数据的时候,硬盘便不需要重新开始一个读取动作,只需要将缓存中的数据传送到系统主存中去就行了。因此缓存容量的加大可以容纳更多的预读数据,这样大大缩短系统等待的时间。目前主流硬盘的缓存通常为8MB和16MB。磁盘的性能指标磁盘的性能指标n(5)传输速率n传输速率分为内传输速率与外传输速率。内传输速率是从硬盘到缓存的传输速度,外传输速率是从缓存到通信接口的传输速度。内传输速率更能反映硬盘的实际表现,通常以每秒MB为单位。目前,主流硬盘的传输速度通常
8、为50100MB/S。磁盘的性能指标磁盘的性能指标n(3)平均寻道时间n平均寻道时间指的是磁头到达目标数据所在磁道的平均时间,它直接影响硬盘的随机数据存取速度。影响平均寻道时间的主要决定因素是磁头读写臂的运行速度,另外也跟单碟容量有关。单碟容量越高说明单碟的磁道数越多,磁道数的增加意味着磁道间距离的缩短,而磁头从一个磁道转移到另一个磁道所需的就位时间就会缩短,这将有助于随机数据传输速度的提高。而磁道内线性磁密度的增加则和硬盘的持续数据传输速度有着直接的联系,磁头技术的发展确保了这个增长不会因为磁头的灵敏度的限制而放慢速度。所以在很多时候,更高单碟容量的5400RPM硬盘会比单碟容量较低的720
9、0RPM硬盘速度更加快。目前硬盘平均寻道时间大约在10ms左右。磁盘调度(磁盘调度(1)nFCFS(先先来来先先服服务务)调调度度先查找先进入服务列队的数据。例:假设磁道数为0199,我们申请调度的盘块儿分别在98,183,37,122,14,124,65,67磁道上。当前硬盘磁头在第53号磁道。按照FCFS顺序:磁头从53号磁道开始移动,按照98,183,37,122,14,124,65,67的顺序依次查找,并将数据输入内存。磁盘调度(磁盘调度(2)nSSTF(最短查找时间优先)调度(最短查找时间优先)调度n考虑了各个请求之间的区别,总是先执行查找时间最短的那个请求。磁头从53号磁道开始移动
10、,按照65,67,37,14,98,122,124,183的顺序依次查找,并将数据输入内存。磁盘调度(磁盘调度(3)nSCAN(扫描)调度(扫描)调度n此种调度算法为磁臂由磁盘的一端开始,移动到磁盘的另一端,在移动过程中,为访问请求服务。然后调转方向,从此端移动到另一端。磁头从53号磁道开始移动,按照37,14,0,65,67,98,122,124,183,199的顺序依次查找,并将数据输入内存。磁盘调度(磁盘调度(4)nC-SCAN(环形扫描)调度(环形扫描)调度n移动臂总是从0号柱面至最大号柱面顺序扫描,然后返回0号柱面重复进行。磁头从53号磁道开始移动,按照65,67,98,122,12
11、4,183,199,0,14,37的顺序依次查找(其中从1990的过程中不做任何操作只是快速的移动),并将数据输入内存。磁盘调度(磁盘调度(5)nLOOK(查找)调度(电梯)(查找)调度(电梯)n电梯算法。磁臂仅移动到请求的最外道就回转。反方向查找服务。磁头从53号磁道开始移动,按照65,67,98,122,124,183,14,37的顺序依次查找,并将数据输入内存。RAIDRAIDn廉价磁盘冗余阵列(RAID)nRedundant Arrays of Inexpensive Disksn是一种利用大量廉价磁盘进行磁盘组织的技术n价格上,大量廉价的磁盘比少量昂贵的大磁盘合算得多n性能上,使用大
12、量磁盘可以提高数据的并行存取n可靠性上,冗余数据可以存放在多个磁盘上,因此一个磁盘的故障不会导致数据丢失n过去RAID是大而昂贵的磁盘的替代方法;今天,使用RAID是因为它的高可靠性和高数据传输率;因此 “I” 代表independent,而非inexpensiveRAIDRAIDn通过冗余提高可靠性nN个磁盘组成的集合中某个磁盘发生故障的概率比特定的单个磁盘发生故障的概率高很多 n假定单个磁盘的MTTF是100,000小时 (约为11年),则由100个磁盘组成的阵列的MTTF是1000小时(约为41天)n冗余(Redundancy)n存储额外的信息,以便当磁盘故障时能从中重建nMTTF(Me
13、anTimeToFailure)平均失效等待时间RAIDRAIDn镜像(Mirroring or shadowing)n一个逻辑磁盘由两个物理磁盘组成,写操作在每个磁盘上执行n如果其中一个发生故障,数据可以从另一个磁盘读出n只有第一个磁盘的故障尚未恢复,第二个磁盘也发生故障,这时才会发生数据丢失n假定一个磁盘的MTTF是100,000小时,修复时间是 10小 时 , 则 镜 像 磁 盘 系 统 的 MTTF是100,0002/(2*10)=500*106小时,约为57000年RAIDRAIDn通过并行提高性能n负载平衡多个小的存取操作(即页面存取),以提高这种存取操作的吞吐量n并行执行大的存取
14、操作,以减少大的存取操作的响应时间n通过在多个磁盘上对数据进行拆分来提高传输率n比特级拆分(Bit-level striping)n将每个字节按比特分开,存储到多个磁盘上n例如,对于一个由8个磁盘组成的阵列,将每个字节的第i个比特位写到第i个磁盘上;它的存取速度是单个磁盘的8倍n对于由4个磁盘组成的阵列,将每个字节的第i个比特位和第i+4个比特位写到第i个磁盘上n块级拆分(Block-level striping)n对于由n个磁盘构成的阵列,文件的第i块 存放在第(i mod n) + 1个磁盘上RAIDRAIDnRAID级别n镜像提供高可靠性,拆分提供高数据传输率,通过利用与奇偶校验相结合的
15、磁盘拆分想法,可以实现以较低成本提供冗余的方案n不同的RAID级别,具有不同的代价、性能和可靠性CP代表数据的第二个拷贝表示纠错位RAID 0RAID 0n块级拆分且没有任何冗余(如镜像或奇偶校验位)的磁盘阵列n容错性:容错性:没有冗余类型:冗余类型:没有读性能:读性能:高随机写性能:随机写性能:高连续写性能:连续写性能:高需要的磁盘数:需要的磁盘数:1个或多个可用容量:可用容量:总的磁盘的容量n用于高性能访问并且数据丢失不十分重要的应用场合,无故障的迅速读写,要求安全性不高,如图形工作站等。RAID 0:无冗余拆分RAID 1RAID 1n带块级拆分的磁盘镜像n容错性:容错性:有冗余类型:冗
16、余类型:复制读性能:读性能:低随机写性能:随机写性能:低连续写性能:连续写性能:低需要的磁盘数:需要的磁盘数:只需2个或2*N个可用容量:可用容量:只能用磁盘容量的50%n一般用于类似于数据库系统中日志文件存储的应用场合。随机数据写入,要求安全性高,如服务器、数据库存储领域。RAID 1:无冗余拆分CCCC汉明码汉明码n汉明码是一个在原有数据中插入若干校验码来进行错误检查和纠正的编码技术。n以典型的4位数据编码为例,汉明码将加入3个校验码,从而使实际传输的数据位达到7个(位):汉明码汉明码n例:若数据码1101,此时D8=1、D4=1、D2=0、D1=1,在P1编码时,先将D8、D4、D1的二
17、进制码相加,结果为奇数3,汉明码对奇数结果编码为1,偶数结果为0,因此P1值为1,D8+D2+D1=2,为偶数,那么P2值为0,D4+D2+D1=2,为偶数,P3值为0。n参照位置表,汉明码处理的结果就是1010101。在这里汉明码都是以三个数据码为基准进行编码的。图示就是它们的对应表:汉明码汉明码n在校验时则把每个汉明码与各自对应的数据位值相加,如果结果为偶数就是正确,如果为奇数则说明当前汉明码所对应的三个数据位中有错误,此时再通过其他两个汉明码各自的运算来确定具体是哪个位出了问题。n1101,正确的编码为1010101,如果第三个数据位在传输途中 因 干 扰 而 变 成 了 1, 就 成
18、了 1010111 。 检 测 时 ,P1+D8+D4+D1的结果是偶数4,第一位纠错代码为0,正确。P1+D8+D2+D1的结果是奇数3,第二位纠错代码为1,错误。P3+D4+D2+D1的结果是奇数3,第三位纠错代码为1,错误。n那么具体是哪个位有错误呢?三个纠错代码从高到低排列为二进制编码110,换算成十进制就是6,也就是说第6位数据错了,而数据第三位在汉明码编码后的位置正好是第6位。汉明码汉明码n汉明码的数量与数据位的数量之间的关系:2PP+D+1,其中P代表汉明码的个数,D代表数据位的个数。n4位数据需要3位汉明码(234+3+1),64位数据需要7位汉明码(2764+7+1。n汉明码
19、加插的位置也是有规律的。汉明码的插入位置为1、2、4、8、16RAID 2RAID 2n在RAID2中,一个硬盘在一个时间只存取一位的信息。左边的为数据阵列,右边的阵列则是存储相应的汉明码,也是一位一个硬盘。所以RAID2中的硬盘数量取决于所设定的数据存储宽度。n在写入时,RAID2在写入数据位同时还要计算出它们的汉明码并写入校验阵列,读取时也要对数据即时进行校验。汉明码只能纠正一个位的错误,所以RAID2也只能允许一个硬盘出问题,如果两个或以上的硬盘出问题,RAID2的数据就将受到破坏。但由于数据是以位为单位并行传输,所以传输率也相当快。nRAID2是早期为了能进行即时的数据校验而研制的一种
20、技术,针对了当时对数据即时性非常敏感的领域,如、金融服务等。但由于花费太大(数据位宽越大,用于校验阵列的相对投资就会越小,4:3与64:7),成本昂贵,目前已基本不再使用,转而以更高级的即时检验RAID所代替,如RAID3、5等。PPPRAID 2RAID 2nRAID2使用共轴同步(spindlesynchronize)技术,存取数据时,整个磁盘阵列一起动作,在各个磁盘的相同位置作平行存取,有最好的存取时间(accesstime),以大带宽(bandwide)并行传输所存取的数据,有最好的传输时间(transfertime)n对于大型档案的存取应用,RAID2有较好的性能,但如果档案太小,性
21、能会下降,因为磁盘的存取是以扇区为单位,而RAID2的存取是所有磁盘平行动作,故小于一个扇区的数据量会使其性能大打折扣nRAID2适合于存取连续且大量数据的应用,如大型电脑、作影像处理或CAD/CAM的工作站等RAID 3RAID 3nParalleltransferwithparity(并行传输及校验)nRAID3是在RAID2基础上发展而来的,主要的变化是用相对简单的异或逻辑运算(XOR,eXclusiveOR)校验代替了相对复杂的汉明码校验,从而也大幅降低了成本。nRAID 3效果与RAID 2一样,但只有一个磁盘的额外开销PRAID 3RAID 3nRAID3校验盘只有一个,而数据与R
22、AID0一样是分成条带存入数据阵列中,这个条带的深度的单位为字节而不是bit。在数据存入时,数据阵列中处于同一等级的条带的XOR校验编码被即时写在校验盘相应的位置,所以彼此不会干扰混乱。读取时,则在调出条带的同时检查校验盘中相应的XOR编码,进行即时的ECC。由于在读写时与RAID 0很相似,所以RAID3具有很高的数据传输效率。nRAID3在RAID2基础上成功地进行结构与运算的简化,曾受到广泛的欢迎,并大量应用。直到更为先进高效的RAID5出现后,RAID3才开始慢慢退出市场。RAID 3RAID 3D1 11110000D2 10101010D3 00111000D1 11110000D
23、2 ?D3 00111000D4 01100010D2 10101010故障恢复D4 01100010生成校验盘RAID 3RAID 3D2 10101010D4 00000100写操作D2 11001100D1 11110000D2 11001100D3 00111000读D1,D3,写D2,D4D2 10101010D2 1100110001100110D4 01100010读D2,D4,写D2,D4RAID 4RAID 4nIndependentDatadiskswithsharedParitydisk(独立的数据硬盘与共享的校验硬盘)n与RAID3相比,关键之处是把条带改成了“块”。即
24、RAID4是按数据块为单位存储的。一个数据块是一个完整的数据集合,比如一个文件就是一个典型的数据块。按块存储可以保证块的完整,不受因分条带存储在其他硬盘上而可能产生的不利影响(比如当多个硬盘损坏)。n在不同硬盘上的同级数据(在每个硬盘中同一柱面同一扇区位置的数据)块也通过XOR进行校验,结果保存在单独的校验盘。在写入时,RAID把各硬盘上同级数据的校验统一写入校验盘,读取时再即时进行校验。因此即使是当前硬盘上的数据块损坏,也可以通过XOR校验值和其他硬盘上的同级数据进行恢复。nRAID4在写入时要等一个硬盘写完后才能写一下个,还要写入校验数据所以写入效率比较差,读取时也是一个硬盘一个硬盘的读,
25、但校验迅速,所以相对速度很快。RAID 4:块交叉奇偶校验PRAID 4RAID 4D2 10101010D3 00111000D4 01100010D1 11110000RAID 4RAID 4D2 10101010D3 00111000D4 01100010读数据:一种潜在的并行假定D1忙,其余磁盘空闲D1 11110000RAID 4RAID 4RAID 5RAID 5n将数据和奇偶校验位都分布到所有的N+1个磁盘上;对每个块,一个磁盘存储奇偶校验位,其余磁盘存储数据n例如由5个磁盘组成的阵列,第n块的奇偶校验位存储在第(n mod 5)+1上,其余4个磁盘的第n块存储了对应这个块的实际
26、数据n奇偶校验块不能和这个块对应的数据存储在同一个磁盘上n所有磁盘都参与对读请求的服务,而RAID 4中奇偶校验磁盘不参与读操作nRAID 5包容了RAID 4,同时在相同成本下,提供了更好的读写性能RAID 5:块交叉的分布奇偶校验PPPPPRAID 6RAID 6D1D2D3D4D5D6D7111010011010101011001HammingcodeD5对应D1,D2,D3D6对应D1,D2,D4D7对应D1,D3,D4RAID 6RAID 6D1 11110000D2 10101010D3 00111000D4 01000001生成校验盘D5 01100010D6 00011011D
27、7 10001001RAID 6RAID 6D1 11110000D2 ?D3 00111000D4 01000001D5 ?D6 00011011D7 10001001故障恢复取D1,D4,D6D2 10101010取D1,D2,D3D5 01100010RAID 6RAID 6写操作D2 10101010D2 00001111D210101010D2 0000111110100101D501100010D6 00011011D6 10111110D5 11000111高性能可靠性差最佳写性能开销大高数据传输率大数据量高的总I/O率适合随机读大数据量高可靠性选择合适的选择合适的RAIDRAI
28、D级别级别nRAID0是最快,最有效率的阵列类型,但是不支持容错功能。nRAID1适合性能要求较高又需要容错功能的阵列。另外,RAID1是在只有少于2个磁盘的环境下支持容错功能的唯一选择。nRAID3被用在数据加强和加速单用户对连续的长记录时的数据传输。nRAID5是在多用户,对数据写入的性能要求不高的环境下的最好选择。然而,它要求至少3个,通常使用5个磁盘来执行。nRAID10集良好的可靠性和高性能于一身.选择合适的选择合适的RAIDRAID级别级别nRAID 0n无冗余拆分nRAID 1n镜像nRAID 5n拆分校验码nRAID 10n拆分镜像选择合适的选择合适的RAIDRAID级别级别选
29、择合适的选择合适的RAIDRAID级别级别选择合适的选择合适的RAIDRAID级别级别n日志文件nRAID 1n容错,高写输出率n临时文件nRAID 0 is appropriate. n无容错,高吞吐率n数据以及索引文件nRAID 5适合于读为主的应用nRAID 10适合于写为主的应用磁盘还是内存磁盘还是内存n保持常用数据在内存,可以减少磁盘I/O,但增加内存代价n若一个页面每秒被访问n次,将它驻留在内存节省n保持一个页面在内存的代价n*price-per-disk-driveaccesses-per-second-per-diskprice-per-MB-of-memorypages-pe
30、r-MB-of-memory磁盘还是内存磁盘还是内存n5-minuterule:如果一个被随机访问的页面的使用频率超过每5分钟一次,那么它应该被驻留在内存n1-minuterule:如果被顺序访问的页面的使用频率超过每1分钟一次,那么它应该被驻留在内存price-per-disk-drive=2000$/diskaccesses-per-second-per-disk=64accesses/second/diskprice-per-MB-of-memory=15$/MB_RAMpages-per-MB-of-memory=128pages/MB2000*128/15/64/=266缓冲区管理缓
31、冲区管理n当需要访问一个磁盘块时n如果该块已经在缓冲区中,返回块在内存中的地址n如果块不在缓冲区中n缓冲区管理器为该块在缓冲区中分配空间,如果有必要,替换缓冲区中的其他块n如果被替换的块被修改过,则将其写回磁盘n将所需的块调入缓冲区,返回其在缓冲区的地址缓冲区管理缓冲区管理n被钉住的块(pinnedblocks)n不允许写回磁盘的块n当一个块上的更新正在进行时,不允许写回磁盘n钉住被频繁访问的小表n块的强制输出(forcedoutputofblocks)n先写日志原则n检查点n提交事务的日志记录缓冲区管理缓冲区管理:替换策略:替换策略nLRU(最近最少使用)n如果必须替换一个块,则替换最近最少
32、使用的块nMRU(最近最常使用)n如果必须替换一个块,则替换最近最常使用的块对于R中的每条元组tr对于S中的每条元组tsn一旦R中的一个元组处理完,就不会再使用它了,应该立即丢弃(tossimmediate)n当 S中 的 一 个 元 组 被 处 理 完 , 只 有 其 他S中的元组都被处理完后才会再用到它,应该采用MRU替换策略替换策略n当使用者第一次向数据库发出查询数据的请求时,数据库会先在缓冲区中查找该数据,如果要访问的数据恰好已经在缓冲区中(称之为CacheHit),那么就直接用缓冲区中读取该数据.n反之如果缓冲区中没有使用者要查询的数据称之为CacheMiss,这种情况下数据库就会先
33、从磁盘上读取使用者要的数据放入缓冲区,使用者再从缓冲区读取该数据.n很显然CacheHit会比CacheMiss时存取速度快.OPTIMAL/FIFOnOPTIMAL:最佳置换算法。它是由Belady于1966年提出的一种理论上的算法。其所选择的被淘汰页面,将是以后永不使用的,或是在最长(未来)时间内不再被访问的页面。采用最佳置换算法,通常可保证获得最低的缺页率。但由于人目前还无法预知一个进程在内存的若干个页面中,哪一个页面是未来最长时间内不再被访问的,因而该算法是无法实现的,一般可以利用此算法来评价其它算法。nFIFO:先进先出置换算法。这是最早出现的置换算法。该算法总是淘汰最先进入内存的页
34、面,即选择在内存中驻留时间最久的页面予以淘汰。该算法实现简单只需把一个进程已调入内存的页面,按先后次序链接成一个队列,并设置一个指针 , 称 为 替 换 指 针 , 使 它 总 是 指 向 最 老 的 页 面 。 例例n在一个请求分页存储管理系统中,一个作业的页面走向为4、3、2、1、4、3、5、4、3、2、1、5,当分配给该作业的物理块数分别为3、4时,试计算采用下述页面淘汰算法时的缺页次数(假设开始执行时主存中没有页面),并比较所得结果。n(1)最佳置换法(OPT)n(2)先进先出法(FIFO)例例n最佳页面置换算法:块为3:缺页次数为7n块为3:缺页次数为6例例例例n先进先出页面置换算法
35、:块为3:缺页次数为9n块为3:缺页次数为10LRUnLRU算法(Leastrecentlyused)的基本概念是:当内存的剩余的可用空间不够时,缓冲区尽可能的先保留使用者最常使用的数据,就是优先清除”较不常使用的数据”,并释放其空间.nFIFO置换算法性能之所以较差,是因为它所依据的条件是各个页面调入内存的时间,而页面调入的先后并不能反映页面的使用情况。最近最久未使用(LRU)置换算法,是根据页面调入内存后的使用情况进行决策的。由于无法预测各页面将来的使用情况,只能利用“最近的过去”作为“最近的将来”的近似,因此,LRU置换算法是选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字
36、段,用来记录一个页面自上次被访问以来所经历的时间t,,当须淘汰一个页面时,选择现有页面中其t值最大的,即最近最久未使用的页面予以淘汰。LRUn7012030423032120170n7012030423032120170701203042303212017 701223042203312017711230444003322n*n缺页中断次数:8LFUn最近最少使用淘汰法LFU(LeastFrequentlyUsed)(记录各个页面在最近一段时间内被使用的次数,淘汰使用次数最少的页面。n7012030423032120170-7012000023032220110 701222202303332
37、001 70111440220003222-7733334444111377*缺页中断次数:8缓冲区管理缓冲区管理:SQLServern访问内存页面n为快速找到页面,内存页面地址被散列n给定dbid-fileno-pageno标识(数据库ID,文件号、页面号的组合),计算其hash地址nLazywriter(缓冲池管理器)n使用时钟算法时钟算法时钟算法nSQLServer2000使用一个专门的进程,采用时钟算法进行页面置换。它为每个缓冲区设置一个计数器,每隔一段时间则顺序扫描缓冲池里的每一个缓冲区,检查计数器。如果计数器为零,则说明这一缓冲区可回收使用。于是,系统先将缓冲区内脏数据写入磁盘,而
38、后将缓中区放入自由缓冲区列表。如果计数器的值不为零,系统则将计数器的值减少。而当某个进程访问缓冲区的数据时,该缓冲区的计数器则会增加。n对于缓冲区内那些通过较高代价产生的对象,系统使用具有较高参考价值的计数器。在顺序扫描时,这些计数器的值不是简单的减少,而是以某种策略缩小(如除以4),这样可以保证它不会很快变成零,从而可以在内存中贮存较长时间。n其它类似用到缓冲区的设计(当缓存不足以放下所有数据或为了节省内存),均可参考此种替换策略。索引索引n顺序索引n基于值的顺序排序n散列索引n基于将值平均分布到若干散列桶中n索引评价指标n访问类型n访问时间n插入时间n删除时间n空间开销主索引和辅助索引主索
39、引和辅助索引n主索引(primaryindex)、辅助索引(secondaryindex);聚集索引(clusterindex)、非聚集索引(nonclusterindex)branch_namebalance主索引主索引n主索引包含表中每条记录的索引关键字并且当未指定任何其他索引作为表主索引时的默认索引。主索引禁止为产生索引关键字所指定字段或索引表达式中的重复值;因此,主索引中每个索引关键字是唯一的。每个表只能创建一个主索引。n注意:主索引是数据库表的整体部分。如果从数据库中释放一个表,则主索引被移去。如果在任何包含重复数据的字段上指定主索引,将产生一个错误。唯一索引唯一索引n索引还可以用于
40、强迫字段数值的唯一性,或者是多个字段组合值的唯一性:CREATEUNIQUEINDEXnameONtable(column,.);目前,只有B-tree索引可以声明为唯一的。n如果索引声明为唯一的,那么就不允许出现多个索引值相同的行。我们认为NULL值相互间不相等。一个多字段唯一索引认为只有两行数据里所有被索引字段都相同的时候才是相同的,这种数据才被拒绝。n如果一个表声明了一个唯一约束或者一个主键,那么SQL自动在那些组成主键或者唯一字段的列上创建唯一索引(可能地话是一个多字段索引),以强迫这些约束。n注注意意:给一个表增加唯一约束的比较好的办法是ALTERTABLE.ADDCONSTRAIN
41、T。我们没有必要在唯一字段上建立索引,那样做只会重复建立自动创建的索引。主索引主索引VS唯一索引唯一索引n主索引一定是唯一索引;n唯一索引不一定是主索引;n主索引只有一个;n唯一索引可有多个聚集索引聚集索引(ClusteredIndex)n聚集索引规定数据在表中的物理存储顺序:聚集索引表记录的排列顺序与索引的排列顺序一致。因此一个表只能包含一个聚集索引。但该索引可以包含多个列(组合索引)。n聚集索引对于那些经常要搜索范围值的列特别有效。使用聚集索引找到包含第一个值的行后,便可以确保包含后续索引值的行在物理相邻。这样有助于提高此类查询的性能。同样,如果对从表中检索的数据进行排序时经常要用到某一列
42、,则可以将该表在该列上聚集(物理排序),避免每次查询该列时都进行排序,从而节省成本。聚集索引聚集索引n当索引值唯一时,使用聚集索引查找特定的行也很有效率。例如,使用唯一雇员 ID 列emp_id查找特定雇员的最快速的方法,是在emp_id列上创建聚集索引或PRIMARYKEY约束。n说明如果该表上尚未创建聚集索引,且在创建PRIMARYKEY约束时未指定非聚集索引,PRIMARYKEY约束会自动创建聚集索引。n也可以在lname(姓氏)列和fname(名字)列上创建聚集索引,因为雇员记录常常是按姓名而不是按雇员ID分组和查询的聚集索引聚集索引n聚集索引的叶节点就是实际的数据页n在数据页中数据按
43、照索引顺序存储n行的物理位置和行在索引中的位置是相同的n每个表只能有一个聚集索引n聚集索引的平均大小大约为表大小的5%左右聚集索引聚集索引nselect*fromtablewherefirstName=Ota非聚集索引非聚集索引(UnclusteredIndex)n非聚集索引数据存储在一个地方,索引存储在另一个地方,索引带有指针指向数据的存储位置。索引中的项目按索引键值的顺序存储,而表中的信息按另一种顺序存储。nSQLServer2000在搜索数据值时,先对非聚集索引进行搜索,找到数据值在表中的位置,然后从该位置直接检索数据。这使非聚集索引成为精确匹配查询的最佳方法,因为索引包含描述查询所搜索
44、的数据值在表中的精确位置的条目。如果基础表使用聚集索引排序,则该位置为聚集键值;否则,该位置为包含行的文件号、页号和槽号的行ID(RID)。例如,对于在emp_id列上有非聚集索引的表,如要搜索其雇员ID(emp_id),SQLServer会在索引中查找这样一个条目,该条目精确列出匹配的emp_id列在表中的页和行,然后直接转到该页该行。非聚集索引非聚集索引n非聚集索引的页,不是数据,而是指向数据页的页。n若未指定索引类型,则默认为非聚集索引n叶节点页的次序和表的物理存储次序不同n每个表最多可以有249个非聚集索引n在非聚集索引创建之前创建聚集索引(否则会引发索引重建)非聚集索引非聚集索引ns
45、elect*fromemployeewherelname=Green比较比较n聚集索引和非聚集索引的根根本本区区别别是是表表记记录录的的排排列列顺顺序序和和与与索索引引的的排排列列顺顺序序是是否否一一致致,聚集索引表记录的排列顺序与索引的排列顺序一致,优点是查询速度快,因为一旦具有第一个索引值的纪录被找到,具有连 续 索 引 值 的 记 录 也 一 定 物 理 的 紧 跟 其 后 。聚集索引的缺点是对表进行修改速度较慢,这是为了保持表中的记录的物理顺序与索引的顺序一致,而把记录插入到数据页的相应位置,必须在数据页中进行数据重排,降低了执行速度。n建议使用聚集索引的场合为:a.此此 列列 包包
46、含含 有有 限限 数数 目目 的的 不不 同同 值值 ; b.查查 询询 的的 结结 果果 返返 回回 一一 个个 区区 间间 的的 值值 ; c.查查 询询 的的 结结 果果 返返 回回 某某 值值 相相 同同 的的 大大 量量 结结 果果 集集 。 比较比较n非聚集索引指定了表中记录的逻辑顺序,但记录的物理顺序和索引的顺序不一致,聚集索引和非聚集索引都采用了B+树的结构,但非聚集索引的叶子层并不与实际的数据页相重叠,而采用叶子层包含一个指向表中的记录在数据页中的指针的方式。非聚集索引比聚集索引层次多,添加记录不会引起数据顺序的重组。n建议使用非聚集索引的场合为:na.此列包含了大量数目不同
47、的值;此列包含了大量数目不同的值;b.查询的结束返回的是少量的结果集;查询的结束返回的是少量的结果集;c.orderby子句中使用了该列。子句中使用了该列。何时使用聚集索引或非聚集索引何时使用聚集索引或非聚集索引稠密索引稠密索引n文件中的每个搜索码值都有一个索引记录稀疏索引稀疏索引n只为搜索码的某些值建立索引记录多层索引多层索引n对索引建立索引B+树树n树结点nKi是搜索码,Pi是指针B+树树n每个非叶结点有n/2到n个子女B+树树n插入导致结点分裂插入ClearviewB+树树B+树树n删除导致结点合并删除DowntownB+树树散列索引散列索引n桶(bucket)n存储一条或多条记录的存储
48、单元n散列(hash)nK是搜索码,B是桶地址,散列函数h(K)=Bn散列函数n分布是均匀的,桶包含记录的个数是均匀的n分布是随机的,散列值不能与搜索码的值呈现出相关性n桶溢出(bucketoverflow)n桶不足(insufficientbucket)+偏斜(skew)散列索引散列索引散列索引散列索引n溢出链位图索引位图索引n针对一些特殊的列建立索引n列中的每一个值对应一个向量中的一位n向量的长度对应与记录的条数n不适合列中值的个数太多的情况Base tableIndex on RegionIndex on Type位图索引位图索引n查询:nSelectcustFromBaseTableW
49、hereRegion=AsiaandType=Dealer;nBitMapforRegion(Asia):10100nBitMapforType(Dealer):01101n查询结果:向量与操作:00100位图索引位图索引与B树的大小对比位图索引位图索引n设表中有10M个记录,每个记录长800字节,每一页16K字节,则扫描此表共需50万次I/O操作位图索引位图索引n对 于 10M个 记 录 建 立 三 列 的 位 图 索 引 共 占(10Mbit*3列/8)字节的空间,每页16K,则这些索引仅占235页,因此存取这些索引只要235次I/O操作 位图索引位图索引RID Item GenderR1
50、aFR2aMR3bFR4bFR5bMR6cFR7cMR8dMRID M FR10 1R21 0R30 1R40 1R51 0R60 1R71 0R81 0RIDabcdR11000R21000R30100R40100R50100R60010R70010R80001基本表Item位图索引Gender位图索引编码位图索引编码位图索引RID Item GenderR1aFR2aMR3bFR4bFR5bMR6cFR7cMR8dMRIDB1 B0R100R200R301R401R501R610R710R811基本表Item编码位图索引Item值 编码值a00b01c10d11映射表简单位图需要简单位图需
51、要简单位图需要简单位图需要4 4个向量,编码位图需要个向量,编码位图需要个向量,编码位图需要个向量,编码位图需要loglog2 24=24=2个个个个编码位图索引编码位图索引如果属性I的取值v0被编码为b1b0,检索函数被定义 为 x1x0, 其 中 如 果 bi=1, 则 xi=Bi, 否 则xi=Bi(Bi为Bi的非)检索函数fa = B1B0 ,fb = B1B0fc = B1B0 ,fd = B1B0如果检索取值为a或b的元组, fa or fb = B1B0 or B1B0 = B1位片索引位片索引(Bit-sliced Index)(Bit-sliced Index)n位片索引是将
52、属性列的域值按照某种方式进行垂直分割,然后以二进制位图的形式存储 位片索引位片索引3/13/13/13/13/13/13/13/13236384143464749NYMANYCTNYRICTNYAABAABBA6951193712101010011101100101011001101000111001011001111110date store state class salesstate= NYclass=Asales in binary form 8 4 2 1selectsum(sales)fromcustomerswherestate=NYandclass=A多维索引多维索引n空间数据
53、多维索引多维索引n空间查询n临近查询查询位于特定位置附近的对象n最近邻查询(nearestneighborquery)查询离特定位置最近的对象nKNN查询离特定位置最近的k个对象n区域查询查询位于指定区域内的对象空间索引空间索引n空空间间索索引引是是对对存存储储在在介介质质上上的的数数据据位位置置信信息息的的描描述述,用用来来提提高高系系统统对对数数据据获获取取的的效效率率。空空间间索索引引的的提提出出是是由由两两方方面面决决定定的的:其其一一是是由由于于计计算算机机的的体体系系结结构构将将存存贮贮器器分分为为内内存存、外外存存两两种种,访访问问这这两两种种存存储储器器一一次次所所花花费费的的
54、时时间间一一般般为为3040ns,810ms,可可以以看看出出两两者者相相差差十十万万倍倍以以上上,尽尽管管现现在在有有“内内存存数数据据库库”的的说说法法,但但绝绝大大多多数数数数据据是是存存储储在在外外存存磁磁盘盘上上的的,如如果果对对磁磁盘盘上上数数据据的的位位置置不不加加以以记记录录和和组组织织,每每查查询询一一个个数数据据项项就就要要扫扫描描整整个个数数据据文文件件,这这种种访访问问磁磁盘盘的的代代价价就就会会严严重重影影响响系系统统的的效效率率,因因此此系系统统的的设设计计者者必必须须将将数数据据在在磁磁盘盘上上的的位位置置加加以以记记录录和和组组织织,通通过过在在内内存存中中的的
55、一一些些计计算算来来取取代代对对磁磁盘盘漫漫无无目目的的的的访访问问,才才能能提高系统的效率提高系统的效率多维索引:多维索引:k-d树树n树顶层结点按一维划分,下一层按另一维划分,保持每侧各落入一半数据,依此类推,直到每个区域所包含的数据点数不超过1为止。k-d树树nKD树就是一个二叉数,它的内部结点有一个相关联的属性a和一个属性V,它将数据点分成两个部分:a值小于V的部分和a值大于等于V的部分。由于所有维的属性在层间循环,所以树的不同层上的属性是不同的。它的每一层通过检测不同的属性(关键字)值以决定选择分枝的方向。n以两个属性的KD树为例。设每个数据点用树中一个结点来表示,每个记录是通过结点
56、中的六个域表现出来。其中LcdPt域和RcdPt域分别表示指向左孩子结点和右孩子结点的指针;Xcoord和Ycoord各自保存数据点X和Y的坐标值或属性值;NAME域用来保存结点描述信息,即属性(例如薪水);Disc域表示结点识别的坐标名(也就是比较坐标名)。n(1)在二维空间中(2-D树)讨论;n(2)根的深度为0,在根和偶数层比较X坐标值,在奇数层比较Y坐标值。n(3)内部结点只有一个属性,它的一个划分值指向左、右孩子的指针;n(4)叶结点是块,块空间中存放着尽可能多的记录。n(5)共属同一个父结点的两个结点互称为兄弟结点。K-dn假定相关的属性只有顾客的年龄和薪水。数据库中有12个顾客。
57、把它表示成下列的年龄薪水对:(25,60)(45,60)(50,75)(50,100)(70,110)(85,140)(30,260)(25,400)(50,275)(60,260)(50,120)(45,350)顾客的各种信息存储在二维表中,我们设其表名为CustomerTb,其中数据块是以年龄代表数据记录,每一块包含两个数据记录。KDnKD树的更新对于KD树的查找,跟二叉树一样,在每个内部结点上决定了沿哪个走向,最终搜索到所查找的结点的块,或者是搜索失败,没有查找到相应的叶结点。n为实现一个插入,首先要查找,定位到叶结点,如果叶结点的块中还有空间,就把新的数据点放在那里,如果没有空间,就把
58、块分裂成两块。并根据分裂叶结点的所在层的相应属性划分叶结点中的内容。最后创建一个新的内结点,它的子结点为分裂的两个新块,并且给该内结点一个与分裂的相应的划分值。KD插入插入n例如某年龄为35且薪水为¥500K的顾客加入。从根上的X坐标值,我们可知薪水至少是¥150K,因而往右边走;在该右结点处,拿年龄35跟Y坐标值表示的年龄47比较,它使我们往左边:在第三层上,我们再次比较X坐标值表示的薪水,且我们的薪水大于划分值¥300K。因此我们被引向包含点(25,400)和(45,350)的叶结点,新结点(35,500)需插入该块。但是,由于每一块只能存放两条记录,所以我们必须分裂该块。第四层按Y坐标值
59、来分,为能够均匀划分这些记录,我们取中间值35作为新的内结点。该内结点的左边只有一个记录(25,400),而右边是有另外两个记录的叶结点块。KD删除删除n若实现一个结点的删除,首先考虑是内部结点还是叶结点。如果是内部结点,我们可以先对结点做删除标记,当已经标记了足够量的结点时,便可对未标记的结点重建KD树。如果是叶结点,则直接删除即可。对于一个记录的删除,首先我们按照上面的查找算法找到该结点,然后在结点内部利用顺序查找法定位到该记录(若记录多,可用二分查找法),最后进行逻辑删除。此时,若此结点的兄弟结点内也只有一个记录,则可以将两个结点进行合并成为一个结点,以节省空间。KD查询查询n部分匹配查
60、询,若给定某些属性的值,当处于属性值已知的层的节点上时,根据比较可以选择一个方向往下进行;当处于属性值未知的结点上时,必须考察它的两个子结点。例如,我们找KD树中所有年龄为50的记录,因为根是按薪水来分裂的,所以考察根的两个子结点。在左子结点,只需往左走,在右子结点,只需考虑它的右子树。n范围查询就是给定一个范围,允许移动到结点的唯一的一个子结点,如果范围跨越了结点的划分值,那么我们就必须考察两个子结点。例如:SELECT*FROMCustomerTbWHERE(年龄=35AND年龄=100AND薪水 0时才会出现VarOffset2 * VarCount变长数据(如果有的话)VarData索
61、引存储索引存储createtableClustered_Dupes(col1char(5)notnull,col2intnotnull,col3char(3)null,col4char(6)notnull,col5floatnotnull)createclusteredindexCl_dupes_col1onClustered_Dupes(col1)insertintoClustered_Dupesvalues(ABCDE,123,NULL,CCCC,4567.8)selectfirst,keycnt,namefromsysindexeswhereid=object_id(Clustered_
62、Dupes)insertintoClustered_Dupesvalues(ABCDE,456,NULL,DDDD,4567.8)insertintoClustered_Dupesvalues(ABCDE,64,NULL,EEEE,4567.8)建立聚集索引时如果没有指定UNIQUE,对于重复码,生成4个字节的唯一标识符聚集索引聚集索引CREATETABLEclustered_nodupes(idintNOTNULL,str1char(5)NOTNULL,str2char(600)NULL)GOCREATECLUSTEREDINDEXidxCLONclustered_nodupes(str1)
63、GOSETNOCOUNTONGODECLAREiintSETi=1240WHILEi13000BEGININSERTINTOclustered_nodupesselecti,cast(iASchar),cast(iASchar)SETi=i+1ENDGOSELECTfirst,root,id,indidFROMsysindexesWHEREid=object_id(clustered_nodupes)聚聚集集索索引引的的根根页页面面聚聚集集索索引引的的中中间间页页面面非聚集索引非聚集索引CREATETABLEnc_heap_nodupes(idintNOTNULL,str1char(5)NOT
64、NULL,str2char(600)NULL)GOCREATEUNIQUEINDEXidxNC_heapONnc_heap_nodupes(str1)GOSETNOCOUNTONGODECLAREiintSETi=1240WHILEi1300BEGININSERTINTOnc_heap_nodupesselecti,cast(iASchar),cast(iASchar)SETi=i+1ENDGOSELECTfirst,root,id,indidFROMsysindexesWHEREid=object_id(nc_heap_nodupes)非聚集索引非聚集索引堆上非聚集索引的叶页面堆上非聚集索引
65、的叶页面非聚集索引非聚集索引CREATETABLEnc_nodupes(idintNOTNULL,str1char(5)NOTNULL,str2varchar(10)NULL)GOCREATEUNIQUECLUSTEREDINDEXidxcl_str2onnc_nodupes(str2)CREATEUNIQUEINDEXidxNCONnc_nodupes(str1)GOSETNOCOUNTONgoDECLAREiintSETi=1240WHILEi1非聚集索引非聚集索引聚集表上非聚集索引的叶页面聚集表上非聚集索引的叶页面非聚集索引非聚集索引CREATETABLEnc_overlap(idint
66、NOTNULL,str1char(5)NOTNULL,str2char(10)NULL)GOCREATEUNIQUECLUSTEREDINDEXidxCL_overlapONnc_overlap(str2)CREATEUNIQUEINDEXidxNC_overlapONnc_overlap(str1,str2)GOSETNOCOUNTONGODECLAREiintSETi=1240WHILEi1非聚集索引非聚集索引与聚集索引码重合的非聚集组合索引的叶页面与聚集索引码重合的非聚集组合索引的叶页面非聚集索引非聚集索引非聚集、非非聚集、非唯一唯一索引的中间节点页面索引的中间节点页面非聚集索引非聚集索
67、引非聚集非聚集唯一唯一索引的中间节点页面索引的中间节点页面显示索引页显示索引页0显示所有IAM页和数据页的页号-1显示所有IAM页、数据页和索引页的页号-2显示所有IAM页的页号索引ID显示所有IAM页和索引ID所代表的所有索引页的页号。如果是聚集索引,则数据页的页号也显示DBCCIND(dbname|dbid,objname|objid,indid|0|-1|-2)DBCCIND输出信息输出信息ColumnMeaningPageFIDIndex file IDPagePIDIndex page IDIAMFIDFile ID of the IAM managing this pageIAMP
68、IDPage ID of the IAM managing this pageObjectIDObject IDIndexIDIndex IDPageTypePage type: 1 = Data page, 2 = Index page, 10 = IAM pageIndexLevelLevel of index; 0 is leafNextPageFIDFile ID for next page at this levelNextPagePIDPage ID for next page at this levelPrevPageFIDFile ID for previous page at
69、 this levelPrevPagePIDPage ID for previous page at this level索引选择索引选择密度=1/属性列上不同值的个数n索引选择性n假定一个表有8345行,它上面的唯一性索引的密度为0.00012(1/8345);如果一个非聚集索引的密度是0.2165,那么一个索引码预期会指向1807行(0.2165*8345)n假定每个页面包含40行,上述表占据209行,那么两个相邻的索引叶节点指向同一个页面的概率是1/209。则使用该索引需要的逻辑读次数接近1807,这远远超过表扫描所需的逻辑读次数(209),所以该索引的选择性很差。数据修改数据修改CRE
70、ATETABLEbigrows(aintprimarykey,bvarchar(1600)INSERTINTObigrowsVALUES(5,REPLICATE(a,1600)INSERTINTObigrowsVALUES(10,REPLICATE(b,1600)INSERTINTObigrowsVALUES(15,REPLICATE(c,1600)INSERTINTObigrowsVALUES(20,REPLICATE(d,1600)INSERTINTObigrowsVALUES(25,REPLICATE(e,1600)ConvertPageNumberbigrowsdbcctraceon(
71、3604)dbccpage(clj,1,148,1)INSERTINTObigrowsVALUES(22,REPLICATE(x,1600)插入聚集索引行导致页面拆分CREATETABLEsmallrows(aintidentity,bvarchar(10)INSERTINTOsmallrowsVALUES(row1)INSERTINTOsmallrowsVALUES(row2)INSERTINTOsmallrowsVALUES(row3)INSERTINTOsmallrowsVALUES(row4)INSERTINTOsmallrowsVALUES(row5)ConvertPageNumbe
72、rsmallrowsdbcctraceon(3604)dbccpage(clj,1,149,1)deletefromsmallrowswherea=3dbccpage(clj,1,149,1)删除堆中的行只是将其偏移量置为0CREATETABLEsmallrows(aintidentityprimarykey,bvarchar(10)INSERTINTOsmallrowsVALUES(row1)INSERTINTOsmallrowsVALUES(row2)INSERTINTOsmallrowsVALUES(row3)INSERTINTOsmallrowsVALUES(row4)INSERTIN
73、TOsmallrowsVALUES(row5)ConvertPageNumbersmallrowsdbcctraceon(3604)dbccpage(clj,1,149,1)deletefromsmallrowswherea=3dbccpage(clj,1,149,1)删除索引行标记为ghostrecordCREATETABLEbigrows(aintidentity,bvarchar(1600),cvarchar(1600)INSERTINTObigrowsVALUES(replicate(a,1600),)INSERTINTObigrowsVALUES(replicate(b,1600),
74、)INSERTINTObigrowsVALUES(replicate(c,1600),)INSERTINTObigrowsVALUES(replicate(d,1600),)INSERTINTObigrowsVALUES(replicate(e,1600),)ConvertPageNumberbigrowsUPDATEbigrowsSETc=replicate(x,1600)WHEREa=3DBCCTRACEON(3604)DBCCPAGE(pubs,1,116,1,1)更新堆上的行产生ForwardPointers转向指针转向指针SELECT*INTOnewordersFROMordersA
75、LTERTABLEnewordersADDfull_detailsCHAR(2000)NOTNULLDEFAULTfulldetailsEXECsp_spaceusedneworders,trueSETSTATISTICSIOONSELECT*FROMnewordersCREATECLUSTEREDINDEXorderID_clONneworders(orderID)CREATETABLET1(Xintprimarykey,Yint)insertintoT1values(1,10)insertintoT1values(2,20)updateT1setX=3-X操作操作初始初始X X初始初始Y Y新新X X新新Y Y Row IDRow IDupdate110210ROW1update220120ROW2操作操作初始初始X X初始初始Y Y Row IDRow IDdelete110ROW1insert210delete220ROW2insert120操作操作初始初始X X初始初始Y Y Row IDRow IDdelete110ROW1insert120delete220ROW2insert210操作操作初始初始X X初始初始Y Y新新X X新新Y Y Row IDRow IDupdate110120ROW1update220210ROW2