【问题标题】:Optimizing query: DBMS_METADATA.GET_DDL (Oracle)优化查询:DBMS_METADATA.GET_DDL (Oracle)
【发布时间】:2014-04-05 21:49:28
【问题描述】:

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

我使用的是 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 - 连接缓存。是否可以通过将我的 14 个连接替换为 connectionCaching 来帮助加快速度?

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

  3. 要不要在这里索引一些信息?

  4. 我们将不胜感激任何其他建议。

谢谢

【问题讨论】:

  • 这听起来像是只有在不使用版本控制时才会问的问题。如果是这样,真正的答案是:使用版本控制。

标签: java oracle jdbc


【解决方案1】:

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

另一种选择是编写您自己的 GET_DDL,以便一次获取多个表。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我会非常非常小心地为这项任务推荐 3rd 方工具 - 尤其是几年内显然没有更新的工具(所以它肯定会不会 支持新功能,例如使用序列的列默认值等)
    • 是的,你是对的。另一方面,DBMS_METADATA 也有(或有)它的问题,而且它在 XE 版本中也不起作用。它不适用于缺少 JVM 的任何其他数据库安装。我经常使用的另一种方式是:EXP FULL=YES ROWS=NO,然后是IMP SHOW=YES。然后我通过手工制作的 perl 脚本处理 imp 的输出。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2015-02-26
      • 2011-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多