执行db load的最佳方式 - oracle

时间:2014-03-10 10:59:37

标签: java sql database oracle jdbc

我想在oracle数据库中读取整个模式并将其复制到内存数据库中(仅在启动时一次)。此架构有大约300个表和总共4GB的信息。 我使用jdbc连接加载。

显然,我希望所有这些内存都一致,所以我使用只读模式。

我正在寻找最快的方法。

一种方式:如果我只使用一个连接并逐个进入每个表。 Psuedo代码:

conn = getConnection();
conn.setReadOnly(true);
for(String table:allTables){
 ps = conn.prepareStatement(String.format("select * from %s", table));
 ps.execute();
 rs = ps.getResultSet();
 analyze(rs);
 rs.close();
 ps.close();
}

这里的问题是我没有充分利用数据库的计算能力 - 所以我可以将上述内容并行化 - 问题是如何:

  1. 每个连接加载一个表 - 这很容易实现,但可能会创建大量连接并变得不公平,因为有些表有数百万条记录而其他只有几十条。

  2. 每个连接(假设我们有n个连接)读取每个表的一部分 - 也就是说,索引为i的典型连接读取每个表的1 / n,如下所示:“其中rownum> count * i / n和rownum< count *(i + 1)/ n“计算为表中的记录数。

  3. 与仅使用mod函数的2相同 - “其中mod(rownum,n)= i”

  4. 现在似乎最快的方法是2 - 如果我添加一个阈值,它会变得更快 - 所以小表只是作为一个整体加载。

    问题:我的问题是 - 基于oracle的内部工作 - 我如何能够加快表的加载时间?

    (我的意思是一方面,似乎合乎逻辑的是oracle希望方法1中的选择 - 几乎没有解析,并且它最小化了处理的命令数 - 但它需要很多连接,如果真的很大一张桌子,它会失去效率。)

    有什么建议吗?

0 个答案:

没有答案