Sql 将一百万条记录从excel复制到数据库
我的excel工作表中有100万条记录,我想以最快的方式将这些记录复制到oracle数据库中 我知道有两种方法,一种是使用批处理,另一种是使用SQLBulkcopy 除了这两种方法之外,还有没有最快的方法Sql 将一百万条记录从excel复制到数据库,sql,excel,database,oracle,Sql,Excel,Database,Oracle,我的excel工作表中有100万条记录,我想以最快的方式将这些记录复制到oracle数据库中 我知道有两种方法,一种是使用批处理,另一种是使用SQLBulkcopy 除了这两种方法之外,还有没有最快的方法 我还需要创建一个日志文件,其中包含在执行操作时未插入的记录的详细信息。您可以使用任何Excel解析库,如apache poi 它使您能够通读excel电子表格 只需存储每一行和每一列,以及您需要的任何其他数据。 然后,将所有数据传输到您希望在其上查看的服务器/位置 使用此库的我的一个程序的示例
我还需要创建一个
日志文件
,其中包含在执行操作时未插入的记录的详细信息。您可以使用任何Excel解析库,如apache poi
它使您能够通读excel电子表格
只需存储每一行和每一列,以及您需要的任何其他数据。
然后,将所有数据传输到您希望在其上查看的服务器/位置
使用此库的我的一个程序的示例源:
public boolean read() {
for (final int sheet : sheets()) {
final Sheet result = workbook.getSheetAt(sheet);
if (result != null) {
results.addAll(results(result));
}
}
if (results().size() > 0) {
System.out.println("Creating backup database incase any failures occur...");
createBackup();
return true;
}
return false;
}
public boolean open() {
try {
results = new HashSet<E>();
workbook = new HSSFWorkbook(new POIFSFileSystem(new FileInputStream(new File(location()))));
} catch (IOException e) {
System.out.println("IOException getting workbook from speadsheet: " + e.getMessage());
}
return results != null && workbook != null;
}
public boolean read(){
对于(最终整型图纸:图纸()){
最终工作表结果=工作簿.getSheetAt(工作表);
如果(结果!=null){
results.addAll(results(result));
}
}
如果(结果().size()>0){
System.out.println(“在发生任何故障时创建备份数据库…”);
createBackup();
返回true;
}
返回false;
}
公共布尔开放(){
试一试{
结果=新的HashSet();
工作簿=新的HSSF工作簿(新的POIFSF文件系统(新的FileInputStream(新的文件(location()))));
}捕获(IOE异常){
System.out.println(“从speadsheet获取工作簿时发生IOException:+e.getMessage());
}
返回结果!=null&&workbook!=null;
}
最快的方法是将excel文件类型设置为CSV,将所有列与表格标题匹配,然后手动将CSV导入表格。在远程服务器上加载逗号分隔文件的最快方法是通过sql*ldr使用直接路径加载。。如果在同一台服务器上,也可以使用外部表
我建议您使用两个步骤加载。。
首先按照以下步骤创建sql*ldr加载脚本。
然后在oracle客户端中运行生成的脚本。。
如果表没有日志记录,那么在执行脚本之前添加append命令将使其速度更快
话虽如此,对于oracle来说,一百万行太小了,如果表没有大量索引,它应该能够在一分钟内加载
通过并行加载,您可以更快地加载,但这对于一百万行来说是一种过度消耗。好的,但这是最快的方式吗?我的意思是,如果我们走这条路线,将整个工作表复制到db大约需要多少分钟?这根本不能回答问题。这实际上不能回答问题。但即使代码有点完整,这仍然不是最好的方法,也肯定不是最快的方法。@Ghostider不要这样做。将Excel转换为CSV,上载到数据库服务器,使用数据库CSV工具导入。@ghostrider没有“或”。SQL*Loader属于“数据库CSV工具”集合。如果您想要最快的方法,那么这不应该是Java/JDBC问题。您的标记隐式地限制您使用Java/JDBC解决方案。将其转换为CSV并使用SQL*loader加载。我敢打赌这很快。@KaushikNayak的评论速度最快,不需要«复制»只需使用oracle直接打开csv文件……导入前也要删除索引,导入后再重新创建索引。