一个视图上的sql server聚集索引

时间:2009-06-22 06:29:28

标签: sql sql-server tsql view clustered-index

我试图用相当复杂的选择查询创建一个视图,它不会让我在其上放置聚簇索引,因为我必须使用子查询和一些聚合函数。

我必须在其上获得聚簇索引,否则使用该视图的查询将永远占用。显然,如果你遇到一个愚蠢的标准,sql server只会存储结果集。

视图的基表是只读的,并且每天只能通过批量导入更新一次。我不明白为什么结果无法缓存。

有没有人知道如何让sql server缓存视图的结果,以便以后可以查询?我真的不想创建另一个表格cos,它会在整个地方滚雪球变成一堆变化。

提前致谢。

6 个答案:

答案 0 :(得分:3)

我认为您正在寻找的答案是: 不要使用视图来执行此操作。 使用包含与sql查询返回的字段相对应的字段的表。 自动化查询以填充此表

答案 1 :(得分:1)

简短的回答是,由于您提到的原因,无法创建聚簇索引。

当您要求一种方法来缓存复杂查询的结果时,SQL Server提供的唯一其他对象(并将解决您的问题)是一个表。

如果自动化是个问题,您应该考虑创建视图,但只能将其用作插入表格的方式,这样您就可以在表格之后立即截断/插入表格(从视图中选择)。批量插入。

如果使用SSIS(SQL Server Integration Services),这是一个相对简单的事情。

答案 2 :(得分:1)

据我所知,在编译执行计划时,SQL Server实质上将视图的定义复制并粘贴到其编译的查询中 - 只要您能够将索引添加到基础表中,就应该可以从查询中获得良好的表现。

答案 3 :(得分:1)

您正在构建的内容听起来像数据仓库,因此您最好的选择是在数据进入系统后对其进行操作。您可以构建非规范化的新表(或者您正在修改它),并将它们编入索引以允许快速查询。

如果需要,您可以在这些表格之上构建视图。

答案 4 :(得分:1)

在索引视图中使用聚合时,您需要使用COUNT_BIG()而不是COUNT(),否则将不会创建视图

此外,如果您不在Enterprise Edition上,则需要提供NOEXPAND提示,否则优化器将不会使用该视图

SELECT *
FROM YourView WITH(NOEXPAND)
WHERE ....

也许你不需要一个视图,但你只是在表上没有正确的索引,你可以发布表的DDL(包括索引和约束)

答案 5 :(得分:0)

我遇到了同样的问题,并最终将子查询放在聚集索引视图中。

相关问题