2013-10-09 132 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子句?