在一個視建立獨特的簇索引可以有效地增加視的性能,因為此時視變?yōu)榭梢源鎯υ跀?shù)據(jù)庫中,這正和表存儲的方式相似。
一個標(biāo)準(zhǔn)的視一旦被動態(tài)地建立,就可能有很多的視操作。使用一個索引的視,操作結(jié)果可以保存,而且,假如數(shù)據(jù)存儲發(fā)生丟失,你還可以在性能保護(hù)中找回。
在一個視上建立第一個索引必須是唯一的索引號。除此之外,索引也從屬于表。這些表和視以及索引本身一樣,必須在同一數(shù)據(jù)庫中建立。
低于SQL Server 2000版本的數(shù)據(jù)庫只能建立表的索引。然而SQL Server 2000可以在視上建立索引。SQL Server 2000通過存儲計算查詢結(jié)果,一旦視的數(shù)據(jù)改變,索引也隨之改變這樣的方式來實現(xiàn)的。
視有其他的限制,包括的內(nèi)容如下:
在索引視的SELECT中不能包含有其他的視,行設(shè)置函數(shù),嵌套函數(shù)等。同樣,在索引視的SELECT中不能包含有要害詞TOP, DISTINCT, COMPUTE, HAVING, 和/或 UNION。SELECT聲明也不能包含有子查詢。
SELECT表不能包含有星號(*)或其他的通配符,也不能包含有DISTINCT, COUNT(*), COUNT(<eXPression>),以及表的計算列數(shù)等。
在任何連接的表中不能包含OUTER JOIN操作。
在查找過程中不能包含子查詢或CONTAINS或 FREETEXT操作。
假如視定義包含一個GROUP BY語句,所有的分組列必須出現(xiàn)在視的SELECT表中。這些列也只能是CREATE UNIQUE CLUSTERED INDEX語句中的列。
除此之外,為了使用索引的視你必須進(jìn)行一些必要的系統(tǒng)設(shè)置。
NUMERIC_ROUNDABORT設(shè)置為ON。這能夠使視圓整列或存儲變量的精確結(jié)果。
ANSI_PADDING控制列存儲的方式。
ANSI_WARNINGS指定不同錯誤情況下的SQL-92標(biāo)準(zhǔn)行為。
CONCAT_NULL_YIELDS_NULL決定連接結(jié)果是處理為null還是空的字符串。
ARITHABORT在查詢過程中出現(xiàn)溢出或被零整除的錯誤的時候終止查詢。
QUOTED_IDENTIFIER能夠使SQL Server遵循有關(guān)引用符號標(biāo)識符和文字字符串的SQL-92規(guī)則。
以下的范例將建立一個視,然后對視建立索引,最后使用這個索引的視進(jìn)行查詢。首先,調(diào)整系統(tǒng)設(shè)置以滿足索引視能夠工作。
USE Northwind
GO
SET NUMERIC_ROUNDABORT OFF
GO
SET
ANSI_PADDING,ANSI_WARNINGS,CONCAT_NULL_YIELDS_NULL,
ARITHABORT,QUOTED_IDENTIFIER,ANSI_NULLS ON
GO
然后,我們建立一個名為V1的視,這一視可以生成columns Revenue, OrderDate, 和PRodUCtID.
CREATE VIEW V1
WITH SCHEMABINDING
AS
SELECT SUM(UnitPrice*Quantity*(1.00-Discount)) AS Revenue,
OrderDate, ProductID, COUNT_BIG(*) AS COUNT
FROM dbo.[Order Details] od, dbo.Orders o
WHERE od.OrderID=o.OrderID
GROUP BY OrderDate, ProductID
GO
接著,我們建立V1的唯一簇索引。
CREATE UNIQUE CLUSTERED INDEX IV1 ON V1 (OrderDate, ProductID)
GO
最后,我們建立一個能夠使用索引視而不是動態(tài)視的查詢。
SELECT SUM(UnitPrice*Quantity*(1.00-Discount)) AS Rev, OrderDate,
ProductID
FROM dbo.[Order Details] od, dbo.Orders o
WHERE od.OrderID=o.OrderID AND ProductID in
(2, 4, 25, 13, 7, 89, 22, 34)
AND OrderDate >= '05/01/1998'
GROUP BY OrderDate, ProductID
ORDER BY Rev DESC
你可以看到,索引視并不是很輕易操作,但是它卻可以給你帶來更多的好處。