我有几个服务,在处理不同的输入文件格式(XML,平面文件等)后,将数据转储到数据库(oracle)。我想知道我是否可以让他们生成SQL语句,并将它们记录到某个文件系统中,并拥有一个SQL处理器(类似于java hibernet),它将处理这些SQL文件并上传到数据库。在oracle DB中执行大量SQL语句(分布在一个文件系统中,由多个编写器编写)的最快方法是什么?我在考虑对数据库进行分区和批量更新。但是,我想知道这里的最佳实践。这似乎是一个常见的问题,肯定有人已经面对/解决了这个问题。谢谢Atanu
发布于 2011-04-07 03:38:33
atanu,最糟糕的事情是生成巨大的insert语句列表。如果您希望提高速度,并且了解数据的布局,则可以使用外部表将数据加载到oracle数据库中。这看起来很像使用sql*加载器,但您可以使用表访问数据。在表定义中,数据字段映射到列名和数据类型。这将是将批量加载到数据库中的最快方法,这是肯定的。
有关文档,请参阅Managing External Tables。
发布于 2011-04-07 05:43:45
什么是最佳实践更多地取决于您确定“最佳”的标准。在许多地方,许多地方采用的方法是使用ETL工具,可能是Oracle Warehouse Builder,也可能是第三方产品。这不一定是一个昂贵的产品:五角大楼提供了一个免费的"self-supported" community edition水壶。
当涉及到自己的滚动时,我不认为Hibernate是可行的。尤其是如果您主要关注的是性能。我还认为更改提要以生成SQL语句是一个过于复杂的解决方案。在本地读取文件和执行SQL的PL/SQL模块有什么问题?
当然,如果我以前用PL/SQL做过这样的事情。诀窍是将输入读取层与数据写入层分开。这是因为文件可能需要大量的定制编码,而编写内容通常是相当通用的(这显然取决于应用程序的确切细节)。
动态元数据驱动的体系结构是一个很有吸引力的概念,特别是当您的输入结构具有很大的可变性时。但是,这样的方法很难调试和调优。代码生成是一种替代技术。
当涉及到性能时,请尽可能使用批量处理。这是首选PL/SQL而不是使用单个SQL语句的文件的主要原因。Find out more。
发布于 2011-04-07 08:50:36
你最不想要的就是一堆insert statements...SUPER slow方法(相信我,不管你正在运行多少进程)。将所有文件转换为分隔格式并通过sqlldr直接加载到Oracle中将是最简单的方法(而且非常快)。
https://stackoverflow.com/questions/5570781
复制相似问题