5

我的名为“Ge_Entry”的视图运行速度非常慢,所以想用 select distinct 语句创建索引视图,但 sql server 不允许它。

所以我想知道有没有办法用 s.dist 语句创建 i.view 。

这样我就可以在此视图上创建索引以获得快速结果。

谢谢

尼尔

4

1 回答 1

21

你不能使用不同的。但是您可以使用COUNT_BIG(*)and GROUP BY,可能:

CREATE VIEW v1
WITH SCHEMABINDING
AS
    SELECT ColumnA,ColumnB,COUNT_BIG(*) as Cnt
    FROM BaseTable
    GROUP BY ColumnA,ColumnB
GO
CREATE UNIQUE CLUSTERED INDEX IX_v1 ON v1 (ColumnA,ColumnB)
GO

代替DISTINCT ColumnA,ColumnB


大多数创建索引视图的规则似乎都与维护索引的效率有关。假设您有一个包含以下内容的基表:

ID        ColumnA        ColumnB
1         abc            def
2         abc            def
3         ghi            jkl

并且您允许纯粹基于 distinct 创建您的视图。ID 2现在,您从表中删除行。SQL Server 是否应该abc,def从视图的索引中删除该行?它只能通过再次扫描整个基表才能找到。

将此与我上面的视图定义进行对比。视图数据如下所示:

ColumnA      ColumnB        Cnt
abc          def            2
abc          def            1

如果ID 2从基表中删除行,SQL Server 可以从行的Cnt列中减去 1 abc,def。如果该列的新值为0,则它知道应该从索引中删除该行。相反,如果值为>0,则它知道在基表中仍有该值的行。

于 2012-09-14T06:48:51.250 回答