溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MSSQL索引視圖怎么用

發(fā)布時間:2021-11-10 09:25:14 來源:億速云 閱讀:156 作者:小新 欄目:關系型數(shù)據(jù)庫

這篇文章將為大家詳細講解有關MSSQL索引視圖怎么用,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

1)    確保索引視圖參考的表的set options都是正確的;

2)    確保創(chuàng)建表和視圖前會話的set option是正確的;

3)    確保視圖定義是確定性的;

4)    確保要以WITH SCHEMABINDING option創(chuàng)建視圖;

5)    確保首先在視圖上創(chuàng)建唯一簇索引;

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)    創(chuàng)建索引時,IGNORE_DUP_KEY option必須被設置為OFF(默認值);

3)    視圖定義中的表名必須包含模式名,例如:schema.tablename;

4)    視圖中參考的用戶自定義函數(shù)必須以WITH SCHEMABINDING option創(chuàng)建;

5)    視圖中參考的任何用戶定義的函數(shù)名必須包含模式名,例如: schema.function;

6)    用戶定義后函數(shù)的數(shù)據(jù)存取屬性必須是NO SQL,并且,外部存取屬性必須是NO

7)    通用語言運行時Common language runtime (CLR)函數(shù)可以出現(xiàn)于視圖的select list中,但其不能是簇索引鍵列,同時,CLR函數(shù)也不能出現(xiàn)于視圖的where子句和連接操作的on子句中。

8)    視圖中CLR函數(shù)和CLR用戶自定義類型的方法必須是下列的屬性設置:

?  DETERMINISTIC = TRUE

?  PRECISE = TRUE

?  DATA ACCESS = NO SQL

?  EXTERNAL ACCESS = NO

9)    視圖必須以WITH SCHEMABINDING option創(chuàng)建;

10)  視圖必須僅參考同一個數(shù)據(jù)庫中的基表。視圖中不能參考其他視圖。

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列,但這些列不能出現(xiàn)在簇索引中;

13)  如果存在GROUP BY ,則視圖定義必須包含COUNT_BIG(*)且一定不要包含HAVING。這些GROUP BY限制僅用于視圖定義中。一個查詢可以在其計劃中使用索引視圖即使并不滿足這條GROUP BY限制;

14)  如果視圖定義包含一個GROUP BY子句,則唯一簇索引只能參考GROUP BY子句中確定的列。


好了,前面說了這么多限制和要求,讓人看了頭疼,不用想那么嚴重,很多技術都會寫諸多的要求和限制,可我們不還是能自由自在的使用嗎?別光說不練了,看看下面我們怎么創(chuàng)建和使用索引視圖吧。


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創(chuàng)建索引視圖
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  
--
在視圖上創(chuàng)建第一個唯一簇索引
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索引視圖怎么用”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI