索引视图的索引基表是否有益处?

时间:2016-11-22 14:03:59

标签: sql-server tsql indexed-view

在创建索引视图后,我尝试禁用基表中的所有索引,包括外键列的索引(约束仍然存在),并且视图的查询计划保持不变。

对我来说,即使没有索引基表,索引视图也能够如此优化查询。即使View上没有任何索引,SQL Server也能够对索引视图的主键索引进行索引扫描,以检索数据,比使用基表快1000倍。

SELECT * FROM MyView WITH(NOEXPAND) WHERE NotIndexedColumn = 5 ORDER BY NotIndexedColumn

这样的东西

所以前两个问题是:

  1. 索引视图的索引基表有什么好处吗?
  2. 当约束在非索引列上时,Sql服务器在对PK进行索引扫描时正在做什么?
  3. 然后我注意到,如果我使用全文搜索+订单,我会在查询计划中看到一个表格假脱机(急切线轴),成本为95%。

    查询看起来像SELECT ID FROM View WITH(NOEXPAND) WHERE CONTAINS(IndexedColumn, '"SomeText*"') ORDER BY IndexedColumn

    问题3:

    1. 我可以添加任何索引以摆脱该操作吗?

1 个答案:

答案 0 :(得分:1)

了解索引视图是“物化视图”并将结果存储到磁盘上非常重要。

因此,您看到的加速是您看到存储到磁盘的查询的实际结果。

回答你的问题:

  

1)索引视图的索引基表有什么好处吗?

这是情境性的。如果您的视图是扁平化数据或具有许多额外聚合列,则索引视图优于表。如果您只是使用这样的索引视图 SELECT * FROM foo WHERE createdDate > getDate()然后可能不会。

但是如果你正在做SELECT sum(price),min(id) FROM x GROUP BY id,price那么索引视图可能会更好。当然,您正在使用连接和其他高级选项进行更复杂的查询。

  

2)当约束在非索引列上时,Sql服务器在对PK进行索引扫描时正在做什么?

首先,我们需要了解如何存储聚簇索引。索引存储在B-tree中。因此,当您在聚簇索引上搜索时,SQL Server正在遍历树,找到符合条件的所有值 取决于您设置索引的方式,即覆盖与非覆盖以及非聚簇索引的方式设置将确定Pages and Extents的外观。如果不了解表结构,我无法帮助您了解扫描实际正在做什么。

  

3)我可以添加任何索引以摆脱该操作吗?

仅仅是因为某些事情占据了查询时间的95%并不会使事情变得糟糕。查询时间需要加起来达到100%,所以无论你做什么,总是会占用大部分时间。您需要检查的是IO读取以及查询本身需要多长时间。

要确定这一点,您需要了解SQL Server会缓存查询结果。考虑到这一点,您可以在第一次查询需要很长时间,但之后由于数据本身被缓存,因此会更快。这完全取决于查询的频率以及系统的设置方式。

有关indexed view

的更深入阅读