Sql-Server

刪除一個 500 GB 的表,有什麼後果嗎?

  • November 27, 2019

我需要刪除一個大小為 500 GB 的表。它包含不需要或不使用的歷史數據。沒有 FK 約束。只是放下桌子有什麼後果嗎?我也在使用數據庫鏡像。是否會有阻塞或其他我應該關注的事情?

微軟官方聲明:

使用超過 128 個擴展區的大型表和索引在兩個不同的階段被刪除:邏輯和物理。在邏輯階段,表使用的現有分配單元被標記為釋放並鎖定,直到事務送出。在物理階段,標記為解除分配的 IAM 頁被物理分批丟棄。

來自女士:

當使用行鎖執行 DELETE 語句時,表中的每一行都被鎖定以進行刪除。TRUNCATE TABLE 始終鎖定表(包括模式 (SCH-M) 鎖)和頁,但不鎖定每一行。

https://docs.microsoft.com/en-us/sql/t-sql/statements/truncate-table-transact-sql?redirectedfrom=MSDN&view=sql-server-ver15

在可能的情況下,我會首先在開發環境中執行它並執行 sp_whoisactive @get_locks=1。這將使您對在鎖定/阻塞方面將會發生的事情有一些保證。使用大型數據庫可能無法做到這一點。

關於鏡像,TRUNCATE 仍然是一個記錄操作,因此鏡像上的表也會被截斷。這可能會幫助https://www.sqlservercentral.com/forums/topic/truncate-table-on-mirrored-db

我已經截斷了一個 230GB 的表(2.1B 行),沒問題,沒有運氣

收縮後是否回收空閒空間,取決於你

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