2016-11-22 65 views
2

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

它就像魔术对我来说,索引视图将能够如此多的优化查询,即使没有被索引的基表。即使在视图上没有任何索引,SQL Server也能够对索引视图的主键索引执行索引扫描,以获取比使用基表快1000倍的数据。

喜欢的东西SELECT * FROM MyView WITH(NOEXPAND) WHERE NotIndexedColumn = 5 ORDER BY NotIndexedColumn

所以前两个问题是:

  1. 是否有索引视图索引基表什么好处?
  2. 当约束位于未索引列时,Sql服务器在对PK进行索引扫描时做了什么?

然后我注意到,如果我使用全文搜索+订单,我会在查询计划中看到一个表假脱机(热衷假脱机),成本为95%。

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

问题N°3:

  • 有没有我可以添加到摆脱任何操作指数?
  • +0

    检查阅读更深入的这样的回答:HTTP://stackoverflow.com/questions/40677421/how-is-blob-stored-in-an-indexed-view/40678073# 40678073 – TheGameiswar

    +0

    @TheGameiswar从我已阅读的索引视图只存储结果的部分子集,而不是100%重复。所以即时通讯仍然好奇,看看是否有任何好处索引原始表 – Steve

    回答

    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正在树中查找符合条件的所有值取决于您如何设置索引i。e覆盖与非覆盖以及您的非聚集索引如何设置将决定Pages and Extents的外观。没有更多关于表格结构的知识,我无法帮助你理解扫描实际上在做什么。

    3)是否有任何索引可以添加以摆脱该操作?

    仅仅因为有些事情正在考虑95%的查询时间,并不是一件坏事。查询时间需要加起来高达100%,所以无论你做什么,总会有一些东西占用大量的时间。你需要检查的是IO读取和查询本身需要多少时间。

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

    有关indexed view

    +0

    #2我没有索引旁边的唯一聚集(PK)指数。如果我记得正确,它总是覆盖。该视图是一个非常基本的SELECT ... FROM ... INNER JOIN..ON x = y INNER JOIN..ON a = b并且查询显示为有问题 – Steve