sql視圖學習筆記--視圖

視圖是爲用戶對數據多種顯示需求而建立的,其主要用在一下幾種狀況: (1)限制用戶只能訪問特定表特定條件的內容,提升系統的安全性。 (2)隱藏表結構、建立多種形式的數透視,知足不一樣用戶需求。 (3)將複雜的SELECT語句和表JION造成一個視圖,給用戶提供一個良好的接口。 (4)爲使用頻率較高的聯表聚合運算建立索引視圖,以提高程序的性能。 (5)建立分區視圖調用遠程數據,實現數據的分佈式存儲與查詢,提高程序的吞吐能力。數據庫

一瞭解視圖           視圖是一個虛擬表,其內容由查詢定義。同真實的表同樣,視圖包含一系列帶有名稱的列和行數據。視圖在數據庫中並非以數據值存儲集形式存在,除非是索引視圖。行和列數據來自由定義視圖的查詢所引用的表,而且在引用視圖時動態生成。 對其中所引用的基礎表來講,視圖的做用相似於篩選。定義視圖的篩選能夠來自當前或其餘數據庫的一個或多個表,或者其餘視圖。分佈式查詢也可用於定義使用多個異類源數據的視圖。例如,若是有多臺不一樣的服務器分別存儲您的單位在不一樣地區的數據,而您須要將這些服務器上結構類似的數據組合起來,這種方式就頗有用。安全

2、視圖類型 在 SQL Server 2005 中,您能夠建立標準視圖、索引視圖和分區視圖。 標準視圖          標準視圖組合了一個或多個表中的數據,您能夠得到使用視圖的大多數好處,包括將重點放在特定數據上及簡化數據操做。 索引視圖               索引視圖是被具體化了的視圖,即它已通過計算並存儲。能夠爲視圖建立索引,即對視圖建立一個惟一的彙集索引。索引視圖能夠顯著提升某些類型查詢的性能。索引視圖尤爲適於聚合許多行的查詢。但它們不太適於常常更新的基本數據集。 分區視圖          分區視圖在一臺或多臺服務器間水平鏈接一組成員表中的分區數據。這樣,數據看上去如同來自於一個表。聯接同一個 SQL Server 實例中的成員表的視圖是一個本地分區視圖。服務器

3、使用視圖的狀況         視圖一般用來集中、簡化和自定義每一個用戶對數據庫的不一樣認識。視圖可用做安全機制,方法是容許用戶經過視圖訪問數據,而不授予用戶直接訪問視圖基礎表的權限。視圖可用於提供向後兼容接口來模擬曾經存在但其架構已更改的表。還能夠在向 Microsoft SQL Server 2005 複製數據和從其中複製數據時使用視圖,以便提升性能並對數據進行分區。 着重於特定數據視圖使用戶可以着重於他們所感興趣的特定數據和所負責的特定任務。沒必要要的數據或敏感數據能夠不出如今視圖中。例如, AdventureWorks 示例數據庫中的視圖 vBikes 容許用戶查看當前庫存的全部自行車的名稱。該視圖將從 Product 表中篩選掉除 Name 以外的全部字段,並僅返回自行車成品的名稱,而不是自行車配件的名稱。架構

