索引视图以提高 SQL Server 上多个连接的性能
Posted
技术标签:
【中文标题】索引视图以提高 SQL Server 上多个连接的性能【英文标题】:Indexed view to improve performance of multiple joins on SQL Server 【发布时间】:2013-02-04 14:46:42 【问题描述】:我有一个对许多表执行联接的查询,导致性能不佳。
为了提高性能,我创建了一个索引视图,我发现使用日期过滤器的视图查询性能有了显着提高。但是,我担心的是索引的存储。根据我的阅读,唯一聚集索引存储在 SQL Server 上。这是否意味着它将作为视图中连接的一部分产生的整个数据单独存储?如果是这样,如果我在视图中包含了属于连接一部分的表中的所有列,那么服务器上消耗的磁盘空间是否会是没有索引视图的磁盘空间的两倍?而且每次我在基础表中输入数据时,索引视图的数据都会重复?
【问题讨论】:
【参考方案1】:没错。索引视图基本上是一个附加表,其中包含按排序方式的所有数据的副本。这就是它如此快速的原因,但随着 SQL Server 中的所有内容落地,它是有代价的 - 在这种情况下,需要额外的存储空间以及保持所有数据副本同步所需的额外时间。
对于表上的普通索引也是如此。它也是索引键的副本(以及在何处查找原始行的一些信息),需要额外的存储空间和额外的时间来维护更新。
要确定在表或视图上添加索引是否有意义,需要查看整个系统,看看一个查询的性能改进是否值得其他查询的性能下降。
在您的情况下,您还应该(首先)检查基础表上的其他索引是否可能有助于您的查询。
【讨论】:
【参考方案2】:差不多,是的。您已经做出了权衡,即获得更好的性能以换取引擎的一些额外努力,以及持久化它所需的额外存储空间。
【讨论】:
【参考方案3】:是的,没错。索引视图将视图中的所有数据与源表分开保存。根据列和连接,数据是重复的,实际上可能比源表大很多倍。
【讨论】:
以上是关于索引视图以提高 SQL Server 上多个连接的性能的主要内容,如果未能解决你的问题,请参考以下文章