一、索引視圖
多年以來,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 提示來查詢索引視圖的內容。
通過索引視圖改善性能
運用索引提高查詢性能不算是一個新概念;但是,索引視圖提供了一些借助標准索引無法取得的性能收益。索引視圖可通過以下方式提高查詢性能:
可預先計算聚合並將其保存在索引中,從而在查詢執行時,最小化高成本的計算。
可預先聯接各個表並保存最終獲得的數據集。
可保存聯接或聚合的組合。
該圖說明了當查詢優化器使用索引視圖時,通常所能取得的性能改進。所列舉的查詢在復雜性上有所不同(比如:聚合計算的數量、所用表的數量或謂詞的數量)並包含來自真實的生產環境的具有數百萬行的表。
在視圖上使用非聚集索引
其次,視圖上的非聚集索引可提供更好的查詢性能。與表上的非聚集索引類似,視圖上的非聚集索引可提供更多選項,供查詢優化器在編譯過程中選擇。例如,如果查詢包含聚集索引所未涉及的列,那麼優化器可在計劃中選擇一個或多個輔助索引,避免對索引視圖或基表進行費時的完全掃描。
對架構添加索引會增加數據庫的開銷,因為索引需要持續的維護。在索引數量和維護開銷間尋求適當的平衡點時,應謹慎權衡。