我正在建立一个通过各种CSV供稿更新大量数据的系统.通常情况下,我会循环访问Feed中的每一行,执行select查询以检查项目是否已存在,并根据项目是否存在插入/更新项目.
我觉得这种方法不是很可扩展,并且可以将服务器敲击更大的馈送.我的解决方案是正常地循环显示项目,但将其存储在内存中.然后,对于每100个左右的项目,对这100个项目进行选择,并获取匹配的数据库中现有项目的列表.然后将insert / update语句连接在一起并将它们运行到数据库中.这将大大减少数据库的访问次数.
这是一个可扩展的足够的解决方案,有没有关于将大型Feed导入生产环境的示例教程?
谢谢
解决方法
看到你正在使用sql Server 2008,我会推荐这种方法:
>首先将CSV文件批量拷贝到登台表中
>使用MERGE命令从该登台表更新您的目标表
查看MSDN docs和great blog post如何使用MERGE命令.
基本上,您可以根据常用条件(例如常用主键)在实际数据表和登台表之间创建一个链接,然后您可以定义何时执行
行匹配,例如该行存在于源表和目标表中 – >通常你会更新一些字段,或者一起忽略它们
>源中的行不存在于目标 – >通常是INSERT的情况
你会有一个这样的MERGE语句:
MERGE TargetTable AS t USING SourceTable AS src ON t.PrimaryKey = src.PrimaryKey WHEN NOT MATCHED THEN INSERT (list OF fields) VALUES (list OF values) WHEN MATCHED THEN UPDATE SET (list OF SET statements) ;
当然,如果需要,ON子句可以更多地涉及.当然,你的WHEN语句也可能更复杂,例如
WHEN MATCHED AND (some other condition) THEN ......
等等.
MERGE是sql Server 2008中非常强大和非常有用的新命令 – 使用它,如果可以的话!