【问题标题】:update sql server rows, while reading the same table更新 sql server 行,同时读取同一个表
【发布时间】:2014-10-19 23:23:11
【问题描述】:

我在 SQL Server 2012 中有一个数据库,想更新其中的一个表。

我的表有三列,第一列的类型是nchar(24)。它充满了数十亿行。另外两列来自同一类型,但此时它们为null(空)。

我需要从第一列读取数据,并根据这些信息进行一些计算。我计算的结果是两个字符串,这两个字符串就是我要插入两个空列的数据。

我的问题是从表的第一列读取信息并更新第二列和第三列的最快方法是什么。

逐步阅读和更新?读取几行,进行计算,在读取接下来的几行时更新行?

对于数十亿行,性能是这里唯一重要的事情。

如果您需要更多信息,请告诉我!

编辑 1: 我的计算不能用 SQL 表达。 由于 SQL 服务器在本地计算机上,因此我们不必担心吞吐量。一次计算大约需要 0.02154 秒,我总共有 2.809.475.760 行,这大约是 280 GB 的数据。

【问题讨论】:

  • 计算可以用SQL表达吗?如果是这种情况,您只需要一个 UPDATE 语句。 UPDATE MyTable SET Col2 = substring(Col1,1,12), Col3 = substring(Col1,12,12) 之类的东西(我以 substring 为例)。
  • 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
  • 单条SQL最快。
  • 计算不能用SQL表示。
  • 因为这是一次性的事情......无论您在哪里进行计算,都包括所有三列并将数据转储到 .CSV 导出中。然后 TRUNCATE 现有表并使用 SSIS 将 .CSV 导入表中。

标签: c# sql sql-server performance stored-procedures


【解决方案1】:

这里没有简单的方法和一刀切的解决方案。

如果有数十亿行,性能是否重要?在我看来,它必须在一秒钟内完成。

数据库和网络的预期吞吐量是多少。如果您在 POTS 拨入链路后面,则在 10Gb 光纤上情况会大不相同。

计算?它们有多贵?只需 c=a+b 或大量处理其他文本文件。

只是提出了几个问题作为回应。因此,还有很多我们不知道要正确回答的问题。

尝试几件事并衡量它。

作为一般规则:可以通过批处理而不是单个更新来改进对数据库的写入。

使用异步模式可以腾出一些时间用于计算而不是等待。

编辑回复评论 如果计算需要 20ms 最大的问题是 IO。多线程不会给你带来太多。 使用快照隔离按顺序读取记录,不受写锁和批量更新的阻碍。我的猜测是,读者领先于作者没有太多麻烦,批量阅读增加了复杂性,却没有太多收获。

通过试验找到合适的批量大小。

【讨论】:

  • 由于SQL服务器在本地机器上,所以我们不必担心吞吐量。我的计算是非常繁重的处理,事实上它必须完成十亿次。一次计算大约需要 0.02 秒。
【解决方案2】:

根据我的经验,Linq 非常有效。我不会太担心优化你的代码。事实上,通常你应该避免过早地优化你的代码,首先让它工作,然后根据需要进行重构。附带说明一下,我曾经针对 Linq 查询测试了一个存储过程,Linq 赢了(令我惊讶)

【讨论】:

    【解决方案3】:

    通常,DML 最好以较大的批次执行。根据您的索引结构,小批量大小(可能 1000?!)已经可以提供最佳结果,或者您可能需要更大的批量大小(直到您在一个语句中写入表的所有行)。

    Bulk updates 可以通过批量插入有关您要进行的更新的信息来执行,然后在一个语句中更新批处理中的所有行。存在替代策略。

    由于您不能同时在内存中保存所有要更新的行,您可能需要研究 MARS 以便能够在偶尔写入的同时执行流式读取。或者,您可以通过两个连接来完成。注意不要在连接之间发生死锁。 SQL Server 原则上无法检测到这一点。只有超时才能解决这种(分布式)死锁。让读者在快照隔离下运行是一个很好的策略。快照隔离导致 reader 不阻塞或被阻塞。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-03
      • 1970-01-01
      • 1970-01-01
      • 2020-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多