[英]SQL DELETE performance
delete from a A where a.ID = 132.
表A包含大約5000條記錄,A.ID是表A中的主鍵。但是它需要很長時間才能刪除。 有時它也會超時。 該表包含三個索引,並由三個外鍵引用。 任何人都可以解釋為什么即使我們基於主鍵刪除它也需要很長時間。 請告訴我一些優化這個問題的方法......?
可能的原因:
1)級聯刪除操作
2)觸發器
3)主鍵列的類型不是整數,因此強制對每個pk值進行類型轉換以進行比較。 這需要全表掃描。
4)你的查詢真的以你在問題中發布的點結尾嗎? 如果是這樣,該數字可以被認為是浮點數而不是整數,從而導致類似於3的類型轉換
5)您的刪除查詢正在等待其他一些慢查詢釋放鎖定
顯然它不應該花費很長時間。 但是,這里沒有足夠的信息來確定原因。 不過,我可以告訴你,你應該專注於外鍵。
如果它們從其他更大的表中施加約束,這些可能會減慢速度。 您可能還會發現您的超時是由於完整性檢查阻止刪除(然后問題是您沒有獲得異常而不是超時的原因)。
我的下一步是刪除外鍵然后檢查性能。 然后一次重新添加每個,並隨時檢查性能。
其他操作(例如插入,選擇,更新)需要很長時間嗎?
首先想到的是:外鍵索引?
第二個想法:觸發射擊?
嘗試更新統計信息。 5000行並不是什么大問題。 如果您經常這樣做,您也應該安排該表的維護(即重建索引,更新統計數據等)
正如其他人所觀察到的那樣,可能的嫌疑人是外鍵。
首先,因為如果依賴表依次被其他表引用,那么ON DELETE CASCADE可以收集動量,而其他表又可以被引用,依此類推。
其次,因為其他用戶可能對需要刪除的行有鎖。 這是超時的最可能原因。 它的工作原理將取決於數據庫的風格和版本。 例如,舊版本的Oracle(<= 8.0)需要鎖定整個依賴表,除非索引外鍵列。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.