WEB开发网      濠电姷鏁告慨鐑藉极閸涘﹦绠鹃柍褜鍓氱换娑欐媴閸愬弶鎼愮痪鍓ф嚀閳规垿鎮╃€圭姴顥濋梺姹囧€楅崑鎾诲Φ閸曨垰绠涢柛顐f礃椤庡秹姊虹粙娆惧剳闁哥姵鍔欐俊鐢稿礋椤栨艾鍞ㄩ梺闈浤涙担鎻掍壕闁圭儤顨嗛埛鎺楁煕閺囥劌浜滄い蹇e弮閺屸€崇暆鐎n剛鏆犻柧浼欑到閵嗘帒顫濋悡搴d画缂佹鍨垮缁樻媴缁涘娈┑顔斤公缁犳捇銆佸鎰佹▌濠电姭鍋撳ù锝囩《閺€浠嬫煟濡鍤嬬€规悶鍎辫灃闁绘ê寮堕崯鐐电磼閸屾氨效鐎规洘绮忛ˇ瀵哥棯閹佸仮鐎殿喖鐖煎畷鐓庘槈濡警鐎崇紓鍌欑劍椤ㄥ棗鐣濋幖浣歌摕闁绘棃顥撻弳瀣煟濡も偓閻楀棗鈻撳Δ鍛拺閻犲洠鈧櫕鐏€闂佸搫鎳愭慨鎾偩閻ゎ垬浜归柟鐑樼箖閺呮繈姊洪棃娑氬婵☆偅鐟╅、娆掔疀閺冨倻鐦堥梺姹囧灲濞佳勭閿曞倹鐓曢柕濞垮劤閸╋絾顨ラ悙鏉戝妤犵偞锕㈤、娆撴嚃閳哄骞㈤梻鍌欐祰椤鐣峰Ο鑲╃煋妞ゆ棁锟ユ禍褰掓煙閻戞ɑ灏ù婊冪秺濮婅櫣绱掑Ο铏逛桓闂佹寧娲嶉弲娑滅亱闂佸憡娲﹂崹閬嶅煕閹达附鐓欓柤娴嬫櫅娴犳粌鈹戦垾鐐藉仮闁诡喗顨呴埥澶愬箳閹惧褰囩紓鍌欑贰閸犳牠顢栭崨鎼晣闁稿繒鍘х欢鐐翠繆椤栨粎甯涙繛鍛喘濮婄粯鎷呴悷閭﹀殝缂備浇顕ч崐鍨嚕缂佹ḿ绡€闁搞儯鍔嶅▍鍥⒑缁嬫寧婀扮紒瀣崌瀹曘垽鎮介崨濠勫幗闁瑰吋鐣崹濠氬煀閺囥垺鐓ユ慨妯垮煐閻撶喖鐓崶銉ュ姢缂佸宕电槐鎺旂磼濡偐鐣虹紓浣虹帛缁诲牆鐣峰鈧俊姝岊槺缂佽鲸绻堝缁樻媴缁涘娈愰梺鎼炲妺閸楀啿鐣烽鐐茬骇闁瑰濮靛▓楣冩⒑缂佹ɑ鈷掗柍宄扮墦瀵偊宕掗悙瀵稿幈闂佹娊鏁崑鎾绘煛閸涱喚鎳呮俊鍙夊姇铻i悶娑掑墲閺傗偓闂備胶绮崝鏇炍熸繝鍥у惞闁绘柨鐨濋弨鑺ャ亜閺冨洦顥夐柛鏂诲€濋幗鍫曟倷閻戞ḿ鍘遍梺鍝勬储閸斿本鏅堕鐐寸厱婵炲棗绻掔粻濠氭煛鐏炵晫效鐎规洦鍋婂畷鐔碱敆閳ь剙鈻嶉敐鍥╃=濞达絾褰冩禍鐐節閵忥絾纭炬い鎴濇川缁粯銈i崘鈺冨幍闁诲孩绋掑玻璺ㄧ不濮椻偓閺屻劌鈽夊Ο澶癸絾銇勯妸锝呭姦闁诡喗鐟╅、鏃堝礋椤撴繄绀勯梻鍌欐祰椤曟牠宕伴弽顐ょ濠电姴鍊婚弳锕傛煙椤栫偛浜版俊鑼额嚙閳规垿鍩勯崘銊хシ濡炪値鍘鹃崗妯侯嚕鐠囨祴妲堥柕蹇曞閳哄懏鐓忓璺虹墕閸旀挳鏌涢弬娆炬Ш缂佽鲸鎸婚幏鍛矙鎼存挸浜鹃柛婵勫劤閻挾鎲搁悧鍫濈瑨闁哄绶氶弻鐔煎礈瑜忕敮娑㈡煛閸涱喗鍊愰柡灞诲姂閹倝宕掑☉姗嗕紦 ---闂傚倸鍊搁崐鎼佸磹閻戣姤鍊块柨鏃堟暜閸嬫挾绮☉妯哄箻婵炲樊浜滈悡娑㈡煕濞戝崬骞樻い鏂挎濮婅櫣鎹勯妸銉︾彚闂佺懓鍤栭幏锟�
开发学院数据库MySQL SQL Server 索引 阅读

