?? 聚集索引和非聚集索引.txt
字號(hào):
如何從實(shí)際實(shí)例中查看聚集索引是否改變表的物理順序?
如何在查詢中測(cè)試聚集索引列的查詢速度比主鍵列或非聚集索引列速度要快?
聚集索引:猶如字典的正文,正文部分本身就是一個(gè)目錄,您不需要再去查其他目錄來(lái)找到您需要找的內(nèi)容。我們把這種正文內(nèi)容本身就是一種按照一定規(guī)則排列的目錄稱為“聚集索引”。每個(gè)表只能有一個(gè)聚集索引,因?yàn)檎闹荒馨凑找环N方法進(jìn)行排序。在創(chuàng)建聚集索引時(shí),將會(huì)對(duì)表進(jìn)行復(fù)制,對(duì)表中的數(shù)據(jù)進(jìn)行排序,然后刪除原始的表。因此,數(shù)據(jù)庫(kù)上必須有足夠的空閑空間,以容納數(shù)據(jù)復(fù)本。
非聚集索引:猶如字典中的拼音查字目錄和部首查字目錄,需要兩個(gè)過(guò)程,先找到目錄中的結(jié)果,然后再翻到您所需要的頁(yè)碼。我們把這種純粹的目錄稱為“非聚集索引”。
唯一索引
創(chuàng)建唯一索引可以確保任何生成重復(fù)鍵值的嘗試都會(huì)失敗。如果創(chuàng)建的單個(gè)查詢導(dǎo)致添加了重復(fù)的和非重復(fù)的鍵值,SQL Server 會(huì)拒絕所有的行,包括非重復(fù)的鍵值。例如,如果一個(gè)單個(gè)的插入語(yǔ)句從表 A 檢索了 20 行,然后將它們插入到表 B 中,而這些行中有 10 行包含重復(fù)鍵值,則默認(rèn)情況下所有 20 行都將被拒絕。不過(guò),在創(chuàng)建該索引時(shí)可以指定 IGNORE_DUP_KEY 子句,使得只有重復(fù)的鍵值才被拒絕,而非重復(fù)的鍵值將被添加。在上面的例子中,將只會(huì)拒絕 10 個(gè)重復(fù)的鍵值,其它 10 個(gè)非重復(fù)的鍵值將被添加到表 B 中。
如果有任何重復(fù)的鍵值,便不能創(chuàng)建唯一索引。例如,如果要在 a 列和 b 列上創(chuàng)建唯一的組合索引,而表中有兩行的 a 列同為值 1,b 列同為值 2,則無(wú)法創(chuàng)建唯一索引。
使用聚集索引
聚集索引確定表中數(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ū)中索引的方式相似, 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è)該行。
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -