在 SQL Server 中,標準視圖常被稱為「虛擬資料表」,因為其結果集與實體資料表擁有相同的行列結構,且可在查詢中如同參考資料表般被引用。然而,標準視圖並不實際儲存資料,而是在查詢執行時,才動態地從基礎資料表合併數據並生成邏輯結構。這機制雖具彈性,但當視圖涉及大量資料列、複雜的彙總運算或多重連接操作時,動態建構結果集將對系統造成顯著效能負擔。
解決上述效能瓶頸的關鍵,在於為視圖建立叢集索引。一旦建立叢集索引,視圖的結果集便會如同擁有叢集索引的資料表一般,實際儲存於資料庫中。這不僅避免了重複計算,更帶來額外優勢:查詢優化器甚至可在 FROM 子句未直接引用該視圖的查詢中,自動使用視圖索引;對現有應用而言,無需重寫查詢代碼即可享受索引帶來的查詢加速效果。
索引視圖建立後,其資料會即時持久化。對索引視圖的任何修改(INSERT/UPDATE/DELETE)會立即反映至基礎資料表,反之亦然。索引的唯一性特徵更大幅提升了 SQL Server 定位被修改資料列的效率。但需權衡的是,維護索引視圖的複雜度高於維護基礎資料表索引,因此僅在「查詢效能提升」遠大於「資料修改額外負擔」的場景下建議採用。
在執行 CREATE VIEW 之前,視圖定義必須滿足以下嚴格條件:
ANSI_NULLS 與 QUOTED_IDENTIFIER 必須為 ON 狀態ANSI_NULLS 必須為 ONSCHEMABINDING 選項綁定結構描述SCHEMABINDINGowner.objectname 兩部分命名方式引用視圖定義的 SELECT 陳述式不得包含以下語法:
* 或 tablename.* 定義欄位(必須明確列出欄位名稱)UNION、DISTINCT、TOP、ORDER BY、COMPUTE、COMPUTE BY、COUNT(*)AVG、MAX、MIN、STDEV、STDEVP、VAR、VARP 等彙總函數視圖可建立多個索引,但第一個索引必須為叢集索引,之後才能建立非叢集索引。執行 CREATE INDEX 前,還需確認:
ANSI_NULLS、ANSI_PADDING、ANSI_WARNINGS、ARITHABORT、CONCAT_NULL_YIELDS_NULL、QUOTED_IDENTIFIER 皆為 ON;NUMERIC_ROUNDABORT 為 OFFtext、ntext、image 類型欄位SELECT 含 ORDER BY,叢集索引鍵值僅能為 ORDER BY 定義的欄位對索引視圖進行資料修改時,工作階段的選項設定必須與建立索引時完全一致,否則 SQL Server 將拋出錯誤並回滾 INSERT、UPDATE、DELETE 操作。