更新sqlserver行,同时读取同一个表
本文关键字:读取 同一个 sqlserver 更新 | 更新日期: 2023-09-27 18:19:38
我在SQL Server 2012中有一个数据库,希望更新其中的一个表。
我的表有三列,第一列的类型为nchar(24)
。它充满了数十亿行。其他两列来自同一类型,但此时它们是null
(空)。
我需要读取第一列的数据,利用这些信息我进行了一些计算。我的计算结果是两个字符串,这两个字符串是我想插入到两个空列中的数据。
我的问题是,从表的第一列读取信息并更新第二列和第三列的最快方法是什么。
阅读并逐步更新?读取几行,进行计算,在读取接下来的几行时更新行?
当涉及到数十亿行时,性能是这里唯一重要的东西。
如果您需要更多信息,请告诉我!
第1版:我的计算无法用SQL表示。由于SQL服务器在本地机器上,througput不需要我们担心。一次计算大约需要0.02154秒,我总共有2.809.475.760行,这大约是280 GB的数据。
通常,DML最好在较大的批次中执行。根据您的索引结构,小批量(可能是1000?!)已经可以提供最佳结果,或者您可能需要更大的批量(直到您在一条语句中写入表的所有行)。
可以通过大容量插入有关要进行的更新的信息,然后在一条语句中更新批处理中的所有行来执行大容量更新。存在替代策略。
由于您不能同时在内存中保存所有要更新的行,因此您可能需要研究MARS,以便能够在偶尔进行写入的同时执行流读取。或者,你可以通过两个连接来完成。注意不要在连接之间发生死锁。SQL Server原则上无法检测到这一点。只有超时才能解决这种(分布式)死锁。让阅读器在快照隔离下运行是一个很好的策略。快照隔离导致读卡器不被阻止或被阻止。
Linq非常高效。我还不太担心优化您的代码。事实上,通常应该避免的是过早地优化代码,只需先让它工作,然后根据需要进行重构。顺便说一句,我曾经针对Linq查询测试过一个存储过程,Linq赢得了(令我惊讶的)
这里没有简单的方法和一个适合所有人的解决方案。
如果有几十亿行,那么性能重要吗?在我看来,这不一定要在一秒钟内完成。
数据库和网络的预期吞吐量是多少。如果你在POTS拨号链路后面,在10Gb光纤上的情况会大不相同。
计算?它们有多贵?只需c=a+b或对其他文本文件进行大量处理。
只是回答了几个问题。因此,我们没有意识到要正确回答还有很多问题。
尝试几件事并进行测量。
一般来说:对数据库的写入可以通过批处理而不是单个更新来改进。
使用异步模式可以腾出一些时间进行计算,而不是等待。
编辑以回复评论如果计算需要20ms,最大的问题是IO。多线程不会给你带来太多。使用快照隔离按顺序读取记录,这样就不会受到写锁和批量更新的阻碍。我的猜测是,读者在没有太多麻烦的情况下领先于作者,批量阅读增加了复杂性,但没有获得太多。
通过实验找到合适批量的最佳点。