Office中国论坛/Access中国论坛

标题: 【原创】bulk insert 关于FirstRow作用不可靠的问题 [打印本页]

作者: faunus    时间: 2014-2-26 08:58
标题: 【原创】bulk insert 关于FirstRow作用不可靠的问题
代码:  
BULK  INSERT  inssum
FROM  'logFile',  
WITH  (  
      CODEPAGE  =  'RAW',  
      FIRSTROW  =  2,  
      LASTROW    =  4,  
      MAXERRORS  =  2,  
      DataFileType='char',  
      FieldTerminator='|',  
      RowTerminator='|/r/n',  
      BATCHSIZE=  1,  
      TABLOCK  
      )  

  数据(1):
  H|515800Rcords|  
  B|000000001|001|90101000|1|162926.81|0.00|0|0|0|  
  B|000000002|001|90101000|1|162926.81|0.00|0|0|0|  
  B|000000003|001|90102000|1|18200.00|0.00|0|0|0|  
  B|000000004|001|90201000|1|0.00|0.00|0|0|0|  
  B|000000005|001|90101000|1|162926.81|0.00|0|0|0|  
  ....

  入库数据(1)  
  B  000000002  ...  
  B  000000003  ...  
  B  000000004  ...  

  入库数据(希望得到的结果)  
  B  000000001  ...  
  B  000000002  ...  
  B  000000003  ...  

如果不打算忽略掉首行, 有没有很好的办法,包括先对源文件进行预处理,但要求效率很高,
因为记录数量是千万级的。





1)bulk insert导入大文件,受到内存的限制,
测试足够的不同大小的文件,
一直读到内存不够,
加上内存又可以继续,
而其间,除个加时点CPU很高,
大部分情况下,cpu并不高,
而内存是不断平稳上升。

2)读入“行”、“列”的机制:(也是针对本问题最重要的一点)
涉及:FieldTerminator,RowTerminator,目标表的记录数!!
把Field、Row看成同一种情况,
而把“行”看成一种普通的分隔,问题就非常容易理解了,
bulk insert的机制是先“极大满足当前”的“行”或“字段”,
而且是遂个地按照顺序地进行分解:
FieldTerminator,FieldTerminator,共n个...,RowTerminator
周而复始。
推荐一个测试方法,把目标表的最后一个字段定义为超长,
然后缩减某些行的字段数,可以发现,总是会影响到二行(或多行并一行)。
结论是:
当列数大于目标表字段数,剩于字段并入最后字段(如最后字段不够在会出错)
当列数等于目标表字段数,正常
当列数小于目标表字段数,最近几行字段数加总正好小于目标表字段数的行并为同一行。

3)OPENROWSET的作用:
解决临时性一次读入非本地数据来源。

4)FORMATFILE   
能调整字段的对应


作者: faunus    时间: 2014-2-28 08:58
如此可以下定论了,充分测试了bulk insert得到以下一些结果:

1)首先回答一下yueyeli 的问题:
sql2000对表的行数同样不会有限制,
超过一定行数不行是其它各种制约因素造成的,
我几首只用过2005,
目前单表有3.8亿条记录,
没有问题。

2)bulk insert导入大文件,受到内存的限制,
测试足够的不同大小的文件,
一直读到内存不够,
加上内存又可以继续,
而其间,除个加时点CPU很高,
大部分情况下,cpu并不高,
而内存是不断平稳上升。

3)读入“行”、“列”的机制:(也是针对本问题最重要的一点)
涉及:FieldTerminator,RowTerminator,目标表的记录数!!
把Field、Row看成同一种情况,
而把“行”看成一种普通的分隔,问题就非常容易理解了,
bulk insert的机制是先“极大满足当前”的“行”或“字段”,
而且是遂个地按照顺序地进行分解:
FieldTerminator,FieldTerminator,共n个...,RowTerminator
周而复始。
推荐一个测试方法,把目标表的最后一个字段定义为超长,
然后缩减某些行的字段数,可以发现,总是会影响到二行(或多行并一行)。
结论是:
当列数大于目标表字段数,剩于字段并入最后字段(如最后字段不够在会出错)
当列数等于目标表字段数,正常
当列数小于目标表字段数,最近几行字段数加总正好小于目标表字段数的行并为同一行。

4)OPENROWSET的作用:
解决临时性一次读入非本地数据来源。

5)FORMATFILE   
能调整字段的对应






欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3