2012-09-14 41 views
2

我的视图命名为“Ge_Entry”运行速度非常慢,因此希望使用select distinct语句创建索引视图,但sql server不允许它。如何使用sql 2005中的select distinct语句创建索引视图

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

因此,我可以在此视图上创建索引以获得快速结果。

感谢名单

尼尔

+0

不,你不能使用DISTINCT。是否有一些列或列的组合可以应用某些条件来产生您感兴趣的行? –

回答

16

您不能使用不同。但是你可以使用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行abc,def。如果该列的新值是0,它知道它应该从索引中删除该行。相反,如果值为>0,那么它知道基表中仍存在此值的行。

+0

达米恩,很多thanx您的广泛答复,我明白,索引视图不支持选择不同的声明,实际上查看“Ge_Entry”包含很多意见。所以我要求创建索引视图 – Kamal

+0

@Kamal - 是我的解决方案(而不是使用'DISTINCT',在所有列上使用'GROUP BY')适合您,还是有问题? (不知道你的评论) –