Table1_ID
我用这样的 T-SQL创建了索引视图(在 上的聚集唯一索引)视图:
Select Table1_ID, Count_BIG(*) as Table2TotalCount from Table2 inner join
Table1 inner join... where Table2_DeletedMark=0 AND ... Group BY Table1_ID
同样在创建视图之后,我们在 Table1_ID 列上设置了聚集唯一索引。
所以 View 由两列组成:
Table1_ID
Table2TotalCount
用于创建 View 的 T-Sql 很重,因为 Table2 中有数百万行的 group by。
但是当我对像这样的视图运行查询时
Select Total2TotalCount from MyView where Table1_ID = k
- 它执行速度快,没有服务器开销。
同样在 t-sql 中,用于在Table2
列的 where 子句中创建视图的许多条件。如果我将 Table2_DeletedMark 更改为 1 并运行查询
Select Total2TotalCount from MyView where Table1_ID = k
再次 - 我会得到正确的结果。(Table2TotalCount
减少 1)。
所以我们的问题是:
1.为什么我们使用Indexed View时查询执行时间减少了这么多(与不使用视图相比(即使我们DBCC DROPCLEANBUFFERS()
在执行查询之前运行到VIEW))
2.更改后
Table2_DeletedMark
查看立即重新计算,我们得到正确的结果,但背后的过程是什么?我们无法想象每次我们更改 t-sql 视图生成中包含的 10+ 列的任何值时,sql 都会根据生成的视图执行 t-sql,因为它太重了。
我们知道运行一个简单的查询来重新计算值就足够了,这取决于我们更改的列值。
但是sql怎么理解呢?