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

时间:2012-09-14 06:39:40

标签: sql-server-2005

我的观点名为" Ge_Entry"运行非常慢,所以想要使用select distinct语句创建索引视图,但sql server不允许它。

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

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

感谢名单

尼尔

1 个答案:

答案 0 :(得分:18)

你不能使用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

而不是DISTINCT ColumnA,ColumnB


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

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

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

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

ColumnA      ColumnB        Cnt
abc          def            2
abc          def            1

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