当前位置: 首页 > 面试题库 >

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

章茂
2023-03-14
问题内容

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

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

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

谢谢


问题答案:

看到您使用的是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中一个非常强大且非常有用的新命令-如果可以的话,请使用它!



 类似资料:
  • 我正在开发Spring Boot Rest应用程序。ORMHibernate。我在DB中有更新相关实体的endpoint,例如,我有表“form”和表“rows”,每一行都附加到表单,所以一个表单可以包含表“rows”中的多行,每一行都有指向“form”的链接。 用例:我们正在获取要保存的行列表 其中一些新so is不包含ID 最好的方法是手动处理所有这些情况吗?或者是否有任何ORM/Spring

  • 我有一个laravel命令,它搜索SQL Server数据库中的数据,并在MySQL数据库中插入每一行(如果已经存在,则更新)。 这是当前工作的代码: 首先,从SQL服务器搜索行: 然后插入和/或更新: 标签表定义如下: 对于每个块,填充数组和(给定每个块的行数,大约总共50秒)需要1/2秒,插入数据需要半秒 问题: 是否有更快的方法来填充数组? 由于客户端的限制,我们不能修改MySQL数据库中的

  • 问题内容: 我正在开发一个J2ME应用程序,该应用程序具有要存储在设备上的大量数据(大约1MB,但是可变)。我不能依靠文件系统,所以我卡住了记录管理系统(RMS),该系统允许多个记录存储,但每个记录存储空间都有限。我最初的目标平台Blackberry将每个限制为64KB。 我想知道是否还有其他人必须解决在RMS中存储大量数据的问题,以及他们如何进行管理?我正在考虑必须计算记录大小并在多个存储区中拆

  • 问题内容: 我正在构建一个Web应用程序(使用原型),该应用程序需要在DOM中添加大块HTML。其中大多数是包含具有各种属性方式的元素的行。 目前,我在变量中保留HTML的空白行, 现在一切正常,花花公子,但这是最佳做法吗? 当我更新页面上的代码时,我必须更新blankRow中的代码,因此要插入的新元素相同。当我有40行HTML放入blankRow中时,它变得很烂,然后我也必须对其进行转义。 有更

  • 我知道“newInstance”-Pattern(实例化新Android片段的最佳实践)。但是如果另一个片段更改数据,我如何更新片段的这些参数? 我知道片段/活动之间的回调方法,但这些回调不会更新参数?! 例如:在创建片段时,我将URI与包一起传递给它。然后,另一个片段通过对第一个片段的changeUri(URI-URI)方法回调来更改这个URI。如果然后重新创建片段(例如由于屏幕旋转),它将使用

  • 目前,我的应用程序的某些部分在将大量数据加载到报告表时遇到了速度问题。报告表中的数据是从多个表中提取的,并运行一些复杂的查询,但这是必需的。 除了优化代码,我的问题是,您个人如何处理需要向用户显示的大量数据,最佳实践是什么? 目前我正在处理所有的数据,然后通过javascript库生成数据表。 我知道的事情: 用户不需要一次看到所有数据 用户需要能够搜索所有数据 用户需要能够过滤数据 最好的方法真