簡體   English   中英

SQL DELETE性能

[英]SQL DELETE performance

delete from a A where a.ID = 132.

表A包含大約5000條記錄,A.ID是表A中的主鍵。但是它需要很長時間才能刪除。 有時它也會超時。 該表包含三個索引,並由三個外鍵引用。 任何人都可以解釋為什么即使我們基於主鍵刪除它也需要很長時間。 請告訴我一些優化這個問題的方法......?

可能的原因:

1)級聯刪除操作

2)觸發器

3)主鍵列的類型不是整數,因此強制對每個pk值進行類型轉換以進行比較。 這需要全表掃描。

4)你的查詢真的以你在問題中發布的點結尾嗎? 如果是這樣,該數字可以被認為是浮點數而不是整數,從而導致類似於3的類型轉換

5)您的刪除查詢正在等待其他一些慢查詢釋放鎖定

顯然它不應該花費很長時間。 但是,這里沒有足夠的信息來確定原因。 不過,我可以告訴你,你應該專注於外鍵。

如果它們從其他更大的表中施加約束,這些可能會減慢速度。 您可能還會發現您的超時是由於完整性檢查阻止刪除(然后問題是您沒有獲得異常而不是超時的原因)。

我的下一步是刪除外鍵然后檢查性能。 然后一次重新添加每個,並隨時檢查性能。

其他操作(例如插入,選擇,更新)需要很長時間嗎?

首先想到的是:外鍵索引?

  • 這與提到的級聯刪除有關
  • 將檢查所有子表muts,如果您總共有500,000個子行,這可能需要一些時間...

第二個想法:觸發射擊?

  • 在此表或子表或嘗試通過代碼級聯等
  • 上帝禁止,光標在DELETED的每一行......

嘗試更新統計信息。 5000行並不是什么大問題。 如果您經常這樣做,您也應該安排該表的維護(即重建索引,更新統計數據等)

正如其他人所觀察到的那樣,可能的嫌疑人是外鍵。

首先,因為如果依賴表依次被其他表引用,那么ON DELETE CASCADE可以收集動量,而其他表又可以被引用,依此類推。

其次,因為其他用戶可能對需要刪除的行有鎖。 這是超時的最可能原因。 它的工作原理將取決於數據庫的風格和版本。 例如,舊版本的Oracle(<= 8.0)需要鎖定整個依賴表,除非索引外鍵列。

暫無
暫無

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

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