2

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

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

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

有谁知道让 sql server 缓存视图结果的任何方法,以便以后可以查询它们?我真的不想创建另一个表格,因为它会像滚雪球一样在整个地方变成一堆变化。

提前致谢。

4

6 回答 6

3

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

于 2009-06-22T08:21:20.117 回答
1

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

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

如果自动化是一个问题,您应该考虑创建视图,但仅将其用作插入表的一种方式,以便您可以在批量插入后立即对表执行截断/插入(从视图中选择)。

如果您使用 SSIS(SQL Server 集成服务),这是一个相对简单的添加。

于 2009-06-22T07:47:12.057 回答
1

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

于 2009-06-22T08:13:21.053 回答
1

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

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

于 2009-06-22T08:18:58.997 回答
1

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

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

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

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

于 2009-06-22T13:13:00.387 回答
0

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

于 2009-06-22T08:23:20.893 回答