`
eyesmore
  • 浏览: 377041 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

SQL Server中采用BULK INSERT实现大数据量文本文件批量导入

阅读更多

今天做了一个基于SQL Server的文本文件批量导入工具,和大家分享一下心得。 

方案一:

遍历文本文件,解析每一行,形成SQL语句后向数据库插入。

方案二

遍历文本文件,解析每一行,将SQL语句保存到文本文件然后执行。

方案三

使用SQL Server Bulk Insert 功能披露导入数据,然后在数据库中做数据处理。

刚开始用方案一做的,50MB文本文件导入大约20-25分钟,后来进行了优化,采用数据批量插入,性能提升不大。

继续优化,使用多线程向数据库中插入数据,性能提升10-20%左右,效果也不好。

方案二没有完全测试,主要是生成SQL文件耗时15分钟左右,不太理想。

最后使用BULK INSERT ,然后在数据库中写脚本对数据进行处理,50MB文件10秒即可导入

    FQuery.SQL.Text := 'BULK INSERT LOGDATA FROM ' + QuotedStr(FFileName)
      + ' WITH (FIELDTERMINATOR = '','', ROWTERMINATOR = ''\n'',  BATCHSIZE = 500)';
    FQuery.ExecSQL;

最后执行大量的UPDATE语句,将数据格式化

建议在做大数据量导入的时候还是用BULK INSERT ,SQL SERVER 性能在那里摆着,一个SQL 4ms,1000行就要4秒,根本快不了

测试java的insert 同使用9i以后的bulk Insert 的速度.
测试结果显示通过bulk Insert 速度相当的快.
100000条记录
insert ,---------------93秒
bulk insert -------------0.441秒

环境:
oracle 10.2.0.3 Windows 2000Server
java
代码:
SQL> desc a
Name Type Nullable Default Comments
---- ------------ -------- ------- --------
ID INTEGER Y
NAME VARCHAR2(20) Y

bulk Insert 使用的类型及过程
create or replace type i_table is table of number(10);
create or replace type v_table is table of varchar2(10);

create or replace procedure pro_forall_insert(v_1 i_table,v_2 v_table)
as
c integer;
begin

forall i in 1.. v_1.count
insert into a values(v_1(i),v_2(i));
end;
测试的java代码:
public class testOracle {
public testOracle() {

Connection oraCon = null;
PreparedStatement ps = null;
Statement st = null;
ResultSet rs = null;
try {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
} catch (ClassNotFoundException ex) {}
oraCon = DriverManager.getConnection("jdbc:oracle:thin:@192.168.15.234:1521:ora10g", "imcs","imcs");
oraCon.setAutoCommit(false);
} catch (SQLException ex) {
ex.printStackTrace();
}

CallableStatement cstmt = null;
oracle.sql.ArrayDescriptor a = null;
oracle.sql.ArrayDescriptor b = null;
if (1 == 1 )
{
Object[] s1 = new Object[100000];
Object[] s2 = new Object[100000];

for (int i = 0; i < 100000; i++) {
s1[i] = new Integer(1);
s2[i] = new String("aaa").concat(String.valueOf(i));
}
try {
a = oracle.sql.ArrayDescriptor.createDescriptor("I_TABLE", oraCon);
b = oracle.sql.ArrayDescriptor.createDescriptor("V_TABLE", oraCon);
ARRAY a_test = new ARRAY(a, oraCon, s1);
ARRAY b_test = new ARRAY(b, oraCon, s2);
cstmt = oraCon.prepareCall("{ call pro_forall_insert(?,?) }");
cstmt.setObject(1, a_test);
cstmt.setObject(2, b_test);
long aaaa = System.currentTimeMillis();
System.out.println(System.currentTimeMillis());
cstmt.execute();
oraCon.commit();
System.out.println(System.currentTimeMillis()-aaaa);
} catch (Exception e) {
e.printStackTrace();
}
}
else
{
try
{
PreparedStatement oraPs = null;
String oraInsertSql =
"insert into a values(?,?)";

oraPs = oraCon.prepareStatement(oraInsertSql);
long aaaa = System.currentTimeMillis();
System.out.println(System.currentTimeMillis());
for (int i = 0; i < 100000; i++)
{

oraPs.setInt(1,i);
oraPs.setString(2, new String("aaa").concat(String.valueOf(i)));
oraPs.executeUpdate();
}
oraCon.commit();
System.out.println(System.currentTimeMillis()-aaaa);
}
catch (SQLException ex)
{
System.out.print("dddddd");
System.out.print(ex.getMessage());
}

}
try {
jbInit();
} catch (Exception ex) {
ex.printStackTrace();
}
}


public static void main(String args[]) {
testOracle a = new testOracle();
}

private void jbInit() throws Exception {
}


};

分享到:
评论

相关推荐

    bulk insert 文本文件数据导入

    在SQL Server中,`BULK INSERT`命令是一个非常实用的功能,用于从外部数据源,如文本文件或CSV文件,快速大量地导入数据到数据库表中。这个操作比使用INSERT语句逐行插入数据快得多,尤其在处理大量数据时。在本篇中...

    SQL SERVER BULK INSERT用法

    BULK INSERT 是 SQL Server 中的一种 BulkCopy 功能,允许用户快速将大量数据从文本文件或其他数据源导入到数据库表或视图中。下面是 BULK INSERT 的详细用法和参数解释: 基本语法 BULK INSERT [ [ 'database_...

    文本文件批量导入sql数据库

    3. **使用BULK INSERT命令(SQL Server)**:在SQL Server中,可以使用BULK INSERT语句来批量导入数据。例如: ```sql BULK INSERT TableName FROM 'C:\path\to\file.csv' WITH (FIELDTERMINATOR = ',', ...

    Sqlserver大数据量插入速度慢或丢失数据的解决方法

    面对SQL Server在大数据量插入时出现的速度慢及数据丢失的问题,可以通过使用函数进行批量插入或采用BULK INSERT等命令来提高插入效率和数据完整性。这两种方法各有优缺点,根据实际情况选择合适的方案可以有效提升...

    sql.rar_Bulk Insert

    总的来说,Bulk Insert是SQL Server中一种强大的工具,特别适用于大数据量的导入操作,结合预编译的存储过程,可以极大地提高数据处理的效率。在进行Bulk Insert操作时,需要合理规划数据格式、处理错误、优化性能,...

    sql server中批量导入的代码

    综上所述,给定的代码片段展示了如何在SQL Server中创建表、删除表以及如何使用`BULK INSERT`语句批量导入数据。这对于处理大量数据的场景非常有用,可以显著提高数据处理的效率。然而,在实际应用中,还需注意数据...

    bulk insert导入数据

    - **定义**:`BULK INSERT` 是 SQL Server 提供的一种高效数据导入工具,能够帮助用户快速地将大量数据从文本文件导入到数据库表中。 - **优势**: - **高效性**:相比传统的 INSERT 语句,`BULK INSERT` 能够显著...

    Excel数据导入到SQLServer数据库中

    2. T-SQL语句:对于批量导入,可以使用BULK INSERT命令,指定Excel文件路径和数据库表结构。如果Excel文件包含多个工作表,可能需要循环处理。另一种方法是使用OPENROWSET函数,它可以直接读取Excel文件,但需要注意...

    plsql批量导入数据

    当我们需要处理大量数据导入任务时,PLSQL提供了多种方法来实现批量导入,这些方法高效且灵活。本文将详细介绍如何在PLSQL中进行批量导入数据。 一、SQL*Loader SQL*Loader是Oracle提供的一个命令行工具,它能够...

    sql server 批量导入省市县街道四级数据

    2. **性能优化**:对于大数据量的导入,可以考虑使用`BULK INSERT`或SSIS等工具,避免因大量单个INSERT语句导致的性能瓶颈。 3. **错误处理**:导入过程中可能会遇到各种错误,如数据类型不匹配、主键冲突等,需要...

    将txt与excel文件导入SQLServer数据库的sql代码

    以下内容详细介绍了如何使用SQL Server中的BULK INSERT语句将txt和excel文件中的数据导入SQL Server数据库的具体操作步骤和示例代码。 1. SQL Server批量导入概念 - BULK INSERT是SQL Server提供的一个功能强大的...

    使用BULK INSERT大批量导入数据 SQLSERVER

    `BULK INSERT`是SQL Server提供的一种快速导入大量数据的方法,尤其适用于数据量较大、格式相对固定的情况。它可以从一个文本文件(通常是CSV或制表符分隔的文件)中读取数据,并将这些数据插入到数据库表中。相比于...

    excel数据导入到sql server数据库中,

    然而,当数据量增长或者需要更高级的数据管理功能时,将Excel数据导入到SQL Server数据库就显得尤为重要。下面我们将详细探讨如何实现这个过程,并涉及相关的知识点。 1. **Excel数据格式准备**:在导入前,确保...

    sql-数据批量导入

    - **BULK INSERT**:SQL Server支持BULK INSERT语句,可以直接从CSV或文本文件导入数据。你需要创建一个T-SQL脚本,指定文件路径、字段分隔符等参数。 - **LOAD DATA INFILE**:在MySQL中,使用LOAD DATA INFILE...

    批量导入数据,大数据导入

    3. **使用BULK INSERT**:在SQL Server中,BULK INSERT命令用于批量导入数据,与LOAD DATA INFILE类似。 ```sql BULK INSERT table_name FROM 'data.txt' WITH (FIELDTERMINATOR = ',', ROWTERMINATOR = '\n'); `...

    SQL SERVER数据导入导出等辅助功能小工具

    SSIS是SQL Server中用于ETL(Extract, Transform, Load)操作的强大工具,支持从各种数据源导入数据,如文本文件、Excel表格、其他数据库等,并能对数据进行清洗、转换,然后导出到SQL Server中。通过图形化界面...

    sqlserver 批量创建表

    或者,如果数据量较大,可能使用BULK INSERT语句从CSV或其他数据源导入数据,这样更高效: ```sql BULK INSERT Table1 FROM 'C:\Data\file1.csv' WITH (FIELDTERMINATOR = ',', ROWTERMINATOR = '\n') BULK INSERT ...

    SQL批量录入数据到数据库中

    在上述的`批量录入数据.sql`文件中,很可能包含了这样的BULK INSERT语句,用于将数据从文本文件导入到SQL Server的表中。在实际操作时,需要确保文件路径正确,且文件中的数据格式与BULK INSERT语句的配置相匹配。 ...

    sql server 2005用sql语句导入txt中的数据小结

    在SQL Server 2005中,从TXT文件导入数据是一项常见的任务,特别是在处理大量文本数据时。本文将总结两种主要方法,通过SQL语句和存储过程来完成这个任务。 首先,我们来看第一种方法,直接使用BULK INSERT语句。...

Global site tag (gtag.js) - Google Analytics