SQL Server 索引

 2007-11-11 14:51:30 来源:WEB开发网 闂傚倸鍊搁崐鎼佸磹妞嬪孩顐芥慨姗嗗厳缂傛氨鎲稿鍫罕闂備礁婀遍搹搴ㄥ窗閺嶎偆涓嶆い鏍仦閻撱儵鏌i弴鐐测偓鍦偓姘炬嫹闂傚倸鍊搁崐鎼佸磹妞嬪海鐭嗗〒姘e亾妤犵偛顦甸弫鎾绘偐閹绘帞鈧參姊哄Ч鍥х仼闁诲繑鑹鹃悾鐑藉蓟閵夛妇鍘甸梺瑙勵問閸犳牠銆傛總鍛婄厱閹艰揪绱曟牎闂侀潧娲ょ€氫即鐛幒妤€绠f繝闈涘暙娴滈箖鏌i姀鈶跺湱澹曟繝姘厵闁绘劦鍓氶悘杈ㄤ繆閹绘帞澧涚紒缁樼洴瀹曞崬螖閸愬啠鍓濈换娑樼暆婵犱胶鏁栫紓浣介哺閹瑰洤鐣烽幒鎴僵闁瑰吀鐒﹂悗鎼佹⒒娴g儤鍤€闁搞倖鐗犻獮蹇涙晸閿燂拷濠电姷鏁告慨鐑藉极閸涘﹥鍙忔い鎾卞灩缁狀垶鏌涢幇闈涙灈鐎瑰憡绻冮妵鍕箻鐎靛摜鐣奸梺纭咁潐濞茬喎顫忕紒妯肩懝闁逞屽墮宀h儻顦查悡銈夋煏閸繃鍋繛宸簻鎯熼梺瀹犳〃閼冲爼宕濋敃鈧—鍐Χ閸℃鐟愰梺鐓庡暱閻栧ジ宕烘繝鍥у嵆闁靛骏绱曢崢顏堟⒑閹肩偛鍔楅柡鍛⊕缁傛帟顦寸紒杈ㄥ笚濞煎繘鍩℃担閿嬵潟闂備浇妗ㄩ悞锕傚箲閸ヮ剙鏋侀柟鍓х帛閺呮悂鏌ㄩ悤鍌涘闂傚倸鍊搁崐鎼佸磹妞嬪孩顐芥慨姗嗗厳缂傛氨鎲稿鍫罕闂備礁婀遍搹搴ㄥ窗閺嶎偆涓嶆い鏍仦閻撱儵鏌i弴鐐测偓鍦偓姘炬嫹  闂傚倸鍊搁崐鎼佸磹閻戣姤鍤勯柤鍝ユ暩娴犳氨绱撻崒娆掑厡缂侇噮鍨堕妴鍐川閺夋垹鍘洪悗骞垮劚椤︻垶宕¢幎鑺ョ厪闊洦娲栨牎闂佽瀵掗崜鐔奉潖閾忓湱纾兼俊顖氭惈椤矂姊虹拠鑼婵ǜ鍔戦崺鈧い鎺嶇閸ゎ剟鏌涢幘璺烘瀻妞ゎ偄绻愮叅妞ゅ繐瀚悗顓烆渻閵堝棙绀€闁瑰啿閰e畷婊勫鐎涙ǚ鎷洪梻渚囧亞閸嬫盯鎳熼娑欐珷妞ゆ柨澧界壕鐓庮熆鐠虹尨鍔熺紒澶庢閳ь剚顔栭崰鏍€﹂柨瀣╃箚婵繂鐭堝Σ鐑芥⒑缁嬫鍎愰柟鐟版搐铻為柛鎰╁妷濡插牊绻涢崱妤冪婵炲牊锕㈠缁樻媴妞嬪簼瑕嗙紓鍌氱М閸嬫挻绻涚€涙ḿ鐭ら柛鎾跺枛瀹曟椽鍩€椤掍降浜滈柟鐑樺灥閳ь剙缍婂鎶筋敆閸曨剛鍘遍柣搴秵娴滅兘鐓鍌楀亾鐟欏嫭纾婚柛妤€鍟块锝夊磹閻曚焦鞋闂備礁鎼Λ瀵哥不閹捐钃熼柕濞炬櫆閸嬪棝鏌涚仦鍓р槈妞ゅ骏鎷�
