我有一个非常大的SQL查询,在Java String
中具有以下结构。
BEGIN;
couple of thousand of INSERT INTO
END;
由于文件大小的原因,持有此String
的类在Netbeans IDE中几乎没有响应。存储,加载和运行此类大查询的最佳方法是什么?
答案 0 :(得分:6)
这不是一个大问题,它是很多小问题。除非你尝试不同的方法,否则你无法做到这一点。写出一个文件并使用批量加载实用程序将数据输入数据库可能是你最好的选择。
答案 1 :(得分:4)
假设您要从Java中运行命令(不使用db的批量加载二进制文件),您可以将SQL存储在单独的(资源)文件中,将文件读取为Java格式的字符串,然后执行它数据库。另一个好处(除了它不再存在于Java文件中)是您可以命名资源文件,以便让您的IDE将其作为SQL(假设您的IDE这样做)。(/ p) >
答案 2 :(得分:1)
我强烈建议使用ETL工具来完成此任务。他们有批量装载机组件,将使您的生活更轻松。我过去曾经使用DataStage和Pentaho(Kettle)来做这样的事情。水壶是开源的。您可以从here下载。例如,这里是oracle bulk loader的简要信息。
答案 3 :(得分:1)
您可能会发现以下内容很快(假设所有插入都在同一个表中)
BEGIN
INSERT INTO <my_table>
SELECT <blah1>
UNION ALL SELECT <blah2>
UNION ALL SELECT <blah3>
...
UNION ALL SELECT <blah1000>
END
这是一个大插入而不是1000个小插入。这减少了许多开销,并且通常运行得更快。
然而,这也是一种痛苦,这也意味着进入事务日志的范围更大。当您获得数百万个插入时,您可能会发现批量插入变得更快。
UNION将许多小型操作合并为一个。
几个较小的操作对事务日志的影响较小。
[可能会谈论数十/数十万条记录,或更多]
答案 4 :(得分:1)
如果我正确理解你的问题,你有一个非常大的Java源文件,其中包含一个包含数千个小插入语句的字符串(或许多)? 在这种情况下,作为第一步,您应该考虑将这些语句外部化为单独的文本文件。在Java代码中,然后使用模板引擎将语句加载到文件中。但是,如果您想要有效地运行许多小插入,您可能需要考虑使用批量加载器或etl工具(想到Kettle或Apache Camel)。