使用聚集索引
聚集索引確定表中數(shù)據(jù)的物理順序。聚集索引類似于電話簿,后者按姓氏排列數(shù)據(jù)。由于聚集索引規(guī)定數(shù)據(jù)在表中的物理存儲(chǔ)順序,因此一個(gè)表只能包含一個(gè)聚集索引。但該索引可以包含多個(gè)列(組合索引),就像電話簿按姓氏和名字進(jìn)行組織一樣。
聚集索引對(duì)于那些經(jīng)常要搜索范圍值的列特別有效。使用聚集索引找到包含第一個(gè)值的行后,便可以確保包含后續(xù)索引值的行在物理相鄰。例如,如果應(yīng)用程序執(zhí)行的一個(gè)查詢經(jīng)常檢索某一日期范圍內(nèi)的記錄,則使用聚集索引可以迅速找到包含開(kāi)始日期的行,然后檢索表中所有相鄰的行,直到到達(dá)結(jié)束日期。這樣有助于提高此類查詢的性能。同樣,如果對(duì)從表中檢索的數(shù)據(jù)進(jìn)行排序時(shí)經(jīng)常要用到某一列,則可以將該表在該列上聚集(物理排序),避免每次查詢?cè)摿袝r(shí)都進(jìn)行排序,從而節(jié)省成本。
當(dāng)索引值唯一時(shí),使用聚集索引查找特定的行也很有效率。例如,使用唯一雇員 ID 列 emp_id 查找特定雇員的最快速的方法,是在 emp_id 列上創(chuàng)建聚集索引或 PRIMARY KEY 約束
使用非聚集索引
非聚集索引與課本中的索引類似。數(shù)據(jù)存儲(chǔ)在一個(gè)地方,索引存儲(chǔ)在另一個(gè)地方,索引帶有指針指向數(shù)據(jù)的存儲(chǔ)位置。索引中的項(xiàng)目按索引鍵值的順序存儲(chǔ),而表中的信息按另一種順序存儲(chǔ)(這可以由聚集索引規(guī)定)。如果在表中未創(chuàng)建聚集索引,則無(wú)法保證這些行具有任何特定的順序。
與使用書(shū)中索引的方式相似,Microsoft® SQL Server™ 2000 在搜索數(shù)據(jù)值時(shí),先對(duì)非聚集索引進(jìn)行搜索,找到數(shù)據(jù)值在表中的位置,然后從該位置直接檢索數(shù)據(jù)。這使非聚集索引成為精確匹配查詢的最佳方法,因?yàn)樗饕枋霾樵兯阉鞯臄?shù)據(jù)值在表中的精確位置的條目。如果基礎(chǔ)表使用聚集索引排序,則該位置為聚集鍵值;否則,該位置為包含行的文件號(hào)、頁(yè)號(hào)和槽號(hào)的行 ID (RID)。例如,對(duì)于在 emp_id 列上有非聚集索引的表,如要搜索其雇員 ID (emp_id),SQL Server 會(huì)在索引中查找這樣一個(gè)條目,該條目精確列出匹配的 emp_id 列在表中的頁(yè)和行,然后直接轉(zhuǎn)到該頁(yè)該行。
-------------------------------------------------------分割線-------------------------------------------------------
在工作中遇見(jiàn)了SQL性能問(wèn)題,最后在同事的幫助下解決了此問(wèn)題:就是通過(guò)建
聚集索引的方式解決的!
原來(lái)的SQL中有如下的where語(yǔ)句:
and datediff(day, date1
,'2009-1-01')<=0
and datediff(day, date1,'2009-2-03')>=0
在date1建了
聚集索引,SQL修改如下:
and date1>
='2009-1-01'
and date1<='2009-2-03'
去掉了datediff函數(shù),因?yàn)橛煤瘮?shù)的話就不會(huì)用到date1的
聚集索引! 在此記錄一下,以備后查!