本文介紹 SQL Server 2000 企業版的新功能 - 索引視圖。講解索引視圖並討論一些提高性能的具體方案。
什麼是索引視圖?
許多年來,Microsoft® SQL Server™ 一直都提供創建虛擬表(稱為視圖)的功能。在過去,這些視圖主要有兩種用途:
提供安全機制,將用戶限制在一個或多個基表中的數據的某個子集。
提供一種機制,允許開發人員定制用戶如何才能以邏輯方式查看存儲在基表中的數據。
SQL Server 2000 已經擴展了 SQL Server 視圖的功能,以提高系統性能。它可以在一個視圖上創建唯一的群集索引和非群集索引,可以改進最復雜查詢的數據訪問性能。在 SQL Server 2000 中,擁有唯一群集索引的視圖被稱為索引視圖。
注意:索引視圖只是SQL Server 2000 企業版和SQL Server 2000 開發人員版的一個功能。
從數據庫管理系統 (DBMS) 的觀點來看,視圖是數據(元數據)的說明。創建典型視圖時,通過 SELECT 語句(定義一個顯示為虛擬表的結果集)來定義元數據。當其它查詢的 FROM 子句中引用了某個視圖時,將從系統目錄中檢索該元數據,並對其進行擴展以代替該視圖的引用。在視圖擴展之後,查詢優化器會為正在執行的查詢編譯單個執行計劃。
如果是非索引視圖,視圖在運行時將被實體化。任何計算(如聯接或聚合)都在為每個引用該視圖的查詢執行查詢期間進行。(視圖並不總需要被完全實體化。查詢可以包含其它一些謂詞、聯接或聚合,以應用於該視圖所引用的表和視圖。)在視圖上創建了唯一的群集索引之後,視圖的結果集會立即被實體化並持續保存在數據庫的物理存儲空間中,以便節省這種操作所占用的大量資源。
在執行查詢時,有兩種方法可以使用索引視圖。查詢可直接引用索引視圖,更重要的是,如果查詢優化器確定視圖能夠替換為查詢的部分或全部,而且這是低成本的查詢計劃,則可以選擇索引視圖。第二種情況是使用索引視圖代替基礎表及其普通索引。此時,不需要在查詢中引用視圖,查詢優化器即可在執行查詢期間使用該視圖。這樣,現有的應用程序無需更改即可從新建的索引視圖中獲益。
通過索引視圖提高的性能
使用索引來提高查詢性能並不是什麼新觀念,不過,索引視圖還具有使用標准索引不能獲得的其它性能優點。索引視圖能夠在以下方面提高查詢性能:
能夠預先計算聚合並將其存儲在索引中,從而最大限度地減少在執行查詢期間進行成本很高的計算。
能夠預先聯接表並存儲生成的數據集。
能夠存儲聯接或聚合的組合。
下圖說明了查詢優化器使用索引視圖時一般能夠提高多少性能。提供的查詢復雜程度各不相同(例如,聚合計算的數量、所用表的數量或謂詞數),並包括來自實際生產環境的數百萬行的大表。
圖 1. 當查詢優化器使用索引視圖時一般能夠提高多少性能
使用視圖的輔助索引
視圖的輔助性非群集索引可以提高其它查詢性能。與表的輔助索引類似,視圖的輔助索引也可以提供更多選項,以便查詢優化器在編譯過程中從中進行選擇。例如,如果查詢包括群集索引未涉及的列,優化器可以在計劃中選擇一個或多個輔助索引,從而避免對索引視圖或基表進行費時的全局掃描。
由於索引需要不斷維護,所以為架構添加索引會增加數據庫的額外開銷。因此應該認真考慮,找到索引和維護額外開銷之間的平衡點。