Sql-Server

為什麼更改數據類型不會影響數據庫大小?

  • January 8, 2021

我有一個有四列和約 6.6 億行的表。其中兩列是 bigint,儘管它們並不真正需要保存任何無法放入 int 的內容。因此,作為測試,我將它們的數據類型從 bigint 更改為 int。該表上有一個聚集索引,它既不使用這兩列作為其鍵。

結果讓我很困惑。數據空間(在表屬性中)保持不變,而索引空間下降了 23.5%。有人可以向我解釋那裡發生了什麼嗎?為什麼數據空間沒有變化?

順便說一句,我做了類似於另一張桌子的事情。那裡的數據空間下降了 30.4%,這正是我從行大小的變化中計算出來的。索引空間的下降是相似的。

$$ edit note: I originally overlooked restoring one nonclustered index. This has been fixed and the question changed accordingly $$

您如何測量表和索引的大小?

SQL Server 的工作方式是,一旦為數據庫分配了磁碟空間,它仍會保留該磁碟空間,並且僅在數據減少/刪除時將其標記為空/以供內部重用,直到SHRINK發生強制釋放已獲取數據的或類似操作空間回到磁碟。

因此,將固定寬度的數據類型更改為使用較少空間的類型不會自動觸發將先前聲明的空間釋放回磁碟,除非您重建索引、執行 aSHRINK等。

正如 Martin 在評論中指出的那樣,如果您正在使用壓縮,那麼BIGINT僅保存INT值的列的已用空間可能已經被壓縮為列的等效空間使用INT,這也可以解釋為什麼您看不到它通過更改數據類型來改變大小,即使您確實重建了索引或執行了SHRINK操作。

引用自:https://dba.stackexchange.com/questions/282813