【问题标题】:How to efficiently perform SQL Server database updates from my C# application如何从我的 C# 应用程序有效地执行 SQL Server 数据库更新
【发布时间】:2012-02-14 03:22:12
【问题描述】:

我正在尝试找出设计我的 C# 应用程序的最佳方法,该应用程序利用来自 SQL Server 后端的数据。

我的应用程序必须定期从我的应用程序的循环中一次更新 55K 行。在进行更新之前,它需要检查要更新的记录是否存在。

如果存在,它会更新一个字段。 如果不是,它将执行 4 个字段的插入。

要更新的表有 600K 行。

  1. 从我的应用程序处理这些更新/插入的最有效方法是什么?
  2. 我应该在 C# 中创建一个数据字典并加载 600K 记录并首先查询字典而不是数据库吗?
  3. 这是一种更快的方法吗?
  4. 我应该使用存储过程吗?
  5. 根据这种情况,实现最佳性能的最佳方法是什么?

【问题讨论】:

  • 此 upsert 是否是由于某些用户交互而发生的?如果是这样,可能值得看看业务规则是否允许由于在非工作时间将流程作为某些计划服务的一部分运行而引入一些延迟。无论哪种方式,如果存在瓶颈,您仍然希望优化性能。
  • 最近提出的问题,见这里:stackoverflow.com/questions/8981451/…

标签: c# sql


【解决方案1】:

您可以使用SqlBulkCopy 上传到临时表,然后让 SQL Server 作业进行合并。

【讨论】:

    【解决方案2】:

    您应该尽量避免“从一个循环中一次更新 55K 行”。那会很慢。

    相反,尝试找到一种方法来批量更新(一次 n 次)。将SQL Server table value parameters 作为一种将一组数据发送到存储过程的方法。

    这是一篇关于使用 TVP 更新多行的文章:http://www.sqlmag.com/article/sql-server-2008/using-table-valued-parameters-to-update-multiple-rows

    【讨论】:

      【解决方案3】:

      如果你这样做了呢?

      通过某种方式,将那 55,000 行数据放入数据库;如果他们不在那里。 (如果您现在从某个查询中获取这些行,请安排将查询结果存储在该数据库的临时表中。(这可能是 存储过程的适当应用程序。 )

      现在,您可以将需要执行的操作表达为两个单独的 SQL 查询:一个执行更新,一个或多个其他执行插入。第一个查询可能使用诸如“WHERE FOO IN (SELECT BAR FROM @TEMP_TABLE ...)”之类的子句来标识要更新的行。其他人可能会使用“WHERE FOO NOT IN (...)”

      确切地说,正是我会期望需要使用存储过程来做的事情,因为,如果你考虑一下,“SQL 服务器本身”准确地是做这项工作的合适人选,因为他是周围唯一一个已经拥有你想要的数据的人操纵。他一个人不必在任何地方“传输”这 55,000 行。完美。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-03
        • 1970-01-01
        • 2020-03-12
        相关资源
        最近更新 更多