我想检查索引视图的查询性能。
我创建了一个基于数据库中所有列的Product
表的视图。Northwind
创建视图后,我在视图上添加了一个聚集索引(因为我无法在没有 int 的情况下创建非聚集索引)。
现在,在添加非聚集索引之前,我会检查此查询执行计划和统计信息:
SELECT [ProductName]
,[QuantityPerUnit]
,[UnitPrice]
,[UnitsInStock]
,[UnitsOnOrder]
,[ReorderLevel]
,[Discontinued]
FROM [Northwind].[dbo].[test_IndexedView]
WHERE UnitPrice = 21.35
然后我创建一个索引:
CREATE NONCLUSTERED INDEX [idx_Unitp] ON [dbo].[test_IndexedView]
(
[UnitPrice] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
我再次执行该查询,但没有任何变化。不在执行计划中,不在统计中。
问题出在哪里?如何使用索引视图提高性能?
编辑 1) 我创建一个视图:
CREATE VIEW [dbo].[indexView]
WITH SCHEMABINDING
AS
SELECT ProductName, SupplierID, CategoryID, QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, Discontinued, ReorderLevel
FROM dbo.Products
GO
然后当我想在它上面创建一个“非聚集索引”时,就像这样:
CREATE NONCLUSTERED INDEX [idx_Unitp] ON [dbo].[IndexView]
(
[UnitPrice] ASC
)
我收到此错误:
消息 1940,级别 16,状态 1,第 1 行
无法在视图“dbo.IndexView”上创建索引。它没有唯一的聚集索引。
所以我被迫创建了一个聚集索引。
索引前后的执行计划都是Index Scan
结果SELECT @@VERSION
是:
Microsoft SQL Server 2008 (SP2) - 10.0.4000.0 (Intel X86)
Sep 16 2010 20:09:22 版权所有 (c) 1988-2008 Microsoft Corporation
Enterprise Edition on Windows NT 6.1 (Build 7600: )