Sql-Server
取消使用壓縮重建分區
嘗試在生產中的大型表上啟用壓縮,但我們現在沒時間了(已經執行了 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”,您應該看到reads
並writes
遞增。輸出類似於:
╔═════════════════════════╦═══════════╦═════════════╦═════════════════════╦═══════════╦════════════════╦════════╦════════╦═════════════════════════════════════════════════════════════════════════════════════╗ ║ 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頁面上查看列的詳細資訊。