首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >索引视图的索引基表有好处吗?

索引视图的索引基表有好处吗?
EN

Stack Overflow用户
提问于 2016-11-22 14:03:58
回答 1查看 567关注 0票数 2

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

对我来说,即使没有索引基表,索引视图也能够对查询进行如此多的优化,这就像魔术一样。即使在视图上没有任何索引,Server也能够对索引视图的主键索引进行索引扫描,以比使用基表快1000倍。

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

所以前两个问题是:

  1. 索引视图的索引基表有什么好处吗?
  2. 当约束在非索引列上时,Sql服务器在PK上执行索引扫描时,它在做什么?

然后我注意到,如果我使用全文搜索+ order by,我会在查询计划中看到一个表假脱机(急切的假脱机),成本约为95%。

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

问题编号3:

  1. 我可以添加什么索引来摆脱那个操作吗?
EN

回答 1

Stack Overflow用户

发布于 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缓存查询的结果。考虑到这一点,第一次查询可能需要很长时间,但是之后,由于数据本身是缓存的,它会更快。这都取决于查询的频率和系统的设置方式。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40743931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档