优化查询:DBMS_METADATA.GET_DDL(Oracle)

时间:2013-10-09 21:51:31

标签: java oracle jdbc

我想获取所有表的所有表定义。 而且我想快速完成它(它是我运行很多的脚本的一部分)

我正在使用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);
}

所以我想优化这段代码并达到大约20秒。

我已经通过创建14个线程达到40-50秒,每个线程打开一个与数据库的连接,并使用rownum上的mod读取部分信息。

但这还不够。

我正在考虑这些方向:

  1. http://docs.oracle.com/cd/B10501_01/java.920/a96654/connpoca.htm#1063660 - 连接缓存。通过用connectionCaching替换我的14个连接可以帮助加快速度吗?

  2. 是否可以在KEEP缓冲区缓存区域中保留此函数访问的表?

  3. 无论如何在这里索引一些信息?

  4. 我们将非常感谢任何其他建议。

  5. 谢谢

3 个答案:

答案 0 :(得分:5)

即使表没有更改,是否需要始终获取DDL?否则只获取自上次检索以来ALL_OBJECTS.LAST_DDL_TIME已更改的那些表的DDL。

另一种选择是以一种能够同时获得多个表的方式编写自己的GET_DDL。

答案 1 :(得分:1)

我担心没有什么比这更容易。整个GET_DDL事物是用Java实现的,并使用XSLT转换作为生成过程的一部分。

也许你会发现这更快。 http://metacpan.org/pod/DDL::Oracle

答案 2 :(得分:1)

我首先会考虑HAL建议只捕获更改,但我也会考虑删除任何我不需要的选项 - 例如STORAGE子句?