您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關MSSQL索引視圖怎么用,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
1) 確保索引視圖參考的表的set options都是正確的;
2) 確保創建表和視圖前會話的set option是正確的;
3) 確保視圖定義是確定性的;
4) 確保要以WITH SCHEMABINDING option創建視圖;
5) 確保首先在視圖上創建唯一簇索引;
6) 上面提到的set options正確值如下所示:
? ANSI_NULLS ON
? ANSI_PADDING ON
? ANSI_WARNINGS* ON
? ARITHABORT ON
? CONCAT_NULL_YIELDS_NULL ON
? NUMERIC_ROUNDABORF OFF
? QUOTED_IDENTIFIER ON
1) 運行CREATE INDEX命令的用戶必須是視圖的屬主;
2) 創建索引時,IGNORE_DUP_KEY option必須被設置為OFF(默認值);
3) 視圖定義中的表名必須包含模式名,例如:schema.tablename;
4) 視圖中參考的用戶自定義函數必須以WITH SCHEMABINDING option創建;
5) 視圖中參考的任何用戶定義的函數名必須包含模式名,例如: schema.function;
6) 用戶定義后函數的數據存取屬性必須是NO SQL,并且,外部存取屬性必須是NO;
7) 通用語言運行時Common language runtime (CLR)函數可以出現于視圖的select list中,但其不能是簇索引鍵列,同時,CLR函數也不能出現于視圖的where子句和連接操作的on子句中。
8) 視圖中CLR函數和CLR用戶自定義類型的方法必須是下列的屬性設置:
? DETERMINISTIC = TRUE
? PRECISE = TRUE
? DATA ACCESS = NO SQL
? EXTERNAL ACCESS = NO
9) 視圖必須以WITH SCHEMABINDING option創建;
10) 視圖必須僅參考同一個數據庫中的基表。視圖中不能參考其他視圖。
11) 視圖定義中的select語句不能包含下述T-SQL元素:
? COUNTROWSET
? functions (OPENDATASOURCE, OPENQUERY, OPENROWSET, AND OPENXML)
? OUTER joins (LEFT, RIGHT, or FULL)
? Derived table (defined by specifying a SELECT statement in the FROM clause)
? Self-joins
? Specifying columns by using SELECT * or SELECT table_name.*
? DISTINCT
? STDEV, STDEVP, VAR, VARP, or AVG
? Common table expression (CTE)
? float*, text, ntext, image, XML, or filestream columns
? Subquery
? OVER clause, which includes ranking or aggregate window functions
? Full-text predicates (CONTAIN, FREETEXT)
? SUM function that references a nullable expression
? ORDER BY
? CLR user-defined aggregate function
? TOP
? CUBE, ROLLUP, or GROUPING SETS operators
? MIN, MAX
? UNION, EXCEPT, or INTERSECT operators
? TABLESAMPLE
? Table variables
? OUTER APPLY or CROSS APPLY
? PIVOT, UNPIVOT
? Sparse column sets
? Inline or multi-statement table-valued functions
? OFFSET
? CHECKSUM_AGG
12) 索引視圖可以包含float列,但這些列不能出現在簇索引中;
13) 如果存在GROUP BY ,則視圖定義必須包含COUNT_BIG(*)且一定不要包含HAVING。這些GROUP BY限制僅用于視圖定義中。一個查詢可以在其計劃中使用索引視圖即使并不滿足這條GROUP BY限制;
14) 如果視圖定義包含一個GROUP BY子句,則唯一簇索引只能參考GROUP BY子句中確定的列。
好了,前面說了這么多限制和要求,讓人看了頭疼,不用想那么嚴重,很多技術都會寫諸多的要求和限制,可我們不還是能自由自在的使用嗎?別光說不練了,看看下面我們怎么創建和使用索引視圖吧。
USE AdventureWorks2012;
GO
--為了支持索引視圖設置相關options
SET NUMERIC_ROUNDABORT OFF;
SET ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL,
ARITHABORT,
QUOTED_IDENTIFIER, ANSI_NULLS ON;
GO
--以with schemabinding創建索引視圖
IF OBJECT_ID ('Sales.vOrders', 'view') IS NOT NULL
DROP VIEW Sales.vOrders ;
GO
CREATE VIEW Sales.vOrders
WITH SCHEMABINDING
AS
SELECT SUM(UnitPrice*OrderQty*(1.00-UnitPriceDiscount)) AS
Revenue,
OrderDate, ProductID, COUNT_BIG(*) AS
COUNT
FROM Sales.SalesOrderDetail AS od, Sales.SalesOrderHeader AS
o
WHERE od.SalesOrderID = o.SalesOrderID
GROUP BY OrderDate, ProductID;
GO
--在視圖上創建第一個唯一簇索引
CREATE UNIQUE CLUSTERED INDEX IDX_V1
ON Sales.vOrders (OrderDate, ProductID);
GO
--該查詢能使用索引視圖即使FROM子句中并未確定該視圖
SELECT SUM(UnitPrice*OrderQty*(1.00-UnitPriceDiscount)) AS Rev,
OrderDate, ProductID
FROM Sales.SalesOrderDetail AS od
JOIN Sales.SalesOrderHeader AS o ON
od.SalesOrderID=o.SalesOrderID
AND ProductID BETWEEN 700 and 800
AND OrderDate >=
CONVERT(datetime,'05/01/2002',101)
GROUP BY OrderDate, ProductID
ORDER BY Rev DESC;
GO
--該查詢可以使用以上索引視圖
SELECT OrderDate, SUM(UnitPrice*OrderQty*(1.00-UnitPriceDiscount)) AS
Rev
FROM Sales.SalesOrderDetail AS od
JOIN Sales.SalesOrderHeader AS o ON
od.SalesOrderID=o.SalesOrderID
AND DATEPART(mm,OrderDate)= 3
AND DATEPART(yy,OrderDate) = 2002
GROUP BY OrderDate
ORDER BY OrderDate ASC;
GO
關于“MSSQL索引視圖怎么用”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。