核心提示:sql server(WINDOWS平台上强大的数据库平台) 数据页和索引页都是 8K 字节大,sql server(WINDOWS平台上强大的数据库平台) 数据页包含除了文本和图像数据以外所有与表的某一行相关的数据,SQL Server 索引,对于文本和图像数据,包含与文本/图像列有关的行的 sql server(W

sql server(WINDOWS平台上强大的数据库平台) 数据页和索引页都是 8K 字节大。sql server(WINDOWS平台上强大的数据库平台) 数据页包含除了文本和图像数据以外所有与表的某一行相关的数据。对于文本和图像数据,包含与文本/图像列有关的行的 sql server(WINDOWS平台上强大的数据库平台) 数据页将包含一个指针,该指针指向一个包含一个或多个 8 KB 页的 B 树结构,文本/图像数据便包含在在该 B 树结构中。

sql server(WINDOWS平台上强大的数据库平台) 索引页仅包含组成特定索引的列中的数据。这意味着与 8 KB 数据页相比,索引页可以有效地将与更多行相关的信息压缩到一个 8 KB 页。可以想象索引的 I/O 性能可由此获得改进。如果所提取的列(这些列构成了索引的一部分)占表的行大小的百分比相对较低,这种推想是对的。当 SQL 查询要求某个表中的一个行集,这些行的某些值与查询中的列相匹配,sql server(WINDOWS平台上强大的数据库平台) 可以节省 I/O 操作和时间,因为可以只读取索引页来查找这些值,然后只访问表中满足查询的所需行,而无须执行 I/O 操作以扫描表中所有行来找到所需行。如果定义索引时选择得很好,那么实际情况就是这样。

有两种 sql server(WINDOWS平台上强大的数据库平台) 索引,且这两种索引均建立在由 8 KB 索引页所组成的 B 树结构上。它们的不同在于 B 树结构的底部,其底部在 sql server(WINDOWS平台上强大的数据库平台) 文档中称为叶级。索引 B 树结构的上半部分称为非叶级索引。为每个索引建立的 B 树结构都在 sql server(WINDOWS平台上强大的数据库平台) 表中定义。

图1 说明了非聚集索引和聚集索引在结构上的不同。要记住的关键点是:在非聚集索引中,叶级节点仅包含参与索引的数据以及快速找到相关数据页上其它行数据的指针。最糟糕的情况是,从非聚集索引中获得的每一行都要求一个额外的不连续磁盘 I/O 才能检索行数据。最好的情况是,所需要的行有许多都位于相同的数据页,因此在提取每个数据页时可检索多行。如果是聚集索引,索引的叶级节点是表的实际数据行。因此,检索表数据时不需要指针跳动。基于聚集索引的范围扫描执行情况很好,因为聚集索引的叶级(即表的所有行)在物理上按照组成聚集索引的列顺序排列在磁盘上,因此,可以执行 64 KB 扩展盘区 I/O。并且,如果聚集索引 B 树(非叶级和叶级)上没有大量分割的页,这些 64 KB I/O 还可以在物理上连续。虚线表示 B 树结构中还有其它 8 KB 页,但未显示出来。



sql server<font class=reblank  style=(WINDOWS平台上强大的数据库平台) 索引(1)(图一)" />

图 1  聚集和非聚集索引 B 树结构



聚集索引

每个表中只能有一个聚集索引。物理原因很简单。尽管聚集索引 B 树结构的上半部分(在 sql server(WINDOWS平台上强大的数据库平台) 文档中通常称为非叶级)与非聚集索引 B 树的结构相似,但是聚集索引 B 树的下半部分是与表相关的实际的 8 KB 数据页。这里暗含着两种性能:

通过聚集索引基于关键字搜索来检索 SQL 数据时不需要指针跳动(类似于硬盘上位置的不连续改变)就可以获得相关的数据页,因为叶级聚集索引已经是相关的数据页。

聚集索引的叶级按照组成聚集索引的列排序。因为聚集索引的叶级包含表的实际 8 KB 数据页,这意味着整个表的行数据在物理上按照聚集索引确定的顺序排列在磁盘驱动器上。当根据聚集索引的值从这个表中提取大量行时,这种排列提供了一种潜在的 I/O 性能优势,因为使用的是连续磁盘 I/O(除非该表上发生了页拆分,我们将在后面的“FILLFACTOR 和 PAD_INDEX 的重要性”中讨论这个问题)。这就是根据执行范围扫描检索大量的行时所使用的列来提取表中的聚集索引很重要的原因。

非聚集索引

如果要根据键值从大型 sql server(WINDOWS平台上强大的数据库平台) 表提取具有良好选择性的少数几行,非聚集索引最有用。以前已提到过,非聚集索引是由 8 KB 索引页组成的 B 树。索引页的 B 树的底部或叶级包含组成该索引的列中的所有数据。当用非聚集索引检索表中与键值匹配的信息时,将搜索整个索引 B 树,直到在索引叶级找到一个与键值匹配的值。如果需要的列不是索引组成的一部分,则会发生指针跳动。该指针跳动可能需要在磁盘上进行一个不连续 I/O 操作。如果表以及它相应的索引 B 树很大,甚至可能要求从另一个磁盘中读取数据。如果多个指针指向同一个 8 KB 数据页,则对 I/O 性能的影响比较小,因为只须将该数据页读入数据高速缓存一次。如果某个 SQL 查询涉及到要用非聚集索引进行搜索,那么对于所返回的每一行,均需要一次指针跳动。这些指针跳动可以解释为什么非聚集索引更适合于只返回表中一行或几行的 SQL 查询,而聚集索引更适合于要求返回许多行的查询。

有关详细信息,请在 sql server(WINDOWS平台上强大的数据库平台) Books Online 中搜索字符串“nonclustered index”。

覆盖索引

非聚集索引的一个特例是覆盖索引。覆盖索引的定义是在选择条件和 WHERE 谓词上均满足 SQL 查询的所有列的基础上建立的非聚集索引。覆盖索引可以节省大量的 I/O,因此可极大地改善查询的性能。但是有必要在新建索引(以及与它相关的 B 树索引结构维护)所需要的代价和覆盖索引所带来的 I/O 性能增益之间进行权衡。如果覆盖索引对于 sql server(WINDOWS平台上强大的数据库平台) 上经常运行的查询或查询组极其有利,那么创建覆盖索引是值得的。

覆盖索引的示例

Select col1,col3 from table1 where col2 = 'value'.

Create index indexname1 on table1(col2,col1,col3).

或者

使用 sql server(WINDOWS平台上强大的数据库平台) Enterprise Manager 中的 Create Index Wizard 创建索引。从 sql server(WINDOWS平台上强大的数据库平台) Enterprise Manager 菜单栏中选择 Tools/Wizards,左击 Database 旁边的 + 图标将出现数据库向导,然后双击 Create Index Wizard 启动该向导。

本例中创建出来的索引“indexname1”是一个覆盖索引,因为它包括 SELECT 语句和 WHERE 谓词中的所有列。即在执行此查询期间,sql server(WINDOWS平台上强大的数据库平台) 不需要访问与 table1 相关的数据页。sql server(WINDOWS平台上强大的数据库平台) 使用索引 indexname1 可以获得满足查询所需要的全部信息。在 sql server(WINDOWS平台上强大的数据库平台) 已遍历与 indexname1 相关的 B 树,并找到 col2 等于“value”的索引关键字范围,sql server(WINDOWS平台上强大的数据库平台) 就知道它可以从覆盖索引的叶级(底层)提取所有需要的数据 (col1,col2,col3)。这从两个方面改进了 I/O 性能:

sql server(WINDOWS平台上强大的数据库平台) 从索引页而不是数据页获取所有需要的数据,因此数据的压缩率更高,使 sql server(WINDOWS平台上强大的数据库平台) 可以节省磁盘 I/O 操作。覆盖索引按照 col2 将所有需要的数据以物理方式组织在磁盘上。使硬盘得以连续返回与 where 谓词 (col2 = "value") 相关的所有索引行。从而为我们提供了更好的 I/O 性能。实际上,从磁盘 I/O 的角度来看,覆盖索引成了此查询以及可被此覆盖查询中的列完全满足的任何其它查询的聚集索引。

总而言之,如果覆盖索引中的所有列的字节数比该表中单行的字节数少,并且可以肯定将反复执行使用此覆盖索引的查询,那么使用覆盖索引是有意义的。但是在创建大量覆盖索引之前,请考虑下面的内容,它讲述了 sql server(WINDOWS平台上强大的数据库平台) 7.0 如何智能、自动、快捷地为查询创建覆盖索引。

1 2 3  下一页

Tags:SQL Server 索引

编辑录入:coldstar [复制链接] [打 印]
赞助商链接