簡化數據操做          視圖能夠簡化用戶處理數據的方式。能夠將經常使用聯接、投影、UNION 查詢和 SELECT 查詢定義爲視圖,以便使用戶沒必要在每次對該數據執行附加操做時指定全部條件和條件限定。例如,能夠將一個用於報表目的且執行子查詢、外聯接和聚合來從一組表中檢索數據的複雜查詢建立爲視圖。視圖簡化了對數據的訪問,由於每次生成報表時無需編寫或提交基礎查詢,而是查詢視圖。有關對數據進行操做的詳細信息,請參閱查詢基礎知識。 儘管不是複雜查詢, AdventureWorks 示例數據庫中的視圖 vBikes 仍容許用戶着重於特定數據,而沒必要構造生成視圖所需的 JOIN 子句。 還能夠建立用戶定義的內聯函數,在邏輯上做爲參數化視圖運行,或者做爲在 WHERE 子句搜索條件或查詢的其餘部分中含有參數的視圖運行。 提供向後兼容性       視圖使您可以在表的架構更改時爲表建立向後兼容接口。例如,一個應用程序可能引用了具備如下架構的非規範化表: Employee(Name, BirthDate, Salary, Department, BuildingName) 若要避免在數據庫中重複存儲數據,能夠經過將該表拆分爲下列兩個表來規範化該表: Employee2(Name, BirthDate, Salary, DeptId) Department(DeptId, BuildingName) 若要提供仍然可引用 Employee 中數據的向後兼容接口,能夠刪除舊的 Employee 表並以如下視圖中的內容替換它: 自定義數據          視圖容許用戶以不一樣方式查看數據,即便在他們同時使用相同的數據時也是如此。這在具備許多不一樣目的和技術水平的用戶共用同一數據庫時尤爲有用。例如,可建立一個視圖以僅檢索由客戶經理處理的客戶數據。該視圖能夠根據使用它的客戶經理的登陸 ID 決定檢索哪些數據 導出和導入數據          可以使用視圖將數據導出到其餘應用程序。例如,您可能但願使用 AdventureWorks 數據庫中的 Customer 和 SalesOrderHeader 表在 Microsoft Excel 中分析銷售數據。爲此,可基於 Customer 和 SalesOrderHeader 表建立視圖。而後可使用 bcp 實用工具導出視圖定義的數據。若是使用 INSERT 語句能夠在某些視圖中插入行,那麼使用 bcp 實用工具或 BULK INSERT 語句也可將數據文件中的數據導入視圖。 跨服務器組合分區數據          Transact-SQL UNION 集合運算符可在視圖內使用,將單獨表的兩個或多個查詢的結果組合到單一的結果集中。這在用戶看來是一個單獨的表,稱爲分區視圖。例如,若是一個表包含華盛頓的銷售數據,另外一個表包含加利福尼亞的銷售數據,則能夠對這兩個表使用 UNION 建立一個視圖。該視圖表明這兩個地區的銷售數據分佈式

4、視圖解析 SQL Server 2005 查詢處理器對索引視圖和非索引視圖將區別對待: 索引視圖的行以表的格式存儲在數據庫中[只有建立了索引才分配存儲空間]。若是查詢優化器決定使用查詢計劃的索引視圖,則索引視圖將按照基表的處理方式進行處理。 只有非索引視圖的定義才存儲,而不存儲視圖的行。查詢優化器將視圖定義中的邏輯歸入執行計劃,而該執行計劃是它爲引用非索引視圖的 SQL 語句生成的。 SQL Server 查詢優化器用於決定什麼時候使用索引視圖的邏輯與用於決定什麼時候對錶使用索引的邏輯類似。若是索引視圖中的數據包括全部或部分 SQL 語句,並且查詢優化器肯定視圖的某個索引是低成本的訪問路徑,則不論查詢中是否引用了該視圖的名稱,查詢優化器都將選擇此索引。 當 SQL 語句引用非索引視圖時,分析器和查詢優化器將分析 SQL 語句的源和視圖的源,而後將它們解析爲單個執行計劃。沒有單獨用於 SQL 語句或視圖的計劃。 與全部索引相同,僅當查詢優化器肯定在 SQL Server 的查詢計劃中使用索引視圖有益時,SQL Server 纔會選擇使用視圖索引。當知足下列條件時,SQL Server 查詢優化器使用索引視圖:      當知足下列條件時,SQL Server 查詢優化器使用索引視圖: 下列會話選項均設置爲 ON: ANSI_NULLS ANSI_PADDING ANSI_WARNINGS ARITHABORT CONCAT_NULL_YIELDS_NULL QUOTED_IDENTIFIER NUMERIC_ROUNDABORT 會話選項設置爲 OFF。 查詢優化器查找視圖索引列與查詢中的元素之間的匹配,例如: WHERE 子句中的搜索條件謂詞 聯接操做 聚合函數 GROUP BY 子句 表引用 估計的索引使用成本是查詢優化器考慮使用的全部訪問機制中的最低成本。 查詢中引用(直接或經過展開視圖訪問其基礎表)的且與索引視圖中的表引用相對應的每一個表在該查詢中都必須具備應用於表的相同提示集 咱們沒必要SELECT的子句中顯式引用索引視圖,查詢優化器便可使用該索引視圖。ide

