更新sql server行,同时读取同一个表

时间:2014-08-26 15:03:18

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

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

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

我需要从第一列读取数据,这些信息我做了一些计算。我计算的结果是两个字符串,这两个字符串是我想要插入两个空列的数据。

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

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

当涉及到数十亿行时,性能是这里唯一重要的事情。

如果您需要更多信息,请与我们联系!

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

3 个答案:

答案 0 :(得分:0)

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

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

由于您无法同时在内存中保存所有行,因此您可能需要查看MARS,以便在偶尔同时写入时执行流式读取。或者,您可以通过两个连接来完成。小心不要在连接上死锁。 SQL Server无法原则上检测到它。只有超时才能解决这种(分布式)死锁。让读者在快照隔离下运行是一个很好的策略。快照隔离会导致阅读器无法阻止或被阻止。

答案 1 :(得分:0)

没有简单的方法和一个解决方案适合所有人。

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

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

计算?他们有多贵?只是c = a + b或其他文本文件的繁重处理。

回答中提出了几个问题。因此,还有更多参与,我们不知道正确回答。

尝试一些事情并进行衡量。

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

使用异步模式可以释放一些时间进行计算而不是等待。

编辑回复评论 如果计算需要20ms,最大的问题是IO。多线程不会带给你很多。 使用快照隔离按顺序读取记录,这样就不会受到写锁定和批量更新的影响。我的猜测是,读者在没有太多麻烦的情况下始终领先于作者,批量阅读会增加复杂性而不会增加太多。

通过试验找到合适批次的最佳位置。

答案 2 :(得分:0)

根据我的经验,Linq非常有效率。我还不太担心优化你的代码。事实上,您应该避免的是过早优化代码,只需先让它工作然后根据需要进行重构。作为附注,我曾经针对Linq查询测试了存储过程,Linq赢了(令我惊讶)