视图上的 SQL Server 聚集索引

问题描述 投票:0回答:6

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

我必须在其上获取聚集索引,否则使用该视图的查询将永远持续下去。显然,如果满足特定条件,SQL Server 才会存储结果集。

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

有谁知道有什么方法可以让 SQL Server 缓存视图的结果,以便以后可以依次查询吗?我真的不想创建另一个表,因为这会像滚雪球一样导致到处都是变化。

提前致谢。

sql sql-server t-sql view clustered-index
6个回答
3
投票

我认为您正在寻找的答案是:

  • 不要使用视图来执行此操作。
  • 使用一个表,其中的字段与 SQL 查询返回的字段相对应。
  • 自动查询以填充此表

1
投票

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

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

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

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


1
投票

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


1
投票

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

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


1
投票

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

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

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

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.