[英]sql server clustered index on a view
我试图从一个非常复杂的选择查询中创建一个视图,它不会让我在上面放一个聚簇索引,因为我必须使用子查询和一些聚合函数。
我必须在上面获得聚簇索引,否则使用该视图的查询将永远花费。 显然,如果您满足愚蠢的条件,sql server将仅存储结果集。
该视图的基本表是只读的,并且每天仅通过一次批量导入进行更新。 我看不到为什么无法缓存结果。
有谁知道以任何方式使sql server缓存视图结果,以便以后可以查询? 我真的不想创建另一个表cos,该表cosball会在整个地方滚雪球般变成一堆变化。
提前致谢。
我认为您正在寻找的答案是:不要使用视图来执行此操作。 使用具有与sql查询返回的字段相对应的字段的表。 自动查询以填充此表
简短的答案是,由于您提到的原因,无法创建聚集索引。
当您请求一种方法来缓存复杂查询的结果时,SQL Server提供的唯一另一个对象(将解决您的问题)是一个表。
如果自动化存在问题,则应考虑创建视图,但仅应将其用作插入表的方式,以便您可以在批量插入后立即将表截断/插入表中(从视图中选择)。
如果使用SSIS(SQL Server集成服务),这是一件相对琐碎的事情。
据我所知,在编译执行计划时,SQL Server本质上会将视图的定义复制并粘贴到其编译查询中-只要您能够向基础表中添加索引,就应该可以获得良好的性能。从查询中。
您所构建的内容听起来像是数据仓库,因此,最好的选择是一旦将数据放入系统中就对其进行操作。 您可以构建新的非规范化表(或进行其他修改),并对它们建立索引以允许快速查询。
然后,您可以根据需要在这些表的顶部构建视图。
在索引视图中使用聚合时,您需要使用COUNT_BIG()而不是COUNT(),否则将不会创建该视图
另外,如果您不在企业版上,则需要提供NOEXPAND提示,否则优化器将不会使用该视图
SELECT *
FROM YourView WITH(NOEXPAND)
WHERE ....
也许您不需要视图,但是在表上没有正确的索引,是否可以发布表的DDL(包括索引和约束)
我遇到了同样的问题,最终将子查询本身放在了聚集索引视图中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.