[英]oracle delete query taking too much time
我有一個查詢
DELETE from tablename where colname = value;
這需要很長時間才能執行。 可能是什么原因? 我有一個關於colname的索引。
可能是你的表與多個表有很大的行數。
該指數的選擇性如何? 如果你的表有一百萬行,並且該值達到十五萬,那么你的索引就沒用了。 事實上,如果實際使用它可能會比無用更糟糕。 請記住,DELETE類似於SELECT語句:我們可以調整其訪問路徑。
此外,刪除會占用大量的撤消表空間,因此如果系統使用頻繁,您可能會遇到爭用。 在多用戶系統中,另一個會話可能會鎖定要刪除的行。
你有ON DELETE觸發器嗎? 你有ON DELETE CASCADE外鍵約束嗎?
編輯:鑒於您所說的一切,特別是有問題的列是主鍵,因此您嘗試刪除單行,如果需要很長時間,則其他進程或用戶更有可能鎖定排。 V$LOCK
是否有任何顯示?
您的表是否包含更多記錄?
是否有一些在數據庫服務器上運行的遞歸程序(一些嵌套循環等)?
如果數據庫服務器在不同的機器上,請檢查網絡問
如果事情變慢,你不知道為什么,追蹤並發現。
所以我只想發布我的經驗。 可能對某人有幫助。
查詢
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 in
以in
和用minus
來實現正確的結果。
現在查詢在0.04秒內執行。
Oracle和mysql之間存在顯着差異:
Oracle不會自動為外鍵創建索引,但mysql會這樣做。 然后,如果您有一些父表,您可以在其上執行delete命令,那么您必須在子表中的外鍵上創建索引,否則如果子表有很多行,父表上的delete命令將非常慢,因為它必須每次刪除任何父記錄時,瀏覽子表的所有記錄。
當您想要從Oracle數據庫中的父表中刪除時要小心。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.