小弟在维护一个系统,用的是sql数据库,但最后报表做的时候用的全部都是视图,现在很慢,所以这些视图建索引。但是看书上说,要为试图建立索引只有在建视图的时候用了 with schemabinding语句才能为视图建立索引。但现在这些视图应该是没有用该语句,请各位高手献计看还有什么办法能够建立视图索引,还有能够提高数据库的运行效率。
...全文
79312打赏收藏
怎样为sql server2000创建视图索引
小弟在维护一个系统,用的是sql数据库,但最后报表做的时候用的全部都是视图,现在很慢,所以这些视图建索引。但是看书上说,要为试图建立索引只有在建视图的时候用了 with schemabinding语句才能为视图建立索引。但现在这些视图应该是没有用该语句,请各位高手献计看还有什么办法能够建立视图索引,还有能够提高数据库的运行效率。
CREATE VIEW vw_CustomerNamesInWA AS
SELECT CustomerID, CompanyName
FROM Northwind.dbo.Customers
WHERE Region = 'WA'
可创建更通用的版本 vw_CustomerNamesInRegion,方法是将 WHERE Region = 'WA' 替换为 WHERE Region = @RegionParameter 并让用户指定感兴趣的查看区域。然而,视图不支持在 WHERE 子句中指定的搜索条件的参数。
内嵌用户定义函数可用于支持在 WHERE 子句中指定的搜索条件的参数。下面是使用户得以在其选择中指定区域的函数示例:
CREATE FUNCTION fn_CustomerNamesInRegion
( @RegionParameter nvarchar(30) )
RETURNS table
AS
RETURN (
SELECT CustomerID, CompanyName
FROM Northwind.dbo.Customers
WHERE Region = @RegionParameter
)
GO
-- Example of calling the function for a specific region
SELECT *
FROM fn_CustomerNamesInRegion(N'WA')
GO
创建筛选汇总数据的内嵌函数:
CREATE FUNCTION fn_QuarterlySalesByStore
(
@StoreID int
)
RETURNS table
AS
RETURN (
SELECT *
FROM SalesDB.dbo.vw_QuarterlySales
WHERE StoreID = @StoreID
)
然后用户可从内嵌函数进行选择以获得其特定商店的数据:
SELECT *
FROM fn_QuarterlySalesByStore( 14432 )
--Set the options to support indexed views.
SET NUMERIC_ROUNDABORT OFF
GO
SET ANSI_PADDING,ANSI_WARNINGS,CONCAT_NULL_YIELDS_NULL,ARITHABORT,QUOTED_IDENTIFIER,ANSI_NULLS ON
GO
--Create view.
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
--Create index on the view.
CREATE UNIQUE CLUSTERED INDEX IV1 ON V1 (OrderDate, ProductID)
GO
--This query will use the above indexed view.
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
--This query will use the above indexed view.
SELECT OrderDate, SUM(UnitPrice*Quantity*(1.00-Discount)) AS Rev
FROM dbo.[Order Details] od, dbo.Orders o
WHERE od.OrderID=o.OrderID AND DATEPART(mm,OrderDate)= 3
AND DATEPART(yy,OrderDate) = 1998
GROUP BY OrderDate
ORDER BY OrderDate ASC