2013-10-09 127 views
2

我想獲得我所有表的所有表定義。 我想快速地做到這一點(它是我運行很多腳本的一部分)優化查詢:DBMS_METADATA.GET_DDL(Oracle)

我正在使用oracle 11g,並且我有700個表。在普通JDBC代碼它需要4分鐘,並確實:

s = con.statement("select DBMS_METADATA.GET_DDL(object_type,object_name) from user_objects where object_type = 'TABLE'); 
s.execute(); 
rs = s.getResultSet(); 
while(rs.next()){ 
rs.getString(1); 
} 

SO我想要優化這個代碼和達到約20秒。

通過創建14個線程,我已經達到了40-50秒,每個線程打開到數據庫的連接並使用rownum上的mod讀取部分信息。

但這還不夠。

我想在這兩個方向:

  1. http://docs.oracle.com/cd/B10501_01/java.920/a96654/connpoca.htm#1063660 - 連接緩存。可以通過用連接緩存替換我的14個連接來幫助加快速度嗎?

  2. 是否有可能讓這個函數訪問的表保存在KEEP緩衝區緩存區?

  3. 無論如何索引這裏的一些信息?

  4. 任何其他建議將不勝感激。

謝謝

+0

這聽起來像你只會問,如果你不使用版本控制的問題。如果是這樣的話,真正的答案是:使用版本控制。 –

回答

1

恐怕不容易讓它變快。整個GET_DDL事情在Java中實現,並使用XSLT轉換作爲生成過程的一部分。

也許你會發現這更快。 http://metacpan.org/pod/DDL::Oracle

+3

我會非常非常小心地爲此任務提供第三方工具 - 尤其是那些顯然幾年內未更新的工具(所以它肯定會*不支持使用序列的列默認值等新功能)。 ) –

+3

是的,你是對的。另一方面,DBMS_METADATA也有(或有)它的陷阱,也不適用於XE版本。它不適用於缺少JVM的任何其他數據庫安裝。我使用的另一種方法是:EXP EXP = YES ROWS = NO,然後是IMP IMP = YES。然後我通過手工製作的perl腳本來處理來自imp的輸出。 – ibre5041

+0

無論對你而言:-) –

5

是否需要隨時獲得DDL即使表沒有改變?否則,只有獲取自上次檢索到ALL_OBJECTS.LAST_DDL_TIME以來發生更改的那些表的DDL。

另一種選擇是以一種能夠一次獲取多個表的方式編寫自己的GET_DDL。

1

我首先會去HAL的建議只捕獲變化,但我也會考慮消除任何我不需要的選項 - 例如STORAGE子句?