Sql-Server
刪除一個 500 GB 的表,有什麼後果嗎?
我需要刪除一個大小為 500 GB 的表。它包含不需要或不使用的歷史數據。沒有 FK 約束。只是放下桌子有什麼後果嗎?我也在使用數據庫鏡像。是否會有阻塞或其他我應該關注的事情?
微軟官方聲明:
使用超過 128 個擴展區的大型表和索引在兩個不同的階段被刪除:邏輯和物理。在邏輯階段,表使用的現有分配單元被標記為釋放並鎖定,直到事務送出。在物理階段,標記為解除分配的 IAM 頁被物理分批丟棄。
來自女士:
當使用行鎖執行 DELETE 語句時,表中的每一行都被鎖定以進行刪除。TRUNCATE TABLE 始終鎖定表(包括模式 (SCH-M) 鎖)和頁,但不鎖定每一行。
在可能的情況下,我會首先在開發環境中執行它並執行 sp_whoisactive @get_locks=1。這將使您對在鎖定/阻塞方面將會發生的事情有一些保證。使用大型數據庫可能無法做到這一點。
關於鏡像,TRUNCATE 仍然是一個記錄操作,因此鏡像上的表也會被截斷。這可能會幫助https://www.sqlservercentral.com/forums/topic/truncate-table-on-mirrored-db
我已經截斷了一個 230GB 的表(2.1B 行),沒問題,沒有運氣
收縮後是否回收空閒空間,取決於你