5、設計和實現視圖           一、建立標準視圖函數

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工具

         建立視圖的注意事項:              (1)除非使用TOP N選項不然不能使用ORDER BY語句;             (2)不能使用INTO語句;            (3)不能使用臨時表的列。 二、設計索引視圖的幾大要點。             儘可能在不多更新(增刪改)基礎數據表上創建索引視圖。             涉及大量聚合或聯接的查詢             數據量小查詢較多的數據表 三、建立索引視圖性能

SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO --建立索引視圖 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 --建立彙集索引 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 --建立非彙集索引 CREATE NONCLUSTERED INDEX [Product_ViewIndex_Name] ON [dbo].[Product_Name] (     [Name] ASC )優化

建立索引視圖的注意事項:        當執行 CREATE VIEW 語句時,ANSI_NULLS 和 QUOTED_IDENTIFIER 選項必須設置爲 ON。        要執行全部 CREATE TABLE 語句以建立視圖引用的表,ANSI_NULLS 選項必須設置爲 ON。        視圖不能引用任何其餘視圖,只能引用基表。        視圖引用的全部基表必須與視圖位於同一數據庫中,而且全部者也與視圖相同。        必須使用 SCHEMABINDING 選項建立視圖。架構綁定將視圖綁定到基礎基表的架構。        必須已使用 SCHEMABINDING 選項建立了視圖引用的用戶定義函數。        表和用戶定義函數必須由視圖中由兩部分組成的名稱引用。不容許由一部分、三部分和四部分組成的名稱引用它們。        視圖中的表達式引用的全部函數必須是肯定的。        若是視圖定義使用聚合函數,SELECT 列表還必須包括 COUNT_BIG (*)。        用戶定義函數的數據訪問屬性必須爲 NO SQL,外部訪問屬性必須是 NO        公共語言運行時 (CLR) 功能能夠出如今視圖的選擇列表中,但不能做爲彙集索引鍵定義的一部分。CLR 函數不能出如今視圖的 WHERE 子句中或視圖中的 JOIN 運算的 ON 子句中。        視圖中的 SELECT 語句不能包含下列 Transact-SQL 語法元素: 指定列的 * 或 table_name.* 語法。必須明確給出列名。 不能在多個視圖列中指定用做簡單表達式的表列名。若是對列的全部(或除了一個引用以外的全部)引用是複雜表達式的一部分或是函數的一個參數,則能夠屢次引用該列。 派生表。 公用表表達式 (CTE)。 行集函數 UNION、EXCEPT 或 INTERSECT 運算符 子查詢 外聯接或自聯接 TOP 子句 ORDER BY 子句 DISTINCT 關鍵字 COUNT(*)(容許 COUNT_BIG(*)。) AVG、MAX、MIN、STDEV、STDEVP、VAR 或 VARP 聚合函數。 引用可爲空表達式的 SUM 函數。 包括排名或聚合窗口函數的 OVER 子句。 CLR 用戶定義聚合函數。 全文謂詞 CONTAINS 或 FREETEXT。 COMPUTE 或 COMPUTE BY 子句。 CROSS APPLY 或 OUTER APPLY 運算符。 PIVOT 或 UNPIVOT 運算符。 表提示(僅應用於 90 或更高的兼容級別)。 聯接提示。 對 Xquery 表達式的直接引用        指定 GROUP BY 後,視圖 SELECT 列表必須包含 COUNT_BIG(*) 表達式,而且視圖定義不能指定 HAVING、CUBE 或 ROLLUP。 四、建立分區視圖。 分區視圖在一臺或多臺服務器間水平鏈接一組成員表中的分區數據,使數據看起來就像來自一個表。 --創建連接服務器

exec sp_addlinkedserver @srvproduct=N'',@server='LocalServer',@provider='MSDASQL',@provstr='driver={SQL SERVER};server=192.168.1.253;uid=sa;pwd=123' --創建連接服務器登陸映射 exec sp_addlinkedsrvlogin @rmtsrvname='LocalServer',@useself='false',@locallogin='sa',@rmtuser='sa',@rmtpassword='123' go --建立分區查詢 Create View DistributVIew as select * from [LocalServer].TEST.dbo.[A] union all select * from A

6、視圖使用示例

        一、使用視圖                select * from Product_Name        二、經過視圖修改數據                update Product_Name set CateID=5 where ID=60        三、經過視圖刪除數據              delete from Product_Name where ID=61

相關文章
相關標籤/搜索