我的名为"Ge_Entry"的视图运行速度非常慢,因此想要使用select distinct语句创建索引视图,但sql server不允许它.
所以我想知道有没有办法用s.dist语句创建i.view.
这样我就可以在这个视图上创建索引以获得快速结果.
感谢名单
尼尔
Dam*_*ver 20
你不能使用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
Run Code Online (Sandbox Code Playgroud)
代替 DISTINCT ColumnA,ColumnB
创建索引视图的大多数规则似乎与维护索引的效率有关.想象一下,您有一个包含以下内容的基表:
ID ColumnA ColumnB
1 abc def
2 abc def
3 ghi jkl
Run Code Online (Sandbox Code Playgroud)
而且你被允许纯粹基于不同的方式创建你的视图.现在,您ID 2从表中删除行.SQL Server应该abc,def从视图的索引中删除该行吗?它只能通过再次扫描整个基表来找出.
将其与我上面的视图定义进行对比.以下是视图数据的样子:
ColumnA ColumnB Cnt
abc def 2
abc def 1
Run Code Online (Sandbox Code Playgroud)
如果ID 2从基表中删除行,则SQL Server可以从该Cnt列的列中减去1 abc,def.如果该列的新值是0,它知道它应该从索引中删除该行.相反,如果值为>0,则它知道基表中仍有该行的值.