我們有一個飼料過程,每年的每一天運行。 作爲其中的一部分,我們每天從表中刪除每行(大約100萬行),使用5個不同的存儲過程重新填充它,然後提交事務。 這是我們所稱的唯一提交語句。 突然刪除已經開始進入約2小時完成。 刪除也非常簡單(從T_PROFILE_WORK刪除) 這在過去的一年裏效果很好,但在過去的一週裏我注意到了這個問題。刪除突然花費很長時間
任何幫助是極大的讚賞
我們有一個飼料過程,每年的每一天運行。 作爲其中的一部分,我們每天從表中刪除每行(大約100萬行),使用5個不同的存儲過程重新填充它,然後提交事務。 這是我們所稱的唯一提交語句。 突然刪除已經開始進入約2小時完成。 刪除也非常簡單(從T_PROFILE_WORK刪除) 這在過去的一年裏效果很好,但在過去的一週裏我注意到了這個問題。刪除突然花費很長時間
任何幫助是極大的讚賞
請參閱這太問題的答案:"oracle delete query taking too much time":
- 您可以通過另一個會話(很可能)被阻止。之前 刪除,你應該確保沒有人別的 鎖定該行,如:問題選擇 NULL FROM表名WHERE colname的=:值FOR UPDATE NOWAIT,
- 有可能是一個ON DELETE觸發器,做額外的工作,
- 檢查指向此表 (有script from AskTom, 將幫助您確定是否存在這樣的未索引的外鍵存在)的未參考參考約束。
我會先檢查#2和#3,它們是最容易診斷的。
如果你只是想刪除一切從表使用TRUNCATE而不是刪除。
恐怕我們不能那樣做。當這張桌子被加載時,人們仍然使用我們的系統。如果我們截斷了這個表,那麼應用程序將一直是空的,直到這個表被加載並且提交完成。 (我知道的不是很好的建築,但是我在這個解決方案實施後加入了這個項目) – Damien 2010-04-14 14:21:58
您如何從存儲過程中填充第二個(也許是全局臨時)表,然後在最終的MERGE中執行現有表。 不知道活動的細節,表格結構等,很難確定。但是你可能會發現它更快。
作爲替代方案,如果您的企業版帶有分區選項,請查看分區交換。
爲了記錄,這裏是湯姆凱特的劇本,文森特馬爾格拉特在接受的答案中提到過(這樣你就不必通過gazillion的評論和更多的鏈接進行篩選)。
腳本產生全部所有表的列;您仍然必須找出哪些適用於要刪除行的表以及哪些FK表具有最大基數。
否則,不是所有的命中都需要索引。
SELECT table_name,
constraint_name,
cname1
|| NVL2 (cname2, ',' || cname2, NULL)
|| NVL2 (cname3, ',' || cname3, NULL)
|| NVL2 (cname4, ',' || cname4, NULL)
|| NVL2 (cname5, ',' || cname5, NULL)
|| NVL2 (cname6, ',' || cname6, NULL)
|| NVL2 (cname7, ',' || cname7, NULL)
|| NVL2 (cname8, ',' || cname8, NULL)
columns
FROM ( SELECT b.table_name,
b.constraint_name,
MAX (DECODE (position, 1, column_name, NULL)) cname1,
MAX (DECODE (position, 2, column_name, NULL)) cname2,
MAX (DECODE (position, 3, column_name, NULL)) cname3,
MAX (DECODE (position, 4, column_name, NULL)) cname4,
MAX (DECODE (position, 5, column_name, NULL)) cname5,
MAX (DECODE (position, 6, column_name, NULL)) cname6,
MAX (DECODE (position, 7, column_name, NULL)) cname7,
MAX (DECODE (position, 8, column_name, NULL)) cname8,
COUNT (*) col_cnt
FROM (SELECT SUBSTR (table_name, 1, 30) table_name,
SUBSTR (constraint_name, 1, 30) constraint_name,
SUBSTR (column_name, 1, 30) column_name,
position
FROM user_cons_columns) a, user_constraints b
WHERE a.constraint_name = b.constraint_name
AND b.constraint_type = 'R'
GROUP BY b.table_name, b.constraint_name) cons
WHERE col_cnt >
ALL ( SELECT COUNT (*)
FROM user_ind_columns i
WHERE i.table_name = cons.table_name
AND i.column_name IN
(cname1,
cname2,
cname3,
cname4,
cname5,
cname6,
cname7,
cname8)
AND i.column_position <= cons.col_cnt
GROUP BY i.index_name);
+1作爲文森特出色答案的附錄,並且解釋湯姆凱特,「什麼改變了?」如果刪除語句確實有效並且現在沒有更改導致此問題? – 2010-04-14 15:29:56