我有一张桌子,这些桌子会在几年内增长到数百万行。作为我的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
)
答案 0 :(得分:4)
是的,但只有Enterprise Edition会在查询编译期间考虑索引视图。要利用非EE上的索引,您需要直接从视图中选择并使用NOEXPAND hint:
NOEXPAND仅适用于索引视图。索引视图是一个视图 在其上创建唯一的聚簇索引。如果查询包含引用 到索引视图和基表中都存在的列, 并且查询优化器确定使用索引视图 提供查询优化器执行查询的最佳方法 使用视图上的索引。此函数称为索引视图 匹配。 查询优化器自动使用索引视图 仅在特定版本的SQL Server 中受支持。
请注意,像这样的索引视图会创建写入争用,因为任何更新都会锁定整个SomeName
范围:一次只有一个事务能够使用{{插入,删除或更新任何行1}}。
答案 1 :(得分:1)
是的,该索引视图肯定会提高该特定查询的性能(假设Enterprise Edition - Remus解释了如果您不在Enterprise上使用它)。
但是,它不是“免费” - 需要为dbo.Txxx
的所有DML操作维护索引,占用空间(虽然相比之下远远小于基表),并且将是受影响正常表的问题 - 例如碎片和(在这种情况下可能在较小程度上)页面拆分。