MSSQL視圖使用詳解

視圖是爲用戶對數據多種顯示需求而創建的,其主要用在一下幾種情況:
 (1)限制用戶只能訪問特定表特定條件的內容,提高系統的安全性。
 (2)隱藏表結構、創建多種形式的數透視,滿足不同用戶需求。
 (3)將複雜的SELECT語句和表JION形成一個視圖,給用戶提供一個良好的接口。
 (4)爲使用頻率較高的聯表聚合運算創建索引視圖,以提升程序的性能。
 (5)創建分區視圖調用遠程數據,實現數據的分佈式存儲與查詢,提升程序的吞吐能力。
一瞭解視圖
         視圖是一個虛擬表,其內容由查詢定義。同真實的表一樣,視圖包含一系列帶有名稱的列和行數據。視圖在數據庫中並不是以數據值存儲集形式存在,除非是索引視圖。行和列數據來自由定義視圖的查詢所引用的表,並且在引用視圖時動態生成。
 對其中所引用的基礎表來說,視圖的作用類似於篩選。定義視圖的篩選可以來自當前或其他數據庫的一個或多個表,或者其他視圖。分佈式查詢也可用於定義使用多個異類源數據的視圖。例如,如果有多臺不同的服務器分別存儲您的單位在不同地區的數據,而您需要將這些服務器上結構相似的數據組合起來,這種方式就很有用。
二、視圖類型
 在 SQL Server 2005 中,您可以創建標準視圖、索引視圖和分區視圖。
 標準視圖
        標準視圖組合了一個或多個表中的數據,您可以獲得使用視圖的大多數好處,包括將重點放在特定數據上及簡化數據操作。
 索引視圖      
       索引視圖是被具體化了的視圖,即它已經過計算並存儲。可以爲視圖創建索引,即對視圖創建一個唯一的聚集索引。索引視圖可以顯著提高某些類型查詢的性能。索引視圖尤其適於聚合許多行的查詢。但它們不太適於經常更新的基本數據集。
 分區視圖
        分區視圖在一臺或多臺服務器間水平連接一組成員表中的分區數據。這樣,數據看上去如同來自於一個表。聯接同一個 SQL Server 實例中的成員表的視圖是一個本地分區視圖。
三、使用視圖的情況
       視圖通常用來集中、簡化和自定義每個用戶對數據庫的不同認識。視圖可用作安全機制,方法是允許用戶通過視圖訪問數據,而不授予用戶直接訪問視圖基礎表的權限。視圖可用於提供向後兼容接口來模擬曾經存在但其架構已更改的表。還可以在向 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 創建一個視圖。該視圖代表這兩個地區的銷售數據
四、視圖解析
 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的子句中顯式引用索引視圖,查詢優化器即可使用該索引視圖。
五、設計和實現視圖
         1、創建標準視圖
 
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)不能使用臨時表的列。
 2、設計索引視圖的幾大要點。
           儘量在很少更新(增刪改)基礎數據表上建立索引視圖。
           涉及大量聚合或聯接的查詢
           數據量小查詢較多的數據表
 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 = OFFON [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。
 4、創建分區視圖。
  分區視圖在一臺或多臺服務器間水平連接一組成員表中的分區數據,使數據看起來就像來自一個表。
  --建立鏈接服務器
  
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
六、視圖使用示例
       1、使用視圖
              select * from Product_Name
      2、通過視圖修改數據
              update Product_Name set CateID=5 where ID=60
      3、通過視圖刪除數據
            delete from Product_Name  where ID=61
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章