2.数据加载
SQL Server的大容量文本数据文件导入主要有2种方式,第一种在操作系统下,用bcp命令导入,这个命令的优点是支持各种文件格式,功能强大,缺点是比较复杂。第二种是在SQL Server交互界面中用Bulk insert语句导入,这个语句的语法简单,但支持的文件种类不如bcp多。两种方式都可以有效地减少日志的产生,达到高速导入的目的。
下面分别举例说明这2种方式的导入。
第1种,bulk insert 导入语句的语法结构是:





Tpc-h的数据文件的列分隔符是竖线,包括最后一个数据列,行分隔符是回车换行,在Windows操作系统中用'\n'表示,因此,我们用下面的语句:











10万行的导入时间大约是1.3秒。
第2种,bcp命令的命令行格式是:













对于我们的数据,如果像bulk insert命令一样只限制分隔符,bcp认为信息不够,需要人工确认每一列的格式,我们如果采用默认值是无法导入成功的。






























这是因为,bcp命令如果没有指定-c参数,那么把外部数据文件视为二进制格式,这样int类型是4个字节,date类型是7个字节等。这时即使把前缀长度统统改为0,虽然能够导入,数据也不正确。比如,外部文件中的0,导入数据库中就变成了48,刚好是字符'0'的ASCII码。要正确导入,我们需要手工修改刚才产生的fmt文件,将所有列都改为SQL_CHAR类型,如下文本所示。再用-f指定格式文件就可以了。而使用-c参数,就没有这么麻烦,只要指定分隔符即可。推荐使用-c方式导入。





































我们看到使用系统默认的数组大小,bcp导入的速度比bulk insert 要慢一些,10万行的导入时间大约是2.5秒,但是指定一个较大的数组尺寸比如32K,导入速度就比bulk insert快了,10万行只要843毫秒。其他报表的导入情况类似。-b参数可以限制每批提交的行数,避免提交太频繁影响性能。
8个表bcp导入的时间分别是13秒、685秒、129秒、67秒、19秒、1秒、0秒、0秒,总时间914秒。
SQL Server 允许多个客户端“并行地大容量导入数据”到单个无索引的表中。这样可以提高大容量导入操作的性能。但必须要求存在多个外部文件,再人工地发起多个不同的命令,无法在单独一个命令中使用单独一个外部文件并行导入。