1

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

我想要快速的 Sql:

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

或者

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
)
4

2 回答 2

4

可以,但只有企业版会在查询编译期间考虑索引视图。要利用非 EE 上的索引,您需要直接从视图中选择并使用NOEXPAND 提示

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

请注意,像这样的索引视图会产生写争用,因为任何更新都会锁定整个SomeName范围:一次只有一个事务能够插入、删除或更新任何带有SomeName = 'ZZZZ'.

于 2012-09-26T22:12:57.097 回答
1

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

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

于 2012-09-26T22:10:52.227 回答