Sql-Server

取消使用壓縮重建分區

  • April 20, 2018

嘗試在生產中的大型表上啟用壓縮,但我們現在沒時間了(已經執行了 6.5 小時)。

取消操作並讓它回滾有什麼影響?

試圖確定我們是否應該通電並讓它完成或殺死它並讓它回滾。但是,如果回滾一個 6.5 小時的操作需要同樣長的時間,那麼我們可能希望讓它完成。

我們在 QA 中對其進行了測試,它的磁碟速度較慢,它在 4 小時內完成,所以我們不完全確定為什麼要花這麼長時間。

要知道的事情:

  • 表大小為 271 GB,大約為 271 GB。3000 萬行
  • 在 3 小時標記處,驅動器已滿,我們在大約 40 分鐘後將其擴展
  • 流行的等待類型是 IO_Completion
  • sp_whoisactive 顯示 CPU 和 physical_reads 增加,而讀/寫已經有一段時間沒有移動了
  • 這是在 SQL Server 2017 標準版、Windows Server 2016 上

這是我們的聲明:

ALTER INDEX [PK_t1] ON [dbo].[t1] REBUILD PARTITION = ALL 
WITH ( STATISTICS_NORECOMPUTE = OFF, ONLINE = OFF, SORT_IN_TEMPDB = OFF
   , MAXDOP = 3, DATA_COMPRESSION = PAGE );

回滾可以是 2x、4x 等,因為即使對於並行操作,回滾也是單執行緒的。

我的建議是讓它完成。你的選擇是什麼?從來不做嗎?如果你不能依賴你的 QA 系統給出的估計,我不知道你怎麼能有信心重新開始並期待不同的結果。

不要反應過度。如果取消操作,可能需要很長時間才能回滾。如果您認為重新啟動伺服器可能會使其停止,請再想一想。那隻會延長你的痛苦。

檢查此查詢的結果以查看發生了什麼:

SELECT der.start_time
   , der.status
   , der.command
   , der.blocking_session_id
   , der.wait_type
   , der.last_wait_type
   , der.reads
   , der.writes
   , dest.text
FROM sys.dm_exec_requests der
   CROSS APPLY sys.dm_exec_sql_text(der.sql_handle) dest
WHERE der.session_id = 53;

將最後一行中的更改53為正在執行壓縮工作的會話的會話 ID。

command如果會話已經回滾,該列將顯示“ROLLBACK”。如果操作正在進行,它將顯示“ALTER INDEX”,您應該看到readswrites遞增。

輸出類似於:

╔═════════════════════════╦═══════════╦═════════════╦═════════════════════╦═══════════╦════════════════╦════════╦════════╦═════════════════════════════════════════════════════════════════════════════════════╗
║ start_time ║ status ║ command ║ blocking_session_id ║ wait_type ║ last_wait_type ║ reads ║ writes ║ text ║
╠═════════════════════════╬═══════════╬═════════════╬═════════════════════╬═══════════╬════════════════╬════════╬════════╬═════════════════════════════════════════════════════════════════════════════════════╣
║ 2018-04-20 14:26:37.370 ║ 暫停 ║ ALTER INDEX ║ 0 ║ CXPACKET ║ CXPACKET ║ 143263 ║ 10 ║ ALTER INDEX PK_CompTest ON dbo.CompTest REBUILD WITH (DATA_COMPRESSION = PAGE); ║
╚═════════════════════════╩═══════════╩═════════════╩═════════════════════╩═══════════╩════════════════╩════════╩════════╩═════════════════════════════════════════════════════════════════════════════════════╝

如果操作正在回滾,您可以通過將estimated_completion_time列添加到上面的查詢來獲得估計的完成時間。請注意,對於索引重建操作,該列不會顯示任何內容。

可以在Microsoft Docs頁面上查看列的詳細資訊。

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