一尘不染

在SQL Server 2008中插入/更新大量数据的最佳实践

sql

我正在建立一个通过各种CSV提要更新大量数据的系统。通常,我只会遍历提要中的每一行,进行选择查询以检查该项目是否已经存在,并根据是否存在来插入/更新该项目。

我觉得这种方法扩展性不强,可能会在较大的提要上重击服务器。我的解决方案是像往常一样遍历所有项目,但将它们存储在内存中。然后,对于每100个左右的项目,对这100个项目进行选择,并获取数据库中匹配的现有项目的列表。然后将插入/更新语句连接在一起,然后将它们运行到数据库中。从本质上讲,这将减少到数据库的行程。

这是否具有足够的可扩展性,是否有将大型Feed导入生产环境的示例教程?

谢谢


阅读 166

收藏
2021-03-10

共1个答案

一尘不染

看到您使用的是SQL Server 2008,我建议使用以下方法:

  • 首先将您的CSV文件批量复制到登台表中
  • 使用MERGE命令从该登台表更新目标表

查阅MSDN文档和有关如何使用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中一个非常强大且非常有用的新命令-如果可以的话,请使用它!

2021-03-10