如何在sql 2005中使用select distinct语句创建索引视图

Kam*_*mal 4 sql-server-2005

我的名为"Ge_Entry"的视图运行速度非常慢,因此想要使用select distinct语句创建索引视图,但sql server不允许它.

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

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

感谢名单

尼尔

Dam*_*ver 20

你不能使用distinct.但是你可以用COUNT_BIG(*)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
Run Code Online (Sandbox Code Playgroud)

代替 DISTINCT ColumnA,ColumnB


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

ID        ColumnA        ColumnB
1         abc            def
2         abc            def
3         ghi            jkl
Run Code Online (Sandbox Code Playgroud)

而且你允许纯粹基于不同的方式创建你的视图.现在,您ID 2从表中删除行.SQL Server应该abc,def从视图的索引中删除该行吗?它只能通过再次扫描整个基表来找出.

将其与我上面的视图定义进行对比.以下是视图数据的样子:

ColumnA      ColumnB        Cnt
abc          def            2
abc          def            1
Run Code Online (Sandbox Code Playgroud)

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