求大神分享大数据批量导入校验方案

moondreamyou 2014-02-25 05:36:40
需求:从TXT文件导入到数据库表A。A表数量级1000W,有主键ID,等其他10个字段。每个TXT文件约1000-10000条记录,导入需要校验主键ID重复及其他字段合法性。对于不合法和重复的数据,生成另一个文本Err.TXT供用户下载。

目前遇到的问题:
导入数据的时间很小(1秒内),但校验使用的时间太大(50秒以上),使用内存较多,性能太差。
...全文
789 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
lisandefeng123 2016-01-20
  • 打赏
  • 举报
回复
请问楼主是不是批量数据导入,校验不同的错误数据导入不同的表中????
moondreamyou 2014-08-14
  • 打赏
  • 举报
回复
另外还有种方法就是导入后不同步出结果,改成异步后台慢慢执行,让用户回头再查结果,但需要用户同意该需求变更。
lizhengqin 2014-03-11
  • 打赏
  • 举报
回复
建个临时表,先把数据放到另是表中,在根据自己的业务逻辑处理
hjrui09 2014-03-11
  • 打赏
  • 举报
回复
好贴,顶起,加分
moondreamyou 2014-03-06
  • 打赏
  • 举报
回复
引用 10 楼 liuchaolin 的回复:
还有数据可以都先保存到DataTable中,DataTable设置主键,内存的话要比数据库快得多,就是对于1千W的数据就不好说了
嗯,历史数据多但每次导入的量不大,DataTable设置主键可以把文件自身ID重复的判断工作移到程序,减少了数据库并发,是不错的方法
md5e 2014-03-06
  • 打赏
  • 举报
回复
引用 9 楼 moondreamyou 的回复:
[quote=引用 8 楼 liuchaolin 的回复:] 其它字段的合法与否不敢保证,但找出主键或某个字段数据重复是可以的 表的ID先把主键去掉,然后先不用考虑对与错,都直接导入到表中,最后再去用 row_number() OVER(PARTITION BY 主键或其它字段) as rownum 进行查找rownum>=2的数据为重复数据
目前也是先导入一个Pre表,是用INTERSECT校验系统ID的重复,用group by having count来判断导入数据自身的ID重复,你的方法也是可以的。对于其他字段的校验,我目前也是用数据库脚本批量检查,这是我所能想到的最快方法了,但感觉还不够好。[/quote] 还有数据可以都先保存到DataTable中,DataTable设置主键,内存的话要比数据库快得多,就是对于1千W的数据就不好说了
moondreamyou 2014-03-06
  • 打赏
  • 举报
回复
引用 8 楼 liuchaolin 的回复:
其它字段的合法与否不敢保证,但找出主键或某个字段数据重复是可以的 表的ID先把主键去掉,然后先不用考虑对与错,都直接导入到表中,最后再去用 row_number() OVER(PARTITION BY 主键或其它字段) as rownum 进行查找rownum>=2的数据为重复数据
目前也是先导入一个Pre表,是用INTERSECT校验系统ID的重复,用group by having count来判断导入数据自身的ID重复,你的方法也是可以的。对于其他字段的校验,我目前也是用数据库脚本批量检查,这是我所能想到的最快方法了,但感觉还不够好。
md5e 2014-03-06
  • 打赏
  • 举报
回复
其它字段的合法与否不敢保证,但找出主键或某个字段数据重复是可以的 表的ID先把主键去掉,然后先不用考虑对与错,都直接导入到表中,最后再去用 row_number() OVER(PARTITION BY 主键或其它字段) as rownum 进行查找rownum>=2的数据为重复数据
moondreamyou 2014-03-06
  • 打赏
  • 举报
回复
引用 5 楼 ltcszk 的回复:
主键ID重复及其他字段合法性用数据库里的唯一索引(主键必然是唯一的)和表约束来做 这样你程序只管往数据库里插就好了,完成后接收出错信息,再进行后续操作
参考我对2楼的回复。
moondreamyou 2014-03-06
  • 打赏
  • 举报
回复
引用 2 楼 yyl8781697 的回复:
感觉校验重复ID不用自己去查数据库校验,LZ将可以插的记录都像数据库进行插入,ID如果有重复数据库自己会报错
这种方法不好使,性能很差,另外如果批量插入是无法定位出错ID的行的,把数据存入缓存最终还是要对缓存的数据进行校验,没有增加速度,每次导入的数据都不一样,缓存导入的数据没意义。
引用 4 楼 dotnetstudio 的回复:
先批量导入到数据库的临时表中,临时表的结构和目标表相同,然后分析临时表的数据,如果有问题都能精确到提示哪一行有错。
目前我就是用这种方案,有没有更好的策略?
引用 3 楼 u011636266 的回复:
在新建一个临时表 SqlBulkCopy 大批量导入、瞬秒
SqlBulkCopy只能解决导入问题,而我的问题是要高效校验并精确到行反馈信息给用户进行修改。
小贤820 2014-02-26
  • 打赏
  • 举报
回复
在新建一个临时表 SqlBulkCopy 大批量导入、瞬秒
ltcszk 2014-02-26
  • 打赏
  • 举报
回复
主键ID重复及其他字段合法性用数据库里的唯一索引(主键必然是唯一的)和表约束来做 这样你程序只管往数据库里插就好了,完成后接收出错信息,再进行后续操作
KeepSayingNo 2014-02-26
  • 打赏
  • 举报
回复
先批量导入到数据库的临时表中,临时表的结构和目标表相同,然后分析临时表的数据,如果有问题都能精确到提示哪一行有错。
yyl8781697 2014-02-25
  • 打赏
  • 举报
回复
感觉校验重复ID不用自己去查数据库校验,LZ将可以插的记录都像数据库进行插入,ID如果有重复数据库自己会报错 还有另一块就是校验的合法性 可能要看具体情况,比如有些数据由范围限制,就那么几个量的话 LZ可以把合法的数据存入缓存,以后针对该数据的校验直接判断缓存就好了
moondreamyou 2014-02-25
  • 打赏
  • 举报
回复 1
补充:如何解决校验的性能问题?

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