簡體   English   中英

從表中刪除500條記錄以及100萬條記錄不應該花這么長時間

[英]deleting 500 records from table with 1 million records shouldn't take this long

我希望有一個人可以幫助我。 我有一個簡單的sql語句

delete from sometable 
where tableidcolumn in (...)

我有500條要刪除和重新創建的記錄。 該表最近增長到超過1個工廠記錄。 問題是上面的聲明需要5分鍾以上才能完成。 我有一個主鍵和2個非聚集非唯一索引。 我的刪除語句正在使用主鍵。

誰能幫助我了解為什么此聲明花了這么長時間以及如何加快它的執行速度?

我首先要看兩個方面,鎖定和錯誤的計划。

鎖定-運行查詢,並在查詢運行時查看它是否被其他任何東西阻塞,“如果您發現有任何東西阻塞了您的請求,那么請從sys.dm_exec_requests中選擇*,其中blocking_session_id <> 0”,那么我將從以下內容開始:

https://www.simple-talk.com/sql/database-administration/the-dba-as-detective-troubleshooting-locking-and-blocking/

如果沒有鎖定,則獲取插入的執行計划,它在做什么? 它異常高?

除此之外,您預計需要多長時間? 比這更長或更長時間嗎? 它只是在顯着增長后才變得如此緩慢還是在很長一段時間內變得越來越慢?

I / O性能如何,您的平均讀寫時間等是多少?

TL; DR:不要那樣做(而不是大的“ in”子句:預加載並使用臨時表)。

由於參數數量眾多,后端配置未知(即使按照今天的標准應該可以解決),並且無法猜測處理期間的內存大小,因此您可能正在(按順序)訪問堆棧,批處理或內存大小限制, 從此答案開始。 也有可能達到指令大小限制

故障排除注釋可能會導致您得到另一個答案。 我的中心點是'in'子句,語句大小,並且所有這些鏈接都包括建議以預加載臨時表並將其與查詢一起使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM