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