使用索引视图是否会提高SELECT COUNT查询的性能?

时间:2012-09-26 22:07:20

标签: sql-server performance sql-server-2008 indexed-view

我有一张桌子,这些桌子会在几年内增长到数百万行。作为我的Web应用程序的一部分,每当用户访问特定页面时,我都必须在该表的子集上查询计数。戴着建筑师帽子的人说他们对此有性能问题。假设它们是正确的,那么添加索引视图会解决这个问题吗?

我希望快速的SQL:

SELECT COUNT(*) FROM [dbo].[Txxx] WHERE SomeName = 'ZZZZ'

OR

SELECT COUNT_BIG(*) FROM [dbo].[Txxx] WHERE SomeName = 'ZZZZ'

表:

CREATE TABLE [dbo].[Txxx](
    [Id] [uniqueidentifier] ROWGUIDCOL  NOT NULL,
    [SomeName] [nvarchar](50) NOT NULL,
    [SomeGuid] [uniqueidentifier] NOT NULL
 CONSTRAINT [PK_Txxx] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)

查看:

CREATE view dbo.Vxxx
WITH SCHEMABINDING
AS
SELECT     SomeName, COUNT_BIG(*) AS UsedCount
FROM         dbo.Txxx
GROUP BY SomeName

指数:

CREATE UNIQUE CLUSTERED INDEX [IV_COUNT] ON [dbo].[Vxxx] 
(
    [SomeName] ASC
)

2 个答案:

答案 0 :(得分:4)

是的,但只有Enterprise Edition会在查询编译期间考虑索引视图。要利用非EE上的索引,您需要直接从视图中选择并使用NOEXPAND hint

  

NOEXPAND仅适用于索引视图。索引视图是一个视图   在其上创建唯一的聚簇索引。如果查询包含引用   到索引视图和基表中都存在的列,   并且查询优化器确定使用索引视图   提供查询优化器执行查询的最佳方法   使用视图上的索引。此函数称为索引视图   匹配。 查询优化器自动使用索引视图   仅在特定版本的SQL Server 中受支持。

请注意,像这样的索引视图会创建写入争用,因为任何更新都会锁定整个SomeName范围:一次只有一个事务能够使用{{插入,删除或更新任何行1}}。

答案 1 :(得分:1)

是的,该索引视图肯定会提高该特定查询的性能(假设Enterprise Edition - Remus解释了如果您不在Enterprise上使用它)。

但是,它不是“免费” - 需要为dbo.Txxx的所有DML操作维护索引,占用空间(虽然相比之下远远小于基表),并且将是受影响正常表的问题 - 例如碎片和(在这种情况下可能在较小程度上)页面拆分。