×

bulkinsert

bulkinsert(sql server bulk insert 与bcp 哪个快)

admin admin 发表于2023-01-10 00:38:59 浏览51 评论0

抢沙发发表评论

本文目录

sql server bulk insert 与bcp 哪个快

今天做了一个基于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;
Object s2 = new Object;

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 BINARY字段怎么办,插不进去

如果是在程序里运行的话,很有可能是程序没有走插入语句的 sql 所有没有插入。
首先插入表的时候,需要确认表字段,主键及非空情况。主键和非空字段都必须要录入的。
其次需要看每个字段的类型和插入字段的类型是否相符,如果日期型字段硬要插入字符串型是插入不进去的。
再者注意看表字段的长度,我定义字段20个字符串的话,你插入长字符串也插入不进去的。
最后还得看你用什么程序:
如果C语言的话
insert(node *head, int i, int x)
中的head的内容,是无法完成目的的。
因为C在传递参数时采用的是传值调用。
因此必须修改函数原型为
insert(node **head,int i,int x)
如果其它语言的话一般都指定 insert(字段1,字段2,)values(’x’,’y’);

bulk insert 可以插入表中指定的列吗

可以的,不过你要修改一下txt 文件的内容,格式如下
1 1111111
2 2222222
3 3333333
4 4444444
然后在企业管理器里面用“导入数据”就可以了
也可用语句来实现格式如下
select *
from opendatasource( ’microsoft.jet.oledb.4.0’, ’excel 5.0;hdr=yes;imex=1;database=d:\test.xls’)...[sheet1$]

sql语句问题 bulk insert

看了第一个,语句连接有问题,第二个貌似缺少了空格。在第一个中,给@file赋值后,改为如下语句试试看:
DECLARE @sql VARCHAR(2000)
SET @sql = ’BULK INSERT [’ + @filename + ’] FROM ’ + @file + ’ WITH (FIELDTERMINATOR = ’’,’’, ROWTERMINATOR = ’’\n’’)’
EXEC @sql

如何使用BULK INSERT将CSV或TXT文件导入到SQL Server中

  使用代码

  CSV代表逗号分隔值,有时也被称为逗号分隔的值。而

  如果加载txt文件,然后文件应该有逗号分隔的值。和文件应该是这样

  下面是该脚本以创建表:

  CREATE TABLE Employee(

  Id int,

  Name VARCHAR(100),

  Designation VARCHAR(100)

  )

  我创建的位置“F一个txt和CSV文件:\ \ MyPublis \ \的txt文件名 是TestToInsert.txt

  现在运行以下的脚本来从txt文件中的所有数据加载到数据库表中。如果有任何行中的任何错误将不会被插入,但其他行会被插入。

  我创建Id列在Emloyee表整数,如果在我的文件中的任何行有一个字符串数据的第一部分是指会去Id列那么就不会插入该行,将与下一行continew。

  BULK

  INSERT Employee

  FROM ’F:\\MyPublis\\TestToInsert.txt’ --location with filename

  WITH

  (

  FIELDTERMINATOR = ’,’,

  ROWTERMINATOR = ’\n’

  )

  GO

  现在看到的数据表 – :

  为CSV文件执行相同的脚本。

  具有CSV文件 – :

  10, Siv_CSV, CEO

  11, Brijendra_CSV, Operatore

  12, Micro, Company

  BULK

  INSERT Employee

  FROM ’F:\\MyPublis\\CSVTest.csv’ --location with filename

  WITH

  (

  FIELDTERMINATOR = ’,’,

  ROWTERMINATOR = ’\n’

  )

  GO

  SELECT *FROM Employee

  输出将是 – :

  转载:李新

oracle里 BULK INSERT 怎麼用最好给我个简单在例子

--创建测试表
create table
bulk_objects
tablespace users
as
select object_name, object_type from dba_objects;
--定义模拟批量所需变量
DECLARE
TYPE t_tab IS TABLE OF bulk_objects%ROWTYPE;
objects_tab t_tab := t_tab();
start_time number; end_time number;
BEGIN
SELECT *
BULK COLLECT INTO objects_tab
FROM bulk_objects;
--模拟批量取数插入
Start_time := DBMS_UTILITY.get_time;
FORALL i in objects_tab.first .. objects_tab.last
INSERT INTO bulk_objects VALUES objects_tab(i);
end_time := DBMS_UTILITY.get_time;
DBMS_OUTPUT.PUT_LINE(’Conventional Insert: ’||to_char(end_time-start_time));
COMMIT;
END;
/
--可见开启批量的操作符关键在于:BULK COLLECT,FORALL
--如果是高级语言的话、关键是构造并传递能映射到相应TYPE的table数组到后台。

请教BULK INSERT问题

提示很明显了
Verify that the field terminator and row terminator are specified correctly.
你文件中字段分隔符可能不是tab或者数据有误,拆分数据的时候找不到合适的行和字段。
或者找不到回车(’\n’)的行结束符。检查一下你的文件,使用正确的分隔符标识

bulk insert 和 insert bulk的区别

网上大部分介绍的都是bulk insert , 只能从物理文件中导入, insert bulk要通过编程去导入, 没法直接通过sql实现, c#的SqlBulkCopy就是用这种方法来实现的.

如何在C#中执行 BULK INSERT

SqlConnection con = new SqlConnection(“connString...ip...id...pw......“);
SqlCommand sqlCmd = new SqlCommand();
con.Open();
sqlCmd.Connection = con;
sqlCmd.CommandText = “bulk insert [tableName] from ’C:\xxxxx.ooo’ with (条件.参数);“;
//bulk insert 要很久,这句CommandTimeout=0要加,不然会一直 Timeout!!
sqlCmd.CommandTimeout = 0;
return sqlCmd.ExecuteNonQuery();
就酱就行了~

BULK INSERT 发生大容量插入数据转换错误(类型不匹配),怎么解决

……
显然是因为你的数据日期字段问题
1
改字段属性,为带时间的datatimestamp
2
改sql语句,插入的时候转换成smalldate