視圖是一個虛擬表,其本質是一條預定義的 SELECT 查詢。數據庫僅存儲查詢定義,不存儲實際數據。查詢視圖時,引擎動態執行底層 SELECT 並返回結果集。用戶操作視圖的方式與操作普通表完全一致。
UNION ALL 將不同服務器的分表合並,實現水平擴展。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 視圖。-- 創建視圖並指定 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 可見底層執行計劃。