优化查询: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); }
所以我想优化这段代码并达到20秒左右。
我已经通过创建14个线程达到40-50秒,每个线程打开与数据库的连接并使用rownum上的mod读取部分信息。
但这还不够。
我正在考虑这些方向:
-
http://docs.oracle.com/cd/B10501_01/java.920/a96654/connpoca.htm#1063660 – 连接缓存。 它可以通过用connectionCaching替换我的14个连接来帮助加快速度吗?
-
是否可以在KEEP缓冲区缓存区域中保持此函数访问的表?
-
无论如何索引一些信息在这里?
-
任何其他建议将不胜感激。
谢谢
我担心不容易让它变得更快。 整个GET_DDL事物是用Java实现的,并使用XSLT转换作为生成过程的一部分。
也许你会发现这更快。 http://metacpan.org/pod/DDL::Oracle
即使表没有更改,是否需要始终获取DDL? 否则,只获取自上次检索以来ALL_OBJECTS.LAST_DDL_TIME已更改的那些表的DDL。
另一种选择是以一种能够一次获得多个表的方式编写自己的GET_DDL。
我首先要求HAL建议只捕获更改,但我也会考虑删除任何我不需要的选项 – 例如STORAGE子句?