我有一个对许多表执行联接的查询,这导致性能不佳。
为了提高性能,我创建了一个索引视图,并且我看到使用日期过滤器的视图查询性能有了显着提高。但是,我担心的是索引的存储。根据我的阅读,唯一聚集索引存储在 SQL Server 上。这是否意味着它将作为视图中连接的一部分产生的整个数据单独存储?如果是这样,如果我在视图中包含了属于连接一部分的表中的所有列,那么在没有索引视图的情况下,服务器上消耗的磁盘空间是否会大约是磁盘空间的两倍?每次我将数据输入基础表时,索引视图的数据都会重复吗?
我有一个对许多表执行联接的查询,这导致性能不佳。
为了提高性能,我创建了一个索引视图,并且我看到使用日期过滤器的视图查询性能有了显着提高。但是,我担心的是索引的存储。根据我的阅读,唯一聚集索引存储在 SQL Server 上。这是否意味着它将作为视图中连接的一部分产生的整个数据单独存储?如果是这样,如果我在视图中包含了属于连接一部分的表中的所有列,那么在没有索引视图的情况下,服务器上消耗的磁盘空间是否会大约是磁盘空间的两倍?每次我将数据输入基础表时,索引视图的数据都会重复吗?
那是对的。索引视图基本上是一个附加表,其中包含按排序方式的所有数据的副本。这就是它如此快速的原因,但随着 SQL Server 中的所有内容落地,它是有代价的——在这种情况下,需要额外的存储空间以及保持所有数据副本同步所需的额外时间。
对于表上的普通索引也是如此。它也是索引键的副本(加上在哪里可以找到原始行的一些信息),需要额外的存储空间和额外的时间来维护更新。
要确定在表或视图上添加索引是否有意义,需要查看整个系统,看看一个查询的性能改进是否值得其他查询的性能下降。
在您的情况下,您还应该(首先)检查基础表上的其他索引是否可能有助于您的查询。
对,那是正确的。索引视图将视图中的所有数据与源表分开保存。根据列和连接,数据是重复的,实际上可能比源表大很多倍。
差不多,是的。您已经做出了权衡,即获得更好的性能以换取引擎的一些额外努力,以及持久化它所需的额外存储空间。