3

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

我正在使用 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. 任何其他建议将不胜感激。

谢谢

4

3 回答 3

5

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

另一种选择是以一种能够一次获取多个表的方式编写您自己的 GET_DDL。

于 2013-10-10T05:18:02.430 回答
1

我首先会接受 HAL 的仅捕获更改的建议,但我也会考虑消除任何我不需要的选项——例如 STORAGE 子句?

于 2013-10-10T10:32:26.243 回答
1

恐怕没有容易让它更快。整个 GET_DDL 是用 Java 实现的,并使用 XSLT 转换作为生成过程的一部分。

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

于 2013-10-10T07:11:27.440 回答