繁体   English   中英

视图上的SQL Server聚集索引

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM