【发布时间】:2017-04-06 06:00:56
【问题描述】:
创建索引视图后,我尝试禁用基表中的所有索引,包括外键列的索引(约束仍然存在)并且视图的查询计划保持不变。
即使没有对基表进行索引,索引视图也能够如此优化查询,这对我来说就像魔术一样。即使视图上没有任何索引,SQL Server 也能够对索引视图的主键索引进行索引扫描,检索数据的速度比使用基表快 1000 倍。
类似SELECT * FROM MyView WITH(NOEXPAND) WHERE NotIndexedColumn = 5 ORDER BY NotIndexedColumn
所以前两个问题是:
- 索引视图的基表索引有什么好处?
- 当约束位于未索引的列上时,Sql server 在 PK 上执行索引扫描时在做什么?
然后我注意到,如果我使用全文搜索 + order by,我会在查询计划中看到一个 table spool(eager spool),成本约为 95%。
查询看起来像SELECT ID FROM View WITH(NOEXPAND) WHERE CONTAINS(IndexedColumn, '"SomeText*"') ORDER BY IndexedColumn
问题 3:
- 是否可以添加任何索引来摆脱该操作?
【问题讨论】:
-
@TheGameiswar 从我读过的索引视图中只存储了结果的部分子集,而不是 100% 的重复。所以我仍然很想知道索引原始表是否有任何好处
标签: sql-server tsql indexed-view