我正在尝试从相当复杂的选择查询中创建一个视图,但它不允许我在其上放置聚集索引,因为我必须使用子查询和一些聚合函数。
我必须在其上获取聚集索引,否则使用该视图的查询将永远持续下去。显然,如果满足特定条件,SQL Server 才会存储结果集。
视图的基表是只读的,并且每天只能通过批量导入进行更新。我不明白为什么结果不能被缓存。
有谁知道有什么方法可以让 SQL Server 缓存视图的结果,以便以后可以依次查询吗?我真的不想创建另一个表,因为这会像滚雪球一样导致到处都是变化。
提前致谢。
我认为您正在寻找的答案是:
简短的回答是,由于您提到的原因,无法创建聚集索引。
当您寻求一种方法来缓存复杂查询的结果时,SQL Server 提供的唯一其他对象(并将解决您的问题)是表。
如果自动化是一个问题,您应该考虑创建视图,但仅将其用作插入表的方式,以便您可以在批量插入后立即对表进行截断/插入(从视图中选择) .
如果您使用 SSIS(SQL Server 集成服务),这是一个相对简单的添加事项。
据我所知,在编译执行计划时,SQL Server 本质上是将视图的定义复制并粘贴到其编译的查询中 - 只要您能够向基础表添加索引,就应该可以得到很好的结果查询的性能。
您正在构建的听起来像一个数据仓库,因此您最好的选择是在数据进入系统后对其进行操作。您可以构建新的非规范化表(或者您正在修改它的其他方式)并为它们建立索引以允许快速查询。
如果需要,您可以在这些表之上构建视图。
在索引视图中使用聚合时,您需要使用 COUNT_BIG() 而不是 COUNT(),否则将不会创建视图
此外,如果您不是企业版,则需要提供 NOEXPAND 提示,否则优化器将不会使用该视图
SELECT *
FROM YourView WITH(NOEXPAND)
WHERE ....
也许你不需要视图,但你只是在表上没有正确的索引,你可以发布表的DDL(包括索引和约束)
我遇到了同样的问题,最终将子查询本身放入聚集索引视图中。