1. 程式人生 > >深入非聚集索引:樓梯SQL Server二級索引

深入非聚集索引:樓梯SQL Server二級索引

statistic line nts find res rod -c pac 發布

通過大衛·杜蘭特,2017/10/18(第一次出版:2014/11/26)

該系列

本文是樓梯系列的一部分:SQL Server的階梯索引

索引數據庫設計的基礎,告訴開發人員使用數據庫設計者的意圖。 不幸的是索引時往往是後加上的性能問題出現。 終於在這裏是一個簡單的系列文章,應該讓任何數據庫專業迅速“加速”

SQL Server的一級索引樓梯介紹了SQL Server索引,一般來說,和非聚集索引。 作為我們的第一個案例研究中,我們演示了索引的潛在好處,當從一個表中檢索單個行。 在這個層面上,我們繼續我們的調查的非聚集索引; 檢查他們的貢獻好的查詢性能的情況下,超越從一個表中檢索單個行。

將在大多數我們的水平,我們引入少量的理論,研究一些指數內部為了幫助解釋這個理論,然後執行一些查詢。 有或沒有執行這些查詢索引和性能報告統計數據,這樣我們可以查看指標的影響。

我們將使用從AdventureWorks數據庫表的子集,我們用於一級、集中聯系表在這個水平。 我們將使用一個指數FullName我們用於一級指數,來說明我們的觀點。 以確保我們控制上的索引聯系表,我們會讓兩個表的副本dbo模式,只有構建FullName指數其中之一。 這將給我們的控制環境:兩份表:一個與一個單一的非聚集索引,一個沒有任何索引。

IF EXISTS (

    SELECT * 

        FROM sys.tables 

        WHERE OBJECT_ID = OBJECT_ID(‘dbo.Contacts_index‘))
DROP TABLE dbo.Contacts_index;
GO
IF EXISTS (

    SELECT * 

        FROM sys.tables 

        WHERE OBJECT_ID = OBJECT_ID(‘dbo.Contacts_noindex‘))

    DROP TABLE dbo.Contacts_noindex;
GO
SELECT * INTO dbo.Contacts_index 

    FROM Person.Contact;
SELECT * INTO dbo.Contacts_noindex 

    FROM Person.Contact;

清單2.1:復制人。 聯系表

的一個片段聯系人表所示

ContactID FirstName MiddleName LastName EmailAddress
.
.

1288 Laura F Norman [email protected]
651 Michael Patten [email protected]
1652 Isabella R James [email protected]
1015 David R Campbell [email protected]
1379 Balagane Swaminath [email protected]
742 Steve Schmidt [email protected]
1743 Shannon C Guo [email protected]
1106 John Y Chen [email protected]
1470 Blaine Dockter [email protected]
833 Clarence R. Tatman [email protected]
1834 Heather M Wu [email protected]
1197 Denise H Smith [email protected]
560 Jennifer J. Maxham [email protected]
1561 Ido Ben-Sacha [email protected]
924 Becky R. Waters [email protected]

非聚集索引條目

下面的語句創建我們的Contacts_index FullName非聚集索引表。

CREATE INDEX FullName

            ON Contacts_index

    ( LastName, FirstName );

創建索引FullNameContacts_index(,FirstName);

清單2.2 -創建一個非聚集索引

記住一個非聚集索引存儲索引鍵,以及一個書簽用來訪問表中的實際數據本身。 你能想到的書簽作為一種指針。 未來的水平將描述書簽,其形式和使用,詳細。

的一個片段FullName指數顯示,組成的FirstName作為鍵列,加上書簽:

:--- Search Key Columns : Bookmark

.

Russell Zachary =>
Ruth Andy =>
Ruth Andy =>
Ryan David =>
Ryan Justin =>
Sabella Deanna =>
Sackstede Lane =>
Sackstede Lane =>
Saddow Peter =>
Sai Cindy =>
Sai Kaitlin =>
Sai Manuel =>
Salah Tamer =>
Salanki Ajay =>
Salavaria Sharon =>

每個條目包含索引鍵列和收藏價值。 此外,SQL Server非聚集索引條目有internal-use-only頭信息和可能包含一些可選的數據值。 這些將在以後的水平; 也不是重要的在這個時候非聚集索引的基本理解。

現在,我們需要知道的是,鍵值使SQL Server能夠找到合適的索引條目(年代); 和條目的收藏價值使得SQL Server訪問相應的數據表中的行。

索引條目的好處在序列

索引條目排序的索引鍵值(s),那麽SQL Server可以快速遍歷順序條目。 的掃描序列條目可以開始從一開始的指數,指數,指數中或從任何條目。

因此,如果一個請求要求所有聯系人的姓開頭字母“S”(LastName像‘ S % ‘),SQL Server可以快速導航到第一個“S”條目(“Sabella,迪安娜”),然後遍歷索引,使用書簽訪問的行,直到到達第一個“T”條目; 這時它知道它檢索所有的“S”條目。

上述請求執行更快如果所有選中的列索引。 因此,如果我們發布:

SELECT FirstName, LastName 

    FROM Contact 

    WHERE LastName LIKE ‘S%‘;

SQL Server可以快速導航到第一個“S”條目,然後遍歷索引條目,忽略了書簽和檢索數據值直接從索引條目,直到它到達第一個“T”條目。 在關系數據庫術語中,該指數“覆蓋”查詢。

任何SQL操作符的好處從測序數據可以從索引中受益。 這包括ORDER BY、組,不同的聯盟(聯盟),並加入…。

例如,如果請求要求計數的聯系人的姓,SQL Server可以在第一項開始計數,並進行指數。 每次姓的價值變化,SQL Server輸出當前計數,並開始一個新的計數。 與前面的請求,這是一個覆蓋查詢; SQL Server訪問索引,完全忽略了表。

註意從左到右的順序的重要性的關鍵列。 我們的指數是非常有用的,如果一個請求要求每個人的姓“艾什頓”,但很少或根本沒有幫助如果請求是對每個人都是誰的名字“艾什頓”。

測試一些示例查詢

如果你想執行測試查詢,確保你運行該腳本創建兩個版本新聯系表,dbo.Contacts_indexdbo.Contacts_noindex;創建並運行腳本名,姓指數dbo.Contacts_index

驗證斷言在前面的小節中,我們將在相同的性能統計數據,我們使用1級和運行一些查詢; 有和沒有索引。

SET STATISTICS io ON

SET STATISTICS time ON


SQLSELECT FirstName, LastName
FROM dbo.Contacts -- execute with both Contacts_noindex and
-- Contacts_index
WHERE LastName LIKE ‘S%‘Without Index(2130 row(s) affected)
Table ‘Contacts_noindex‘. Scan count 1, logical reads 568.With Index(2130 row(s) affected)
Table ‘Contacts_index‘. Scan count 1, logical reads 14.Index ImpactIO reduced from 568 reads to 14 reads.CommentsAn index that covers the query is a good thing to have. Without an index, the entire table is scanned to find the rows.
The “2130 rows” statistic indicates that “S” is a popular initial letter for last names, occurring in ten percent of all contacts.

測試一個Non-Covered查詢

接下來,我們修改我們的查詢請求與之前相同的行,但不包括列索引。 表2.2中給出了查詢執行信息。



深入非聚集索引:樓梯SQL Server二級索引