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

SQL Server 視圖深度解析:虛擬表、安全控制、分區與索引視圖全攻略

     編輯:關於SqlServer

什麼是視圖?

視圖是一個虛擬表,其本質是一條預定義的 SELECT 查詢。數據庫僅存儲查詢定義,不存儲實際數據。查詢視圖時,引擎動態執行底層 SELECT 並返回結果集。用戶操作視圖的方式與操作普通表完全一致。

視圖的六大核心價值

  1. 行級安全:限制用戶僅見特定行(如員工僅見自己工時記錄)。
  2. 列級安全:隱藏敏感列(如薪資、身份證號),僅暴露姓名、部門、電話等非敏感信息。
  3. 多表聯結簡化:將多表聯結封裝為單一虛擬表,簡化應用層查詢邏輯。
  4. 聚合數據呈現:直接返回 SUM、AVG、MAX 等聚合結果,隱藏明細數據。
  5. 跨實例分區視圖:結合 UNION ALL 將不同服務器的分表合並,實現水平擴展。
  6. 索引視圖加速查詢:在視圖上創建聚集索引,將結果集物理化存儲,大幅提升複雜聚合查詢性能。

視圖創建與嵌套實例

基礎視圖:多表聯結

CREATE VIEW titleview
AS
SELECT title, au_ord, au_lname, price, ytd_sales, pub_id
FROM authors AS a
JOIN titleauthor AS ta ON a.au_id = ta.au_id
JOIN titles AS t ON t.title_id = ta.title_id

嵌套視圖:衍生安全視圖

CREATE VIEW Cust_titleview
AS
SELECT title, au_lname, price, pub_id
FROM titleview

此視圖移除了 au_ord、ytd_sales 等內部字段,供外部客戶查詢已出版書籍,不洩露銷售數據。

分區視圖:跨服務器水平擴展

將大表按範圍拆分到多台服務器,每台建立成員表,再通過分區視圖合並:

CREATE VIEW PartitionedView AS
SELECT * FROM MyDatabase.dbo.PartitionTable1
UNION ALL
SELECT * FROM Server2.MyDatabase.dbo.PartitionTable2
UNION ALL
SELECT * FROM Server3.MyDatabase.dbo.PartitionTable3

三台服務器各建同結構視圖,應用端無感知訪問「完整大表」,實際每台僅存儲數據子集,讀寫性能線性擴展。

視圖更新機制

  • 單基表更新:修改只涉及一個基表的列時,可直接 UPDATE/DELETE/INSERT 視圖。
  • INSTEAD OF 觸發器:SQL Server 2000+ 支持在視圖上定義觸發器,攔截 DML 操作並轉發到多個基表,實現多表視圖的可更新性。
  • 分區視圖更新:支持跨多個成員表的插入/更新/刪除,引擎自動路由到正確分片。

索引視圖:決策支持系統的性能利器

-- 創建視圖並指定 SCHEMABINDING
CREATE VIEW vw_SalesSummary
WITH SCHEMABINDING
AS
SELECT ProductID, SUM(Quantity) AS TotalQty, COUNT_BIG(*) AS Cnt
FROM dbo.Sales
GROUP BY ProductID
GO

-- 創建聚集索引,結果集物理化
CREATE UNIQUE CLUSTERED INDEX IX_vw_SalesSummary
ON vw_SalesSummary (ProductID)

關鍵點:

  • 必須指定 SCHEMABINDING,防止基表結構變更導致視圖失效。
  • 聚合函數需用 COUNT_BIG(*) 而非 COUNT(*)。
  • 基表數據變更時,索引視圖自動同步維護,查詢直接讀取物理化結果,無需實時計算。

視圖解析與性能提示

  • 普通視圖為邏輯視圖,運行時動態展開,EXPLAIN PLAN 可見底層執行計劃。
  • 索引視圖為物理化視圖,佔用額外存儲,寫入開銷增加,適合「讀多寫少」的報表/分析場景。
  • 避免在視圖上再套視圖過深,增加優化器負擔。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved