我的视图命名为“Ge_Entry”运行速度非常慢,因此希望使用select distinct语句创建索引视图,但sql server不允许它。如何使用sql 2005中的select distinct语句创建索引视图
所以我想知道有没有什么办法用s.dist语句创建i.view。
因此,我可以在此视图上创建索引以获得快速结果。
感谢名单
尼尔
我的视图命名为“Ge_Entry”运行速度非常慢,因此希望使用select distinct语句创建索引视图,但sql server不允许它。如何使用sql 2005中的select distinct语句创建索引视图
所以我想知道有没有什么办法用s.dist语句创建i.view。
因此,我可以在此视图上创建索引以获得快速结果。
感谢名单
尼尔
您不能使用不同。但是你可以使用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
,那么它知道基表中仍存在此值的行。
达米恩,很多thanx您的广泛答复,我明白,索引视图不支持选择不同的声明,实际上查看“Ge_Entry”包含很多意见。所以我要求创建索引视图 – Kamal
@Kamal - 是我的解决方案(而不是使用'DISTINCT',在所有列上使用'GROUP BY')适合您,还是有问题? (不知道你的评论) –
不,你不能使用DISTINCT。是否有一些列或列的组合可以应用某些条件来产生您感兴趣的行? –