首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 索引視圖效能優化:建立條件、限制與維護策略深度解析

     編輯:關於SqlServer

視圖返回結果集與表具相同表格形式,可在 SQL 語句中如表般引用,故稱「虛表」。標準視圖結果集不以表形式儲存,僅在執行引用視圖的查詢時,SQL Server 才將基礎表資料合併成視圖邏輯結構。此動態生成機制在大量資料行、複雜聚合或連接操作時,會帶來沉重系統負擔,尤其頻繁引用大容量視圖時更顯著。

核心解決方案:建立叢集索引

為視圖建立叢集索引可顯著提升效能。建立後,視圖結果集如叢集索引表般實際儲存於資料庫中。

索引視圖的額外效益

  • 優化器可在 FROM 子句未直接引用視圖的查詢中使用視圖索引
  • 既有視圖無需重寫查詢代碼,即可提升從索引視圖檢索資料的效率
  • 修改索引視圖資料會即時反映至基礎表,反之亦然;索引唯一性大幅提升 SQL Server 定位被修改資料行的速度

權衡考量: 維護索引視圖比維護基礎表索引更複雜。若認為以資料修改增加系統負擔為代價、換取檢索速度提升屬值得,則應建立視圖索引。

建立視圖索引的前置條件(全部必須滿足)

  • 執行 CREATE VIEW 時,ANSI_NULLS 與 QUOTED_IDENTIFIER 必須設為 ON
  • 建立基礎表時 ANSI_NULLS 必須為 ON
  • 視圖僅引用基礎表,不引用其他視圖
  • 基礎表與視圖同屬一資料庫且擁有者相同
  • 建立視圖時必須使用 SCHEMABINDING 選項
  • 若引用使用者自訂函數,函數建立時亦須使用 SCHEMABINDING
  • 視圖必須以 owner.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 為 OFF
  • 視圖不含 text、ntext、image 類型欄位
  • 若視圖 SELECT 含 ORDER BY,叢集索引鍵值僅能為 ORDER BY 定義的欄位

修改索引視圖資料的選項一致性要求

修改視圖資料時,選項設定必須與建立索引時一致,否則 SQL Server 回報錯誤並回滾 INSERT、UPDATE、DELETE 操作。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved