欢迎来到天天文库
浏览记录
ID:1495871
大小:240.00 KB
页数:9页
时间:2017-11-12
《sql server 索引基础知识----聚集索引,非聚集索引》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
不论是聚集索引,还是非聚集索引,都是用B+树来实现的。我们在了解这两种索引之前,需要先了解B+树。如果你对B树不了解的话,建议参看以下几篇文章:BTree,B-Tree,B+Tree,B*Tree都是什么http://blog.csdn.net/manesking/archive/2007/02/09/1505979.aspxB+树的结构图:B+树的特点:·所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好是有序的;·不可能在非叶子结点命中;·非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层;B+树中增加一个数据,或者删除一个数据,需要分多种情况处理,比较复杂,这里就不详述这个内容了。 聚集索引(ClusteredIndex)·聚集索引的叶节点就是实际的数据页·在数据页中数据按照索引顺序存储·行的物理位置和行在索引中的位置是相同的·每个表只能有一个聚集索引·聚集索引的平均大小大约为表大小的5%左右 下面是两副简单描述聚集索引的示意图: 在聚集索引中执行下面语句的的过程:select*fromtablewherefirstName='Ota' 一个比较抽象点的聚集索引图示: 非聚集索引(UnclusteredIndex) ·非聚集索引的页,不是数据,而是指向数据页的页。·若未指定索引类型,则默认为非聚集索引·叶节点页的次序和表的物理存储次序不同·每个表最多可以有249个非聚集索引·在非聚集索引创建之前创建聚集索引(否则会引发索引重建)在非聚集索引中执行下面语句的的过程:select*fromemployeewherelname='Green' 一个比较抽象点的非聚集索引图示: 什么是BookmarkLookup虽然SQL2005中已经不在提 BookmarkLookup了(换汤不换药),但是我们的很多搜索都是用的这样的搜索过程,如下:先在非聚集中找,然后再在聚集索引中找。 在http://www.sqlskills.com/提供的一个例子中,就给我们演示了BookmarkLookup 比TableScan慢的情况,例子的脚本如下:USECREDITgo--ThesesamplesusetheCreditdatabase.Youcandownloadandrestorethe--creditdatabasefromhere:--http://www.sqlskills.com/resources/conferences/CreditBackup80.zip--NOTE:ThisisaSQLServer2000backupandMANYexampleswillworkon--SQLServer2000inadditiontoSQLServer2005.---------------------------------------------------------------------------------(1)Createtwotableswhicharecopiesofcharge:------------------------------------------------------------------------------- --CreatetheHEAPSELECT*INTOChargeHeapFROMChargego--CreatetheCLTableSELECT*INTOChargeCLFROMChargegoCREATECLUSTEREDINDEXChargeCL_CLIndONChargeCL(member_no,charge_no)go---------------------------------------------------------------------------------(2)Addthesamenon-clusteredindexestoBOTHofthesetables:---------------------------------------------------------------------------------CreatetheNCindexontheHEAPCREATEINDEXChargeHeap_NCIndONChargeHeap(Charge_no)go--CreatetheNCindexontheCLTableCREATEINDEXChargeCL_NCIndONChargeCL(Charge_no)go---------------------------------------------------------------------------------(3)BegintoquerythesetablesandseewhatkindofaccessandI/Oreturns---------------------------------------------------------------------------------Getreadyforabitofanalysis:SETSTATISTICSIOON--TurnGraphicalShowplanON(Ctrl+K)--First,apointquery(also,seehowabookmarklookuplooksin2005)SELECT*FROMChargeHeapWHERECharge_no=12345goSELECT*FROMChargeCLWHERECharge_no=12345go --Whatifourqueryislessselective?--1000is.0625%ofourdata...(1,600,000millionrows)SELECT*FROMChargeHeapWHERECharge_no<1000goSELECT*FROMChargeCLWHERECharge_no<1000go--Whatifourqueryislessselective?--16000is1%ofourdata...(1,600,000millionrows)SELECT*FROMChargeHeapWHERECharge_no<16000goSELECT*FROMChargeCLWHERECharge_no<16000go---------------------------------------------------------------------------------(4)What'stheEXACTpercentagewherethebookmarklookupisn'tworthit?---------------------------------------------------------------------------------Whathappenshere:TableScanorBookmarklookup?SELECT*FROMChargeHeapWHERECharge_no<4000goSELECT*FROMChargeCLWHERECharge_no<4000go--Whathappenshere:TableScanorBookmarklookup?SELECT*FROMChargeHeapWHERECharge_no<3000goSELECT*FROMChargeCLWHERECharge_no<3000go--And-youcannarrowitdownbytryingthemiddleground:--Whathappenshere:TableScanorBookmarklookup?SELECT*FROMChargeHeapWHERECharge_no<3500goSELECT*FROMChargeCLWHERECharge_no<3500 go--Andagain:SELECT*FROMChargeHeapWHERECharge_no<3250goSELECT*FROMChargeCLWHERECharge_no<3250go--Andagain:SELECT*FROMChargeHeapWHERECharge_no<3375goSELECT*FROMChargeCLWHERECharge_no<3375go--Don'tworry,Iwon'tmakeyougothroughitall:)--FortheHeapTable(inTHIScase),thecutoffis:0.21%SELECT*FROMChargeHeapWHERECharge_no<3383goSELECT*FROMChargeHeapWHERECharge_no<3384go--FortheClusteredTable(inTHIScase),thecut-offis:0.21%SELECT*FROMChargeCLWHERECharge_no<3438SELECT*FROMChargeCLWHERECharge_no<3439go这个例子也就是吴家震在Teched2007上的那个演示例子。小结:这篇博客只是简单的用几个图表来介绍索引的实现方法:B+数,聚集索引,非聚集索引,BookmarkLookup的信息而已。
此文档下载收益归作者所有
举报原因
联系方式
详细说明
内容无法转码请点击此处