資源描述:
《sqlserver的復合索引學習》由會員上傳分享,免費在線閱讀,更多相關內(nèi)容在應用文檔-天天文庫。
1、SQLServer的復合索引學習概要什么是單一索引,什么又是復合索引呢?何時新建復合索引,復合索引又需要注意些什么呢?一.概念單一索引是指索引列為一列的情況,即新建索引的語句只實施在一列上。用戶可以在多個列上建立索引,這種索引叫做復合索引(組合索引)。復合索引的創(chuàng)建方法與創(chuàng)建單一索引的方法完全一樣。但復合索引在數(shù)據(jù)庫操作期間所需的開銷更小,可以代替多個單一索引。當表的行數(shù)遠遠大于索引鍵的數(shù)目時,使用這種方式可以明顯加快表的查詢速度。同時有兩個概念叫做窄索引和寬索引,窄索引是指索引列為1-2列的索引
2、,如果不特殊說明的話一般是指單一索引。寬索引也就是索引列超過2列的索引。設計索引的一個重要原則就是能用窄索引不用寬索引,因為窄索引往往比組合索引更有效。擁有更多的窄索引,將給優(yōu)化程序提供更多的選擇余地,這通常有助于提高性能。二.使用創(chuàng)建索引createindexidx1ontable1(col1,col2,col3)查詢select*fromtable1wherecol1=Aandcol2=Bandcol3=C這時候查詢優(yōu)化器,不在掃描表了,而是直接的從索引中拿數(shù)據(jù),因為索引中有這些數(shù)據(jù),這叫覆蓋
3、式查詢,這樣的查詢速度非??臁H?注意事項1.何時是用復合索引在where條件中字段用索引,如果用多字段就用復合索引。一般在select的字段不要建什么索引(如果是要查詢selectcol1,col2,col3frommytable,就不需要上面的索引了)。根據(jù)where條件建索引是極其重要的一個原則。注意不要過多用索引,否則對表更新的效率有很大的影響,因為在操作表的時候要化大量時間花在創(chuàng)建索引中.2.對于復合索引,在查詢使用時,最好將條件順序按找索引的順序,這樣效率最高。如:IDX1:creat
4、eindexidx1ontable1(col2,col3,col5)select*fromtable1wherecol2=Aandcol3=Bandcol5=D如果是"select*fromtable1wherecol3=Bandcol2=Aandcol5=D"或者是"select*fromtable1wherecol3=B"將不會使用索引,或者效果不明顯3.復合索引會替代單一索引么?很多人認為只要把任何字段加進聚集索引,就能提高查詢速度,也有人感到迷惑:如果把復合的聚集索引字段分開查詢,那么查詢
5、速度會減慢嗎?帶著這個問題,我們來看一下以下的查詢速度(結果集都是25萬條數(shù)據(jù)):(日期列fariqi首先排在復合聚集索引的起始列,用戶名neibuyonghu排在后列)IDX1:createindexidx1onTgongwen(fariqi,neibuyonghu)(1)selectgid,fariqi,neibuyonghu,titlefromTgongwenwherefariqi>'2004-5-5'查詢速度:2513毫秒(2)selectgid,fariqi,neibuyonghu,ti
6、tlefromTgongwenwherefariqi>'2004-5-5'andneibuyonghu='辦公室'查詢速度:2516毫秒(3)selectgid,fariqi,neibuyonghu,titlefromTgongwenwhereneibuyonghu='辦公室'查詢速度:60280毫秒從以上試驗中,我們可以看到如果僅用聚集索引的起始列作為查詢條件和同時用到復合聚集索引的全部列的查詢速度是幾乎一樣的,甚至比用上全部的復合索引列還要略快(在查詢結果集數(shù)目一樣的情況下);而如果僅用復合聚
7、集索引的非起始列作為查詢條件的話,這個索引是不起任何作用的。當然,語句1、2的查詢速度一樣是因為查詢的條目數(shù)一樣,如果復合索引的所有列都用上,而且查詢結果少的話,這樣就會形成“索引覆蓋”,因而性能可以達到最優(yōu)。同時,請記?。簾o論您是否經(jīng)常使用聚合索引的其他列,但其前導列一定要是使用最頻繁的列。[參考:查詢優(yōu)化及分頁算法方案http://blog.csdn.net/chiefsailor/archive/2007/05/28/1628339.aspx]4.需要在同一列上同時建單一索引和復合索引么?試
8、驗:sysbase5.0表table1字段:col1,col2,col3試驗步驟:(1)建立索引idx1oncol1執(zhí)行select*fromtable1wherecol1=A使用idx1執(zhí)行select*fromtable1wherecol1=Aandcol2=B也使用idx1(2)刪除索引idx1,然后建立idx2on(col1,col2)復合索引執(zhí)行以上兩個查詢,也都使用idx2(3)如果兩個索引idx1,idx2都存在并不是wherecol1='A'用idx1;wherec