设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 3088|回复: 1
打印 上一主题 下一主题

【原创】bulk insert 关于FirstRow作用不可靠的问题

[复制链接]
跳转到指定楼层
1#
发表于 2014-2-26 08:58:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
代码:  
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   
能调整字段的对应

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
2#
 楼主| 发表于 2014-2-28 08:58:11 | 只看该作者
如此可以下定论了,充分测试了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   
能调整字段的对应

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-5-3 06:24 , Processed in 0.091006 second(s), 25 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表