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

SQL Server 視圖總結:設計原則、進階功能與效能考量

     編輯:關於SqlServer

核心定位

視圖是儲存的 SELECT 查詢,本身不儲存資料(索引視圖除外),每次引用時展開執行。主要價值:

  • 封裝與抽象:隱藏複雜聯結、篩選、衍生欄位邏輯。
  • 安全性:授予視圖權限而非基底表,實現行/欄級存取控制。
  • 介面穩定:基底表結構變更時,視圖可做適配層,避免應用端修改。

視圖分類與關鍵特性

類型定義可更新性典型用途
標準視圖單一 SELECT,無聚合、無 DISTINCT、無 UNION可更新(符合條件)資料存取介面、權限控管
複雜視圖含 GROUP BY、JOIN 多表、衍生欄位通常不可更新報表查詢、資料轉換
索引視圖WITH SCHEMABINDING + 唯一叢集索引不可直接更新預先計算彙總、加速複雜查詢
分割視圖UNION ALL 多個結構相同的表(不同資料分區)可更新(含分區欄位)大量資料水平分割、歸檔

進階功能詳解

1. WITH CHECK OPTION —— 保護視圖定義的篩選邊界

CREATE VIEW dbo.V_HighValueOrders
WITH SCHEMABINDING, CHECK OPTION
AS
SELECT OrderID, CustomerID, TotalAmount
FROM dbo.Orders
WHERE TotalAmount > 10000; -- 僅允許 >10000 的資料被 INSERT/UPDATE

若嘗試 INSERT INTO V_HighValueOrders VALUES (..., 5000) 會報錯,確保資料一致性。

2. WITH ENCRYPTION —— 隱藏定義邏輯

CREATE VIEW dbo.V_SensitiveData
WITH ENCRYPTION
AS SELECT ...;

加密後 sp_helptext、OBJECT_DEFINITION 均回傳 NULL,**不可逆**,請妥善保管原始腳本。

3. ALTER VIEW 的隱性重建行為

ALTER VIEW 實際上是 DROP + CREATE,會移除視圖原有的權限、加密、CHECK OPTION、擴展屬性。修改時必須在腳本中完整重述所有選項:

ALTER VIEW dbo.V_Example
WITH ENCRYPTION, CHECK OPTION, SCHEMABINDING
AS SELECT ...;

效能最佳實務

  1. 避免視圖疊加視圖:嵌套視圖導致查詢計畫膨脹、統計資訊不準。改以 CTE 或直接引用基底表。
  2. 謹慎使用索引視圖:維護成本高(每次基底表 DML 都要同步索引),僅用於高頻讀、低頻寫、彙總固定的場景。
  3. 生產環境限制視圖存取帳號:視圖增加解析開銷,大量並發時可能成為瓶頸。
  4. 使用 sp_helptext 或 OBJECT_DEFINITION 檢視定義,避免直接查系統表。

常見反模式與修正

反模式問題修正建議
把所有查詢都包成視圖維護地獄、計畫快取污染僅對穩定、共用、需權限控制的查詢建視圖
視圖中使用 SELECT *基底表新增欄位導致視圖輸出變更、應用報錯明確列出欄位清單
視圖缺少 SCHEMABINDING基底表結構變更不被阻擋,視圖失效加上 WITH SCHEMABINDING(需兩部分名稱)

適用場景速查

  • ✅ 過濾敏感欄位(薪資、身分證字號)
  • ✅ 固定聯結模式的多表查詢(如訂單+客戶+明細)
  • ✅ 彙總報表固定維度(月銷售額、區域業績)
  • ✅ 跨資料庫/伺服器邏輯整合(搭配同義詞)
  • ❌ 動態條件、參數化查詢 → 改用 內嵌表值函數
  • ❌ 高頻寫入的熱點表 → 直接操作基底表
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved