我創建索引視圖(上Table1_ID
聚集唯一索引)鑑於這樣的T-SQL:瞭解索引視圖更新QND查詢過程2008 R2
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上的索引。
所以查看由兩列組成:
Table1_ID
Table2TotalCount
T-SQL創建視圖是因爲幾百萬的表2中的行組和沉重。
但是當我運行一個查詢,視圖像
Select Total2TotalCount from MyView where Table1_ID = k
- 它執行速度快,無開銷的服務器。
同樣在t-sql中創建視圖的許多條件在where子句中爲Table2
列。而 如果我改變Table2_DeletedMark爲1,然後再次運行查詢
Select Total2TotalCount from MyView where Table1_ID = k
- 我會得到正確的結果。 (Table2TotalCount
減1)。
因此,我們的問題是:
1.爲何查詢執行時間減少很多,所以,當我們使用索引視圖
2(與不使用視圖(即使我們執行查詢查看)之前運行DBCC DROPCLEANBUFFERS()
)。改變後
Table2_DeletedMark
查看立即重新計算,我們得到正確的結果,但後面的過程是什麼?我們無法想象sql每次更改包含在t-sql視圖生成中的10列以上的任何值時生成的視圖都會執行t-sql,因爲它太重了。
我們知道,運行簡單的查詢來重新計算值就足夠了,這取決於我們更改的列值。
但sql如何理解呢?
我知道索引視圖是物化的。主要問題是我們的第二個問題。我想知道一種機制可以用於「每當基礎表發生變化時始終保持最新狀態」。怎麼運行的 ?你能解釋一下問題2 – 2010-12-10 11:41:02
@ mmcteam.com.au:除了來自SQL Server團隊的人以外,我不認爲任何人都可以真正解釋它是如何工作的。我只知道它確實有效 - 每當更改任何基礎表時,索引視圖都會更新。這就是我需要了解的一切:-) – 2010-12-10 12:01:13