簡體   English   中英

在非聚集索引中,第二,第三,第四…列如何排序?

[英]In a nonclustered index, how are the second, third, fourth … columns sorted?

我有關於SQL Server索引的問題,最近一直困擾着我。

想象一個這樣的表:

CREATE TABLE TelephoneBook (
    FirstName nvarchar(50), 
    LastName nvarchar(50), 
    PhoneNumber nvarchar(50)
)

具有這樣的索引:

CREATE NONCLUSTERED INDEX IX_LastName ON TelephoneBook (
    LastName, 
    FirstName, 
    PhoneNumber
)

並想象該表有成千上萬的行。

假設我要選擇姓氏以B開頭且名字為'John'的所有人。 我將編寫以下查詢:

SELECT 
    * 
FROM TelephoneBook 
WHERE LastName like 'B%' 
AND FirstName='John'

由於索引將所有以B開頭的所有姓氏歸為一組,因此可以幫助減少我們需要掃描的行數,所以它也可以對名字進行此操作嗎? 還是數據庫會掃描以B開頭的每一行以查找名字為“ John”的行?

換句話說,第二,第三,第四,...列如何在索引中排序? 在這種情況下,它們也是按字母順序排列的嗎,所以找到Johanna很容易嗎? 還是它們以某種隨機或不同的順序排列?

編輯:為什么我要問,是因為我剛剛讀過上面的SELECT語句,索引將僅用於將搜索范圍縮小到姓氏以B開頭的記錄,但是索引將不用於找到其中包含Johanna的所有行(並將訴諸於掃描所有“ B”行)。 我想知道為什么會這樣嗎? 我沒有得到什么?

為了方便起見,索引的鍵用於where子句,直到第一個不等式。 like使用通配符被認為是一種不平等。

因此,索引將僅用於查找第一個值。 但是,可能會掃描條目以匹配名字,因此您仍然會使用索引。

當然,如果優化程序確定全表掃描更合適,則它可能根本決定不使用該索引。

在這種情況下,使用指定的查詢,戈登的答案是正確的。 通常,您應該意識到,與其說是基於列的值,不如說是在“存儲桶”中將記錄分組在一起,而是根據索引的鍵列對它們進行排序。 換句話說,此索引中的記錄將根據姓氏進行排序,對於共享相同姓氏值的記錄,將按姓氏值然后按電話號碼值進一步對其進行排序。 您沒有為該索引上的列指定排序順序,但是SQL Server將未指定的排序順序默認為ASC(ending) ,因此這些列的確在索引中按詞法排序。

在您的特定情況下,查詢優化器已經決定查看第一列的索引,以確定要抓取的記錄,正如戈登的答案所提到的那樣,但是如果優化器認為更好,則SQL Server將對謂詞進行重新排序,並且可能會使用更多索引的列或根本不包含列,具體取決於查詢本身以及所查詢記錄的統計信息。

從邏輯上講,索引是按鍵值按鍵順序排序的。 因此,在這種情況下,姓氏(按文本排序),姓氏(按文本排序),然后是電話號碼(按文本排序)...包含的所有列都不會排序。

在您的情況下,我們知道尾隨的通配符仍然可以保存,因此我們希望看到一個索引試圖從該數據池中將數據縮小到所有帶有“ B”開頭的姓氏(從“ B”開始)的數據,並將對其進行進一步過濾只包括那些具有FirstName ='John'的行。 您可以將其視為索引搜索,然后是范圍搜索。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM