- 論壇徽章:
- 0
|
視圖是為用戶對數(shù)據(jù)多種顯示需求而創(chuàng)建的,其主要用在一下幾種情況:
(1)限制用戶只能訪問特定表特定條件的內(nèi)容,提高系統(tǒng)的安全性。
(2)隱藏表結(jié)構(gòu)、創(chuàng)建多種形式的數(shù)透視,滿足不同用戶需求。
(3)將復雜的SELECT語句和表JION形成一個視圖,給用戶提供一個良好的接口。
(4)為使用頻率較高的聯(lián)表聚合運算創(chuàng)建索引視圖,以提升程序的性能。
(5)創(chuàng)建分區(qū)視圖調(diào)用遠程數(shù)據(jù),實現(xiàn)數(shù)據(jù)的分布式存儲與查詢,提升程序的吞吐能力。
一了解視圖
視圖是一個虛擬表,其內(nèi)容由查詢定義。同真實的表一樣,視圖包含一系列帶有名稱的列和行數(shù)據(jù)。視圖在數(shù)據(jù)庫中并不是以數(shù)據(jù)值存儲集形式存在,除非是索引視圖。行和列數(shù)據(jù)來自由定義視圖的查詢所引用的表,并且在引用視圖時動態(tài)生成。
對其中所引用的基礎(chǔ)表來說,視圖的作用類似于篩選。定義視圖的篩選可以來自當前或其他數(shù)據(jù)庫的一個或多個表,或者其他視圖。分布式查詢也可用于定義使用多個異類源數(shù)據(jù)的視圖。例如,如果有多臺不同的服務(wù)器分別存儲您的單位在不同地區(qū)的數(shù)據(jù),而您需要將這些服務(wù)器上結(jié)構(gòu)相似的數(shù)據(jù)組合起來,這種方式就很有用。
二、視圖類型
在 SQL Server 2005 中,您可以創(chuàng)建標準視圖、索引視圖和分區(qū)視圖。
標準視圖
標準視圖組合了一個或多個表中的數(shù)據(jù),您可以獲得使用視圖的大多數(shù)好處,包括將重點放在特定數(shù)據(jù)上及簡化數(shù)據(jù)操作。
索引視圖
索引視圖是被具體化了的視圖,即它已經(jīng)過計算并存儲?梢詾橐晥D創(chuàng)建索引,即對視圖創(chuàng)建一個唯一的聚集索引。索引視圖可以顯著提高某些類型查詢的性能。索引視圖尤其適于聚合許多行的查詢。但它們不太適于經(jīng)常更新的基本數(shù)據(jù)集。
分區(qū)視圖
分區(qū)視圖在一臺或多臺服務(wù)器間水平連接一組成員表中的分區(qū)數(shù)據(jù)。這樣,數(shù)據(jù)看上去如同來自于一個表。聯(lián)接同一個 SQL Server 實例中的成員表的視圖是一個本地分區(qū)視圖。
三、使用視圖的情況
視圖通常用來集中、簡化和自定義每個用戶對數(shù)據(jù)庫的不同認識。視圖可用作安全機制,方法是允許用戶通過視圖訪問數(shù)據(jù),而不授予用戶直接訪問視圖基礎(chǔ)表的權(quán)限。視圖可用于提供向后兼容接口來模擬曾經(jīng)存在但其架構(gòu)已更改的表。還可以在向 Microsoft SQL Server 2005 復制數(shù)據(jù)和從其中復制數(shù)據(jù)時使用視圖,以便提高性能并對數(shù)據(jù)進行分區(qū)。
著重于特定數(shù)據(jù)視圖使用戶能夠著重于他們所感興趣的特定數(shù)據(jù)和所負責的特定任務(wù)。不必要的數(shù)據(jù)或敏感數(shù)據(jù)可以不出現(xiàn)在視圖中。例如, AdventureWorks 示例數(shù)據(jù)庫中的視圖 vBikes 允許用戶查看當前庫存的所有自行車的名稱。該視圖將從 Product 表中篩選掉除 Name 之外的所有字段,并僅返回自行車成品的名稱,而不是自行車配件的名稱。
簡化數(shù)據(jù)操作
視圖可以簡化用戶處理數(shù)據(jù)的方式?梢詫⒊S寐(lián)接、投影、UNION 查詢和 SELECT 查詢定義為視圖,以便使用戶不必在每次對該數(shù)據(jù)執(zhí)行附加操作時指定所有條件和條件限定。例如,可以將一個用于報表目的且執(zhí)行子查詢、外聯(lián)接和聚合來從一組表中檢索數(shù)據(jù)的復雜查詢創(chuàng)建為視圖。視圖簡化了對數(shù)據(jù)的訪問,因為每次生成報表時無需編寫或提交基礎(chǔ)查詢,而是查詢視圖。有關(guān)對數(shù)據(jù)進行操作的詳細信息,請參閱查詢基礎(chǔ)知識。
盡管不是復雜查詢, AdventureWorks 示例數(shù)據(jù)庫中的視圖 vBikes 仍允許用戶著重于特定數(shù)據(jù),而不必構(gòu)造生成視圖所需的 JOIN 子句。
還可以創(chuàng)建用戶定義的內(nèi)聯(lián)函數(shù),在邏輯上作為參數(shù)化視圖運行,或者作為在 WHERE 子句搜索條件或查詢的其他部分中含有參數(shù)的視圖運行。
提供向后兼容性
視圖使您能夠在表的架構(gòu)更改時為表創(chuàng)建向后兼容接口。例如,一個應(yīng)用程序可能引用了具有以下架構(gòu)的非規(guī)范化表:
Employee(Name, BirthDate, Salary, Department, BuildingName)
若要避免在數(shù)據(jù)庫中重復存儲數(shù)據(jù),可以通過將該表拆分為下列兩個表來規(guī)范化該表:
Employee2(Name, BirthDate, Salary, DeptId)
Department(DeptId, BuildingName)
若要提供仍然可引用 Employee 中數(shù)據(jù)的向后兼容接口,可以刪除舊的 Employee 表并以以下視圖中的內(nèi)容替換它:
自定義數(shù)據(jù)
視圖允許用戶以不同方式查看數(shù)據(jù),即使在他們同時使用相同的數(shù)據(jù)時也是如此。這在具有許多不同目的和技術(shù)水平的用戶共用同一數(shù)據(jù)庫時尤其有用。例如,可創(chuàng)建一個視圖以僅檢索由客戶經(jīng)理處理的客戶數(shù)據(jù)。該視圖可以根據(jù)使用它的客戶經(jīng)理的登錄 ID 決定檢索哪些數(shù)據(jù)
導出和導入數(shù)據(jù)
可使用視圖將數(shù)據(jù)導出到其他應(yīng)用程序。例如,您可能希望使用 AdventureWorks 數(shù)據(jù)庫中的 Customer 和 SalesOrderHeader 表在 Microsoft Excel 中分析銷售數(shù)據(jù)。為此,可基于 Customer 和 SalesOrderHeader 表創(chuàng)建視圖。然后可以使用 bcp 實用工具導出視圖定義的數(shù)據(jù)。如果使用 INSERT 語句可以在某些視圖中插入行,那么使用 bcp 實用工具或 BULK INSERT 語句也可將數(shù)據(jù)文件中的數(shù)據(jù)導入視圖。
跨服務(wù)器組合分區(qū)數(shù)據(jù)
Transact-SQL UNION 集合運算符可在視圖內(nèi)使用,將單獨表的兩個或多個查詢的結(jié)果組合到單一的結(jié)果集中。這在用戶看來是一個單獨的表,稱為分區(qū)視圖。例如,如果一個表包含華盛頓的銷售數(shù)據(jù),另一個表包含加利福尼亞的銷售數(shù)據(jù),則可以對這兩個表使用 UNION 創(chuàng)建一個視圖。該視圖代表這兩個地區(qū)的銷售數(shù)據(jù)
四、視圖解析
SQL Server 2005 查詢處理器對索引視圖和非索引視圖將區(qū)別對待:
索引視圖的行以表的格式存儲在數(shù)據(jù)庫中[只有創(chuàng)建了索引才分配存儲空間]。如果查詢優(yōu)化器決定使用查詢計劃的索引視圖,則索引視圖將按照基表的處理方式進行處理。
只有非索引視圖的定義才存儲,而不存儲視圖的行。查詢優(yōu)化器將視圖定義中的邏輯納入執(zhí)行計劃,而該執(zhí)行計劃是它為引用非索引視圖的 SQL 語句生成的。
SQL Server 查詢優(yōu)化器用于決定何時使用索引視圖的邏輯與用于決定何時對表使用索引的邏輯相似。如果索引視圖中的數(shù)據(jù)包括所有或部分 SQL 語句,而且查詢優(yōu)化器確定視圖的某個索引是低成本的訪問路徑,則不論查詢中是否引用了該視圖的名稱,查詢優(yōu)化器都將選擇此索引。
當 SQL 語句引用非索引視圖時,分析器和查詢優(yōu)化器將分析 SQL 語句的源和視圖的源,然后將它們解析為單個執(zhí)行計劃。沒有單獨用于 SQL 語句或視圖的計劃。
與所有索引相同,僅當查詢優(yōu)化器確定在 SQL Server 的查詢計劃中使用索引視圖有益時,SQL Server 才會選擇使用視圖索引。當滿足下列條件時,SQL Server 查詢優(yōu)化器使用索引視圖:
當滿足下列條件時,SQL Server 查詢優(yōu)化器使用索引視圖:
下列會話選項均設(shè)置為 ON:
ANSI_NULLS
ANSI_PADDING
ANSI_WARNINGS
ARITHABORT
CONCAT_NULL_YIELDS_NULL
QUOTED_IDENTIFIER
NUMERIC_ROUNDABORT 會話選項設(shè)置為 OFF。
查詢優(yōu)化器查找視圖索引列與查詢中的元素之間的匹配,例如:
WHERE 子句中的搜索條件謂詞
聯(lián)接操作
聚合函數(shù)
GROUP BY 子句
表引用
估計的索引使用成本是查詢優(yōu)化器考慮使用的所有訪問機制中的最低成本。
查詢中引用(直接或通過展開視圖訪問其基礎(chǔ)表)的且與索引視圖中的表引用相對應(yīng)的每個表在該查詢中都必須具有應(yīng)用于表的相同提示集
我們不必SELECT的子句中顯式引用索引視圖,查詢優(yōu)化器即可使用該索引視圖。
五、設(shè)計和實現(xiàn)視圖
1、創(chuàng)建標準視圖
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE VIEW [dbo].[Product_Name]
as
select ID,Name,CateID from Product where CateID=0
GO
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
創(chuàng)建視圖的注意事項:
(1)除非使用TOP N選項否則不能使用ORDER BY語句;
(2)不能使用INTO語句;
(3)不能使用臨時表的列。
2、設(shè)計索引視圖的幾大要點。
盡量在很少更新(增刪改)基礎(chǔ)數(shù)據(jù)表上建立索引視圖。
涉及大量聚合或聯(lián)接的查詢
數(shù)據(jù)量小查詢較多的數(shù)據(jù)表
3、創(chuàng)建索引視圖
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
--創(chuàng)建索引視圖
CREATE VIEW [dbo].[Product_Name]
with SCHEMABINDING
as
select ID,Name,CateID from [dbo].Product where CateID=3
GO
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
GO
--創(chuàng)建聚集索引
SET ARITHABORT ON
GO
SET CONCAT_NULL_YIELDS_NULL ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
SET ANSI_PADDING ON
GO
SET ANSI_WARNINGS ON
GO
SET NUMERIC_ROUNDABORT OFF
GO
/**//****** 對象: Index [Product_ViewIndex_ID] 腳本日期: 09/04/2007 23:25:33 ******/
CREATE UNIQUE CLUSTERED INDEX [Product_ViewIndex_ID] ON [dbo].[Product_Name]
(
[ID] ASC
)WITH (SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF) ON [PRIMARY]
GO
--創(chuàng)建非聚集索引
CREATE NONCLUSTERED INDEX [Product_ViewIndex_Name] ON [dbo].[Product_Name]
(
[Name] ASC
)
創(chuàng)建索引視圖的注意事項:
當執(zhí)行 CREATE VIEW 語句時,ANSI_NULLS 和 QUOTED_IDENTIFIER 選項必須設(shè)置為 ON。
要執(zhí)行所有 CREATE TABLE 語句以創(chuàng)建視圖引用的表,ANSI_NULLS 選項必須設(shè)置為 ON。
視圖不能引用任何其他視圖,只能引用基表。
視圖引用的所有基表必須與視圖位于同一數(shù)據(jù)庫中,并且所有者也與視圖相同。
必須使用 SCHEMABINDING 選項創(chuàng)建視圖。架構(gòu)綁定將視圖綁定到基礎(chǔ)基表的架構(gòu)。
必須已使用 SCHEMABINDING 選項創(chuàng)建了視圖引用的用戶定義函數(shù)。
表和用戶定義函數(shù)必須由視圖中由兩部分組成的名稱引用。不允許由一部分、三部分和四部分組成的名稱引用它們。
視圖中的表達式引用的所有函數(shù)必須是確定的。
如果視圖定義使用聚合函數(shù),SELECT 列表還必須包括 COUNT_BIG (*)。
用戶定義函數(shù)的數(shù)據(jù)訪問屬性必須為 NO SQL,外部訪問屬性必須是 NO
公共語言運行時 (CLR) 功能可以出現(xiàn)在視圖的選擇列表中,但不能作為聚集索引鍵定義的一部分。CLR 函數(shù)不能出現(xiàn)在視圖的 WHERE 子句中或視圖中的 JOIN 運算的 ON 子句中。
視圖中的 SELECT 語句不能包含下列 Transact-SQL 語法元素:
指定列的 * 或 table_name.* 語法。必須明確給出列名。
不能在多個視圖列中指定用作簡單表達式的表列名。如果對列的所有(或除了一個引用之外的所有)引用是復雜表達式的一部分或是函數(shù)的一個參數(shù),則可以多次引用該列。
派生表。
公用表表達式 (CTE)。
行集函數(shù)
UNION、EXCEPT 或 INTERSECT 運算符
子查詢
外聯(lián)接或自聯(lián)接
TOP 子句
ORDER BY 子句
DISTINCT 關(guān)鍵字
COUNT(*)(允許 COUNT_BIG(*)。)
AVG、MAX、MIN、STDEV、STDEVP、VAR 或 VARP 聚合函數(shù)。
引用可為空表達式的 SUM 函數(shù)。
包括排名或聚合窗口函數(shù)的 OVER 子句。
CLR 用戶定義聚合函數(shù)。
全文謂詞 CONTAINS 或 FREETEXT。
COMPUTE 或 COMPUTE BY 子句。
CROSS APPLY 或 OUTER APPLY 運算符。
PIVOT 或 UNPIVOT 運算符。
表提示(僅應(yīng)用于 90 或更高的兼容級別)。
聯(lián)接提示。
對 Xquery 表達式的直接引用
指定 GROUP BY 后,視圖 SELECT 列表必須包含 COUNT_BIG(*) 表達式,并且視圖定義不能指定 HAVING、CUBE 或 ROLLUP。
4、創(chuàng)建分區(qū)視圖。
分區(qū)視圖在一臺或多臺服務(wù)器間水平連接一組成員表中的分區(qū)數(shù)據(jù),使數(shù)據(jù)看起來就像來自一個表。
--建立鏈接服務(wù)器
exec sp_addlinkedserver @srvproduct=N\'\',@server=\'LocalServer\',@provider=\'MSDASQL\',@provstr=\'driver={SQL SERVER};server=192.168.1.253;uid=sa;pwd=123\'
--建立鏈接服務(wù)器登錄映射
exec sp_addlinkedsrvlogin @rmtsrvname=\'LocalServer\',@useself=\'false\',@locallogin=\'sa\',@rmtuser=\'sa\',@rmtpassword=\'123\'
go
--創(chuàng)建分區(qū)查詢
Create View DistributVIew
as
select * from [LocalServer].TEST.dbo.[A]
union all
select * from A
六、視圖使用示例
1、使用視圖
select * from Product_Name
2、通過視圖修改數(shù)據(jù)
update Product_Name set CateID=5 where ID=60
3、通過視圖刪除數(shù)據(jù)
delete from Product_Name where ID=61 |
|