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