Sql-Server
在 SQL Server 中為更改的視圖刪除所有索引的基本原理是什麼?
這是ALTER VIEW drop Index from View問題的後續行動。
接受的響應表明 ALTER VIEW 將自動刪除任何已定義的索引。
這與其他類似操作的發生方式有些反直覺:
- 很自然地期望相關的事情,例如權限或索引被丟棄在對象丟棄而不是改變
- 更改表不會刪除任何索引(實際上您必須刪除索引、約束等內容)
我想知道為什麼首先預設具有這種行為(即在某些情況下是否存在任何客觀方面,例如由於視圖更改而導致性能降低)。
**問題:**刪除所有索引以更改視圖的基本原理是什麼?
Kendra Little在她最近的博文中提出了一些很好的理論來解釋為什麼會發生這種情況: Altering an indexed view in SQL Server drops all indexes
當我考慮如何實現索引視圖時,這種行為是有道理的
當您在視圖上創建索引時(我們在這裡使用經典的基於磁碟的表來討論視圖),它會具體化視圖 - 換句話說,它將數據儲存為一個表。該數據儲存在 8KB 頁面上的行中。這些頁面可以填滿。因此,如果您向視圖添加列,就像向表中添加列一樣,數據庫引擎需要重寫這些頁面以將新列添加到每一行(取決於數據類型和可空性等)。
此外,很有可能在更改索引視圖時,更改會使視圖不再遵守索引視圖所需的許多規則。
改變視圖可能會完全改變數據的結構——列數、行數、行的大小等。所以基本上無論如何都需要刪除並重新創建表。
我發現第二點,關於更改與索引視圖限制相衝突的可能性有多大,特別引人注目。
就像 Kendra 稍後提到的,以及其他人在此處的評論中提到的那樣,如果一個人被簡單地阻止更改索引視圖,那就太好了。但由於向後兼容性問題,這種變化可能永遠不會發生。