如何提高对SQLServer的插入速度(一)

2014-11-24 09:48:57 · 作者: · 浏览: 0

向SQL Server中插入数据,常用的办法是由应用程序直接(或间接)使用Insert的SQL语句进行插入,但这种办法速度太慢,经测试其速度最快(当原始表为空表时)也仅仅是1000条左右。为了提高插入速度,想了许多其它办法(不包括提升计算机等硬件配置的方法),但效果都不太理想,与期望速度相差太多。
想到SQLServer的导入导出工具,发现使用这个工具导入数据的速度非常快,就想能不能了解一下这个工具的原理或者利用它类似的方法来导入数据呢?经查资料,发现SQL中也有类似的语句,那就是Bulk Insert。
Bulk Insert最主要的属性就是FIELDTERMINATOR和ROWTERMINATOR,这两个属性用于决定待导入文件中列的分隔符和行的分隔符。 www.2cto.com
经测试,发现使用Bulk Insert的速度比使用Insert语句快多了,向表中插入60000条记录也就是一秒不到的时间。
在SQL Server的帮助中,对此命令的解释如下:
以用户指定的格式复制一个数据文件至 数据库表或视图中。
语法
BULK INSERT [ [ 'database_name'.][ 'owner' ].]{ 'table_name' FROM 'data_file' }
[ WITH
(
[ BATCHSIZE [ = batch_size ] ]
[ [ , ] CHECK_CONSTRAINTS ]
[ [ , ] CODEPAGE [ = 'ACP' | 'OEM' | 'RAW' | 'code_page' ] ]
[ [ , ] DATAFILETYPE [ =
{ 'char' | 'native'| 'widechar' | 'widenative' } ] ]
[ [ , ] FIELDTERMINATOR [ = 'field_terminator' ] ]
[ [ , ] FIRSTROW [ = first_row ] ]
[ [ , ] FIRE_TRIGGERS ]
[ [ , ] FORMATFILE = 'format_file_path' ]
[ [ , ] KEEPIDENTITY ]
[ [ , ] KEEPNULLS ]
[ [ , ] KILOBYTES_PER_BATCH [ = kilobytes_per_batch ] ]
[ [ , ] LASTROW [ = last_row ] ]
[ [ , ] MAXERRORS [ = max_errors ] ]
[ [ , ] ORDER ( { column [ ASC | DESC ] } [ ,...n ] ) ]
[ [ , ] ROWS_PER_BATCH [ = rows_per_batch ] ]
[ [ , ] ROWTERMINATOR [ = 'row_terminator' ] ]
[ , [ TABLOCK ] ]
)
]
参数
'database_name'
是包含指定表或视图的数据库的名称。如果未指定,则 系统默认为当前数据库。
'owner'
是表或视图所有者的名称。当执行大容量复制操作的用户拥有指定的表或视图时,owner 是可选项。如果没有指定 owner 并且执行大容量复制操作的用户不拥有指定的表或视图,则 Microsoft SQL Server 将返回错误信息并取消大容量复制操作。 www.2cto.com
'table_name'
是大容量复制数据于其中的表或视图的名称。只能使用那些所有的列引用相同基表所在的视图。
'data_file'
是数据文件的完整路径,该数据文件包含要复制到指定表或视图的数据。BULK INSERT 从磁盘复制数据(包括网络、软盘、硬盘等)。
data_file 必须从运行 SQL Server 的服务器指定有效路径。如果 data_file 是远程文件,则请指定通用命名规则 (UNC) 名称。
BATCHSIZE [ = batch_size ]
指定批处理中的行数。每个批处理作为一个事务复制至服务器。SQL Server提交或回滚(在失败时)每个批处理的事务。默认情况下,指定数据文件中的所有数据是一个批处理。
CHECK_CONSTRAINTS
指定在大容量复制操作中检查 table_name 的任何约束。默认情况下,将会忽略约束。
CODEPAGE [ = 'ACP' | 'OEM' | 'RAW' | 'code_page' ]
指定该数据文件中数据的代码页。仅当数据含有字符值大于 127 或小于 32 的 char、varchar 或 text 列时,CODEPAGE 才是适用的。
CODEPAGE 值 描述
ACP char、varchar 或 text 数据类型的列从 ANSI/Microsoft Windows 代码页 ISO 1252 转换为 SQL Server 代码页。
OEM(默认值) char、varchar 或 text 数据类型的列被从系统 OEM 代码页转换为 SQL Server 代码页。
RAW 并不进行从一个代码页到另一个代码页的转换;这是最快的选项。
code_page 特定的代码页号码,例如 850。 www.2cto.com
DATAFILETYPE [ = {'char' | 'native' | 'widechar' | 'widenative' } ]
指定 BULK INSERT 使用指定的默认值执行复制操作。
DATAFILETYPE 值 描述
char(默认值) 从含有字符数据的数据文件执行大容量复制操作。
native 使用 native(数据库)数据类型执行大容量复制操作。要装载的数据文件由大容量复制数据创建,该复制是用 bcp 实用工具从 SQL Server 进行的。
widechar 从含有 Unicode 字符的数据文件中执行大容量复制操作。
widenative 执行与 native 相同的大容量复制操作,不同之处是 char、varchar 和 text 列在数据文件中存储为 Unicode。要装载的数据文件由大容量复制数据创建,该复制是用 bcp 实用工具从 SQL Server 进行的。该选项是对 widechar 选项的一个更高性能的替代,并且它用于使用数据文件从一个运行 SQL Server 的计算机向另一个计算机传送数据。当传送含有 ANSI 扩展字符的数据时,使用该选项以便利用 native 模式的性能。
FIELDTERMINATOR [ = 'field_terminator' ]
指定用于 char 和 widechar 数据文件的字段终止符。默认的字段终止符是 \t(制表符)。
FIRSTROW [ = first_row ]
指定要复制的第一行的行号。默认值是 1,表示在指定数据文件的第一行。
FIRE_TRIGGERS
指定目的表中定义的任何