创建索引视图后,我尝试禁用基表中的所有索引,包括外键列的索引(约束仍然存在),视图的查询计划保持不变。
对我来说,即使没有索引基表,索引视图也能够对查询进行如此多的优化,这就像魔术一样。即使在视图上没有任何索引,Server也能够对索引视图的主键索引进行索引扫描,以比使用基表快1000倍。
有点像SELECT * FROM MyView WITH(NOEXPAND) WHERE NotIndexedColumn = 5 ORDER BY NotIndexedColumn
所以前两个问题是:
然后我注意到,如果我使用全文搜索+ order by,我会在查询计划中看到一个表假脱机(急切的假脱机),成本约为95%。
查询看起来像SELECT ID FROM View WITH(NOEXPAND) WHERE CONTAINS(IndexedColumn, '"SomeText*"') ORDER BY IndexedColumn
问题编号3:
发布于 2016-11-22 14:22:45
理解索引视图是“物化视图”并将结果存储到磁盘上是很重要的。
因此,您看到的加速比是存储在磁盘上的查询的实际结果。
回答你的问题:
1)索引视图的索引基表是否有任何好处?
这是情境性的。如果您的视图正在平放数据或有许多额外的聚合列,则索引视图比表更好。如果您只是像这样使用索引视图( SELECT * FROM foo WHERE createdDate > getDate() ),那么可能不会。
但是,如果您正在执行SELECT sum(price),min(id) FROM x GROUP BY id,price,那么索引视图可能会更好。当然,您正在使用联接和其他高级选项执行更复杂的查询。
2)当Sql server在PK上执行索引扫描时,当约束位于非索引列上时,它在做什么?
首先,我们需要了解聚集索引是如何存储的。索引存储在B-树中。因此,Server正在遍历树,在搜索聚集索引时,查找与标准匹配的所有值,这取决于如何设置索引,即覆盖vs非覆盖,以及如何设置非聚集索引将决定页和区的外观。如果没有更多关于表格结构的知识,我就无法帮助您理解扫描实际上在做什么。
(3)我可以添加什么索引来摆脱那个操作吗?
仅仅因为某件事情花费了95%的查询时间,这并不意味着这是一件坏事。查询时间需要加到100%,所以无论您做什么,总有一些东西占用了很大的时间。您需要检查的是IO读取和查询本身所需的时间。
要确定这一点,您需要了解Server缓存查询的结果。考虑到这一点,第一次查询可能需要很长时间,但是之后,由于数据本身是缓存的,它会更快。这都取决于查询的频率和系统的设置方式。
有关索引视图的更深入阅读
https://stackoverflow.com/questions/40743931
复制相似问题