一、索引檢視表
多年以來,MicrosoftSQL Server一直支援建立稱為視圖的虛擬表。通常,這些視圖的主要作用是:
提供一種安全機制,將使用者限制到一個或多個基表的某個資料子集中。
提供一種機制,允許開發人員自訂使用者通過邏輯方式查看儲存在基表中的資料的方式。
通過 SQL Server 2000,SQL Server 視圖的功能得到了擴充,實現了系統效能方面的收益。可在視圖上建立唯一的叢集索引及非叢集索引,來提高最複雜的查詢的資料訪問效能。在 SQL Server 2000 和 2005 中,具有唯一的叢集索引的視圖即為索引檢視表。本文所討論的內容適用於 SQL Server 2005,其中有許多內容也適用於 SQL Server 2000。
從資料庫管理系統 (DBMS) 的角度看來,視圖是對資料(一種中繼資料類型)的一種描述。當建立了一個典型視圖時,通過封裝一個 SELECT 語句(定義一個結果集來表示為虛擬表)來定義中繼資料。當在另一個查詢的 FROM 子句中引用視圖時,將從系統目錄檢索該中繼資料,並替代該視圖的引用擴充中繼資料。視圖擴充之後,SQL Server 查詢最佳化工具會為執行查詢編譯一個執行計畫。查詢最佳化工具會搜尋針對某個查詢的一組可能的執行計畫,並根據對執行每個查詢計劃所需的實際時間的估計,選擇所能找到的成本最低的計劃。
對於非索引檢視表,解析查詢所必需的視圖部分會在運行時被具體化。任何計算(比如:聯結或彙總)都在每個引用視圖的查詢執行時完成1。在視圖上建立了唯一的叢集索引後,該視圖的結果集隨即被具體化,並儲存在資料庫的實體儲存體中,從而在執行時節省了執行這一高成本操作的開銷。
在查詢執行中,可通過兩種方式使用索引檢視表。查詢可直接引用索引檢視表,或者更重要的是,如果查詢最佳化工具確定該視圖可替換成本最低的查詢計劃中的部分或全部查詢,那麼就可以選定它。在第二種情況中,使用索引檢視表替代基礎資料表及其一般索引。不必在查詢中引用視圖以使查詢最佳化工具在查詢執行時使用該視圖。這使得現有的應用程式可以從新建立的索引檢視表中受益,而不必變更。
注意 索引檢視表是 SQL Server 2000 和 2005 各版本的一個功能。在 SQL Server 2000 和 2005 的 Developer 和 Enterprise 版本中,查詢處理器可使用索引檢視表來解析結構上與該視圖相匹配的查詢,即便不按名稱來引用視圖。在其他版本中,必須按名稱來引用視圖,並對視圖引用使用 NOEXPAND 提示來查詢索引檢視表的內容。
通過索引檢視表改善效能
運用索引提高查詢效能不算是一個新概念;但是,索引檢視表提供了一些藉助標準索引無法取得的效能收益。索引檢視表可通過以下方式提高查詢效能:
可預先計算彙總並將其儲存在索引中,從而在查詢執行時,最小化高成本的計算。
可預先聯結各個表並儲存最終獲得的資料集。
可儲存聯結或彙總的組合。
該圖說明了當查詢最佳化工具使用索引檢視表時,通常所能取得的效能改進。所列舉的查詢在複雜性上有所不同(比如:彙總計算的數量、所用表的數量或謂詞的數量)並包含來自真實的生產環境的具有數百萬行的表。
在視圖上使用非叢集索引
其次,視圖上的非叢集索引可提供更好的查詢效能。與表上的非叢集索引類似,視圖上的非叢集索引可提供更多選項,供查詢最佳化工具在編譯過程中選擇。例如,如果查詢包含叢集索引所未涉及的列,那麼最佳化器可在計劃中選擇一個或多個輔助索引,避免對索引檢視表或基表進行費時的完全掃描。
對架構添加索引會增加資料庫的開銷,因為索引需要持續的維護。在索引數量和維護開銷間尋求適當的平衡點時,應謹慎權衡。