2009-06-22 73 views
2

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

我必须得到一个聚集索引,否则使用该视图的查询将永远。显然sql服务器将只存储结果集,如果你遇到了一个愚蠢的标准数量。

该视图的基表是只读的,并且每天只能通过批量导入进行更新。我看不出为什么结果不能被缓存。

有谁知道任何方式让sql server来缓存视图的结果,以便他们可以反过来查询?我真的不想创建另一个表,因为它会雪球到处都是一堆变化。

在此先感谢。

+1

请发布全部样本 – 2009-06-22 06:36:29

+4

考虑到您的表格每天只更新一次,如何每天填充表格一次,并将查询结果从雪球转换为比视图更多的更改? – 2009-06-22 06:58:15

+0

发布一个真实的例子,我确定有人会给你一个可行的解决方案。有一些选项,如计算列可以解决您的问题 – 2009-06-22 12:08:44

回答

3

我认为您正在寻找的答案是: 请勿使用视图来执行此操作。 使用一个表格,其中的字段对应于sql查询返回的字段。 自动化查询来填充此表

1

简而言之,由于您提到的原因,无法创建聚集索引。

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

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

如果您使用SSIS(SQL Server集成服务),这是一个相对微不足道的事情来添加。

+0

感谢的人,更多信息在下面的评论 – andrej351 2009-06-23 00:40:59

1

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

+0

我没有看到任何理由downvote这一点。使用问题中提供的信息,无法知道底层表是否已正确索引。 – 2009-06-22 09:39:06

1

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

如果需要,您可以在这些表格的顶部创建视图。

0

我有同样的问题,并最终将子查询放入聚集索引视图本身。

1

使用你需要使用COUNT_BIG(),而不是COUNT一个索引视图中聚集时(),否则该视图将不会被创建

此外,如果你不是企业版,您需要提供NOEXPAND提示否则优化器将不使用的视图

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

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