簡體   English   中英

oracle刪除查詢花費了太多時間

[英]oracle delete query taking too much time

我有一個查詢

DELETE from tablename where colname = value;

這需要很長時間才能執行。 可能是什么原因? 我有一個關於colname的索引。

可能有幾個解釋為什么您的查詢需要很長時間:

  1. 您可能被另一個會話阻止(最有可能)。 在刪除之前,您應該確保沒有其他人鎖定行,例如:發出SELECT NULL FROM tablename WHERE colname=:value FOR UPDATE NOWAIT
  2. 可能有一個ON DELETE TRIGGER做額外的工作,
  3. 檢查指向此表的UNINDEXED REFERENCE CONSTRAINTS來自AskTom腳本將幫助您確定是否存在此類未編制索引的外鍵)。

可能是你的表與多個表有很大的行數。

該指數的選擇性如何? 如果你的表有一百萬行,並且該值達到十五萬,那么你的索引就沒用了。 事實上,如果實際使用它可能會比無用更糟糕。 請記住,DELETE類似於SELECT語句:我們可以調整其訪問路徑。

此外,刪除會占用大量的撤消表空間,因此如果系統使用頻繁,您可能會遇到爭用。 在多用戶系統中,另一個會話可能會鎖定要刪除的行。

你有ON DELETE觸發器嗎? 你有ON DELETE CASCADE外鍵約束嗎?

編輯:鑒於您所說的一切,特別是有問題的列是主鍵,因此您嘗試刪除單行,如果需要很長時間,則其他進程或用戶更有可能鎖定排。 V$LOCK是否有任何顯示?

您的表是否包含更多記錄?
是否有一些在數據庫服務器上運行的遞歸程序(一些嵌套循環等)?
如果數據庫服務器在不同的機器上,請檢查網絡問

如果事情變慢,你不知道為什么,追蹤並發現。

如何解決Oracle SQL語句的性能問題

所以我只想發布我的經驗。 可能對某人有幫助。

查詢

delete from foo
where foo_id not in ( 
  select max(foo_id) from foo group by foo_bar_id, foo_qux_id
);

花了16秒。 從表格foo刪除2300總共2300條記錄。

我按照其他答案中的指示檢查了外鍵上的所有索引。 這沒有用。

解:

將查詢更改為

delete from foo
where foo_id in ( 
  select foo_id from foo
  minus
  select max(foo_id) from foo group by foo_bar_id, foo_qux_id
);

我已經改變了not inin和用minus來實現正確的結果。

現在查詢在0.04秒內執行。

Oracle和mysql之間存在顯着差異:

Oracle不會自動為外鍵創建索引,但mysql會這樣做。 然后,如果您有一些父表,您可以在其上執行delete命令,那么您必須在子表中的外鍵上創建索引,否則如果子表有很多行,父表上的delete命令將非常慢,因為它必須每次刪除任何父記錄時,瀏覽子表的所有記錄。

當您想要從Oracle數據庫中的父表中刪除時要小心。

暫無
暫無

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

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