SQL大数据量导入效率的问题,请教!

时间:2021-03-29 08:12:25
SET @sqlstring = 'BULK INSERT TB_RADIUS FROM ''D:\Wwwroot\wwwroot\tmp\1.txt'' WITH (FIELDTERMINATOR = ''~'', FIRSTROW=2, ROWTERMINATOR = '''+CHAR(10)+''')'
  EXECUTE(@sqlstring)
 
请教
 
1 使用以上语句,34W的记录, 第一次导入27秒,第二次21秒,是否正常。
 
2 有没有更快的语句?
 
3 使用BULK INSERT 指定XML的格式,与不指定效率上有什么区别
 
4 使用BULK INSERT 如果导入字段与库目标字段不一致,是否有办法?
 
谢谢了

6 个解决方案

#1


1.也跟你要导数据的目标有关。
2.bulk insert传说是最快的了。
3.没测试过
4.格式化文件可以解决,联机丛书有很详细的例子。

#2


如何使用BCP导出格式文件 

BCP不仅可以根据表、视图导入导出数据,还可以配合格式文件对导入导出数据进行限制。格式文件以纯文本文件形式存在,分为一般格式和xml格式。用户可以手工编写格式文件,也可以通过BCP命令根据表、视图自动生成格式文件。 

EXEC master..xp_cmdshell 'BCP AdventureWorks.sales.currency format nul -f c:\currency_format1.fmt -c -T' 

上述命令将currency表的结构生成了一个格式文件currency_format1.fmt,下面是这个格式文件的内容。 

9.0 

1 SQLCHAR 0 6 "\t" 1 CurrencyCode SQL_Latin1_General_CP1_CI_AS 
2 SQLCHAR 0 100 "\t" 2 Name SQL_Latin1_General_CP1_CI_AS 
3 SQLCHAR 0 24 "\r\n" 3 ModifiedDate  

这个格式文件记录了这个表的字段(共3个字段)类型、长度、字符和行分割符和字段名等信息。 

BCP还可以通过-x选项生成xml格式的格式文件。 

EXEC master..xp_cmdshell 'BCP AdventureWorks.sales.currency format nul -f c:\currency_format2.fmt -x -c -T'  
xml格式文件所描述的内容和普通格式文件所描述的内容完全一样,只是格式不同。 

4. 如何使用BCP导入数据 

BCP可以通过in命令将上面所导出的currency1.txt和currency2.txt再重新导入到数据库中,由于currency有主键,因此我们将复制一个和currency的结构完全一样的表。 

SELECT TOP 0 * INTO AdventureWorks.sales.currency1 FROM AdventureWorks.sales.currency  
将数据导入到currency1表中 

EXEC master..xp_cmdshell 'BCP AdventureWorks.sales.currency1 in c:\currency1.txt -c -T'  
导入数据也同样可以使用-F和-L选项来选择导入数据的记录行。 

EXEC master..xp_cmdshell 'BCP AdventureWorks.sales.currency1 in c:\currency1.txt -c -F 10 -L 13 -T'  
在导入数据时可以根据已经存在的格式文件将满足条件的记录导入到数据库中,不满足则不导入。如上述的格式文件中的第三个字段的字符长度是24,如果某个文本文件中的相应字段的长度超过24,则这条记录将不被导入到数据库中,其它满足条件的记录正常导入。 

使用普通的格式文件 

EXEC master..xp_cmdshell 'BCP AdventureWorks.sales.currency1 in c:\currency1.txt -F 10 -L 13 -c -f c:\currency_format1.fmt -T'  
使用xml格式的格式文件 

EXEC master..xp_cmdshell 'BCP AdventureWorks.sales.currency1 in c:\currency1.txt -F 10 -L 13 -c -x -f c:\currency_format2.fmt -T'  

#3


如果要处理问题4,可以用SSIS进行处理。

#4


1.与你的行大小有关
2.msdn没有找到更快的电话
3.指定xml两个作用:1.格式化文件,2.数据源文件,效率就不清楚,这是DB引擎做的事情,要测试才知道。
4.格式化文件,但是在工作中个偏好使用ssis工具来实现,方便快速。

#5


学习BCP的用法

#6


版主可以推荐下,学习了

#1


1.也跟你要导数据的目标有关。
2.bulk insert传说是最快的了。
3.没测试过
4.格式化文件可以解决,联机丛书有很详细的例子。

#2


如何使用BCP导出格式文件 

BCP不仅可以根据表、视图导入导出数据,还可以配合格式文件对导入导出数据进行限制。格式文件以纯文本文件形式存在,分为一般格式和xml格式。用户可以手工编写格式文件,也可以通过BCP命令根据表、视图自动生成格式文件。 

EXEC master..xp_cmdshell 'BCP AdventureWorks.sales.currency format nul -f c:\currency_format1.fmt -c -T' 

上述命令将currency表的结构生成了一个格式文件currency_format1.fmt,下面是这个格式文件的内容。 

9.0 

1 SQLCHAR 0 6 "\t" 1 CurrencyCode SQL_Latin1_General_CP1_CI_AS 
2 SQLCHAR 0 100 "\t" 2 Name SQL_Latin1_General_CP1_CI_AS 
3 SQLCHAR 0 24 "\r\n" 3 ModifiedDate  

这个格式文件记录了这个表的字段(共3个字段)类型、长度、字符和行分割符和字段名等信息。 

BCP还可以通过-x选项生成xml格式的格式文件。 

EXEC master..xp_cmdshell 'BCP AdventureWorks.sales.currency format nul -f c:\currency_format2.fmt -x -c -T'  
xml格式文件所描述的内容和普通格式文件所描述的内容完全一样,只是格式不同。 

4. 如何使用BCP导入数据 

BCP可以通过in命令将上面所导出的currency1.txt和currency2.txt再重新导入到数据库中,由于currency有主键,因此我们将复制一个和currency的结构完全一样的表。 

SELECT TOP 0 * INTO AdventureWorks.sales.currency1 FROM AdventureWorks.sales.currency  
将数据导入到currency1表中 

EXEC master..xp_cmdshell 'BCP AdventureWorks.sales.currency1 in c:\currency1.txt -c -T'  
导入数据也同样可以使用-F和-L选项来选择导入数据的记录行。 

EXEC master..xp_cmdshell 'BCP AdventureWorks.sales.currency1 in c:\currency1.txt -c -F 10 -L 13 -T'  
在导入数据时可以根据已经存在的格式文件将满足条件的记录导入到数据库中,不满足则不导入。如上述的格式文件中的第三个字段的字符长度是24,如果某个文本文件中的相应字段的长度超过24,则这条记录将不被导入到数据库中,其它满足条件的记录正常导入。 

使用普通的格式文件 

EXEC master..xp_cmdshell 'BCP AdventureWorks.sales.currency1 in c:\currency1.txt -F 10 -L 13 -c -f c:\currency_format1.fmt -T'  
使用xml格式的格式文件 

EXEC master..xp_cmdshell 'BCP AdventureWorks.sales.currency1 in c:\currency1.txt -F 10 -L 13 -c -x -f c:\currency_format2.fmt -T'  

#3


如果要处理问题4,可以用SSIS进行处理。

#4


1.与你的行大小有关
2.msdn没有找到更快的电话
3.指定xml两个作用:1.格式化文件,2.数据源文件,效率就不清楚,这是DB引擎做的事情,要测试才知道。
4.格式化文件,但是在工作中个偏好使用ssis工具来实现,方便快速。

#5


学习BCP的用法

#6


版主可以推荐下,学习了