索引基本表的索引视图是否有好处



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

对我来说,索引视图也能够优化查询,即使没有基本表被索引也是如此。即使在视图上没有任何索引,SQL Server也能够在索引视图的主键索引上进行索引扫描,以比使用基础表更快地检索数据的速度约为1000倍。

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

之类的东西

所以前两个问题是:

  1. 索引索引视图的基本表是否有任何好处?
  2. 当约束在未索引列上进行索引扫描时,SQL Server在执行索引扫描时会做什么?

然后,我注意到,如果我使用全文搜索 订单,我会在查询计划中看到一个桌子启动(急切的启动),费用大约为95%。

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

问题n°3:

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

重要的是要了解索引视图是"实体视图",结果存储在磁盘上。

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

回答您的问题:

1)索引视图的索引基础表是否有任何好处?

这是情境。如果您的视图正在变平数据或拥有许多额外的聚合列,则索引视图比表更好。如果您只是使用索引视图 SELECT * FROM foo WHERE createdDate > getDate()可能不是。

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

2)当约束在未索引列上时,SQL Server在PK上进行索引扫描时在做什么?

首先,我们需要了解如何存储聚类索引。该索引存储在B树中。因此,SQL Server正在走树,查找所有与您的条件访问时搜索群集索引时的值,这取决于您如何设置索引的方式,即覆盖非覆盖物以及非群集索引的方式设置将确定页面和范围的外观。没有更多了解表结构的知识,我无法帮助您理解扫描实际在做什么。

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

仅仅是因为某些东西需要询问时间的95%,这并不是一件坏事。查询时间需要总计100%,因此,无论您做什么,总会占用很大比例的时间。您需要检查的是IO读取以及查询本身需要多少时间。

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

有关索引视图的更深入阅读

最新更新