我的名为“Ge_Entry”的视图运行速度非常慢,所以想用 select distinct 语句创建索引视图,但 sql server 不允许它。
所以我想知道有没有办法用 s.dist 语句创建 i.view 。
这样我就可以在此视图上创建索引以获得快速结果。
谢谢
尼尔
我的名为“Ge_Entry”的视图运行速度非常慢,所以想用 select distinct 语句创建索引视图,但 sql server 不允许它。
所以我想知道有没有办法用 s.dist 语句创建 i.view 。
这样我就可以在此视图上创建索引以获得快速结果。
谢谢
尼尔
你不能使用不同的。但是您可以使用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
,则它知道在基表中仍有该值的行。