2010-10-07 52 views
2

我有以下Oracle SQL:Oracle的性能丟棄所有表時

Begin 

-- tables 
for c in (select table_name from user_tables) loop 
execute immediate ('drop table '||c.table_name||' cascade constraints'); 
end loop; 

-- sequences 
for c in (select sequence_name from user_sequences) loop 
execute immediate ('drop sequence '||c.sequence_name); 
end loop; 

End; 

它給我的其他開發人員,我不知道它是如何工作的,但它滴在我們的數據庫中所有表。

它的作品,但它需要永遠!

Script Output

我不認爲刪除所有我的表應該會持續多長時間。這是怎麼回事?而且,這個腳本可以改進嗎?

備註:有大約100個表格。

+0

100個表,但有多少數據?刪除意味着寫入事務(當TRUNCATE TABLE不會),這會影響查詢速度。 – 2010-10-07 01:24:03

+0

@OMG讓我再次填充數據庫......我不確定一次有多少數據在那裏。 – jjnguy 2010-10-07 01:25:08

回答

1

我會嘗試更改DROP TABLE語句以使用Purge關鍵字。由於您要刪除所有表格,因此您並不需要同時級聯約束。這個動作可能是導致它緩慢的原因。我沒有Oracle的實例來測試它,所以它可能會引發錯誤。

如果它確實發生了錯誤,或者沒有更快,我會刪除Sequence drop命令以確定哪個命令花費了那麼多時間。

有關DROP TABLE命令的Oracle文檔是here

+0

明天我會研究一下,謝謝。 – jjnguy 2010-10-07 01:37:02

+4

CASCADE CONSTRAINTS子句強制刪除其主鍵由外鍵引用的表。沒有它,我們需要修復表中的順序,以便先刪除相關的表,或者讓腳本失敗,並返回ORA-02449 – APC 2010-10-07 03:44:05

4

「它有效,但它需要永遠!」

永遠在這種情況下,這意味着不到三秒鐘的表:)

還有更多的刪除表不僅僅是刪除表。還有依賴對象也會被丟棄 - 約束,索引,觸發器,lob或嵌套表存儲等等。有視圖,同義詞存儲過程無效。有補助被撤銷。表格的空間(及其索引等)必須被分配。

所有這些活動都會生成遞歸SQL,從數據字典中選擇或更新數據字典的查詢,以及哪些查詢可能執行得不好。即使我們不使用觸發器,視圖,存儲過程,數據庫仍然需要運行查詢來確定它們的不存在。

與普通SQL不同,我們無法調整遞歸SQL,但我們可以調整環境以使其運行更快。

我假設這是一個開發數據庫,​​在這個數據庫中,對象會定期生成並拆除,並且您使用的是10g或更高版本。

  1. 清除回收站。

    SQL> purge recyclebin;

  2. 收集的數據字典統計(需要DBA權限)。這些可能已經被收集,因爲這是10g和11g中的默認行爲。 Find out more

  3. 一旦你有詞典統計確保你使用的是基於成本的優化器。理想情況下本應在數據庫級別進行設置,但我們可以在會話級別修復:

    SQL> alter session set optimizer_mode=choose;

+0

感謝您的答覆。我明天將在工作中檢查出來。 – jjnguy 2010-10-07 05:03:01

+0

這是4年後,但顯然與「http://www.dba-oracle.com/t_optimizer_mode_sql_execution_plans.htm」相比,「選擇」已經過時,這可能不是Oracle信息的最佳來源,但我認爲這一次對這個主題感興趣。 – ddevienne 2014-09-19 14:12:53

+0

順便說一下,使用SELECT VALUE FROM v $參數WHERE NAME ='optimizer_mode';找出你當前的optimizer_mode。這是我的12c服務器的ALL_ROWS。 – ddevienne 2014-09-19 14:17:48

0

一種替代方法是刪除用戶,而不是單個表等,並重新創建它們如果需要的話。它通常更強大,因爲它會丟棄所有表格,視圖,過程,序列等,並且可能會更快。