大批量UPdate如何优化

时间:2021-01-26 14:53:34
每秒至少几十条,并且有一定的重复,1分钟内的Update语句有30%是重复的。
问题:
怎么样能优化Update? 减少次数?内存中合并?应用程序池一崩溃岂不是直接丢失?
用类似memcached的东西无法保证多机写入时数据精准。

14 个解决方案

#1


如果是回写数据库,那么应该尽量减少和数据库的交互。
我觉得可以这样:
1、适当延长回写间隔(在你的业务允许的范围内)
2、把待回写数据批量导入(SqlBulkCopy)数据库某张表(为了区分数据来源,这张表需要有一个IP或者MAC地址的字段),不管重复与否,接下来拿这些原始数据更新数据库的工作交给服务器

memcached不能保证多机写入时数据精准,不知道你是怎么得出的?
fackbook用的就少共享内存,多机写入的并发量灰常大,人家怎么可以呢?

#2


多机UPDATE同一条数据,而且数据重复?
我觉得你从设计层面就应该重新考虑了,为什么要这样设计

#3


大批量UPdate如何优化

#4


引用 1 楼 lovelj2012 的回复:
如果是回写数据库,那么应该尽量减少和数据库的交互。
我觉得可以这样:
1、适当延长回写间隔(在你的业务允许的范围内)
2、把待回写数据批量导入(SqlBulkCopy)数据库某张表(为了区分数据来源,这张表需要有一个IP或者MAC地址的字段),不管重复与否,接下来拿这些原始数据更新数据库的工作交给服务器

memcached不能保证多机写入时数据精准,不知道你是怎么得出的?
fackbook用的就少共享内存,多机写入的并发量灰常大,人家怎么可以呢?

memcached具体我没有深入研究,但是我看说明他比较适合读多写少的情况。 SQL通过主键去update有锁,memcached同时多点向他更新一个记录呢?

#5


引用 2 楼 Z65443344 的回复:
多机UPDATE同一条数据,而且数据重复?
我觉得你从设计层面就应该重新考虑了,为什么要这样设计


重复的都是 比如    字段=字段+1     字段2=字段2+10    前提我也不知道A机器 和B机器会重复执行。 应该怎么设计呢?我能力有限。

#6


个人觉得如果对数据的实时性要求不高的话,可以按1楼说的那样把要更新的数据放到另外一个表中,然后隔一段时间后再进行更新,这个操作可以在数据库中使用作业任务或者另外写个windows  service来做,还有就是update的速度问题,可以对update语句的作为where查询条件的字段加索引,这样可以提高update操作的效率

#7


引用 6 楼 wyumening 的回复:
个人觉得如果对数据的实时性要求不高的话,可以按1楼说的那样把要更新的数据放到另外一个表中,然后隔一段时间后再进行更新,这个操作可以在数据库中使用作业任务或者另外写个windows  service来做,还有就是update的速度问题,可以对update语句的作为where查询条件的字段加索引,这样可以提高update操作的效率

放到另外一张表中还是一样的写入量啊。除非再架一台数据库定时同步。

#8


引用 5 楼 gzw13999 的回复:
Quote: 引用 2 楼 Z65443344 的回复:

多机UPDATE同一条数据,而且数据重复?
我觉得你从设计层面就应该重新考虑了,为什么要这样设计


重复的都是 比如    字段=字段+1     字段2=字段2+10    前提我也不知道A机器 和B机器会重复执行。 应该怎么设计呢?我能力有限。

这是要干什么,这样做有意义?难道做投票软件?
字段=字段+1,加完了你知道是谁加上去的?

#9


建议还是从数据库设计基础开始看
不要老靠拍脑袋想

#10


引用 8 楼 Z65443344 的回复:
Quote: 引用 5 楼 gzw13999 的回复:

Quote: 引用 2 楼 Z65443344 的回复:

多机UPDATE同一条数据,而且数据重复?
我觉得你从设计层面就应该重新考虑了,为什么要这样设计


重复的都是 比如    字段=字段+1     字段2=字段2+10    前提我也不知道A机器 和B机器会重复执行。 应该怎么设计呢?我能力有限。

这是要干什么,这样做有意义?难道做投票软件?
字段=字段+1,加完了你知道是谁加上去的?

没意义就不会今天来发帖问了。每秒都执行好几十次了,再想有没有意义 更没意义。
可以理解为类似投票,张三 李四 王二  全世界再为他们投票。票数=票数+1  这种情况如何优化?

#11


引用 7 楼 gzw13999 的回复:
Quote: 引用 6 楼 wyumening 的回复:

个人觉得如果对数据的实时性要求不高的话,可以按1楼说的那样把要更新的数据放到另外一个表中,然后隔一段时间后再进行更新,这个操作可以在数据库中使用作业任务或者另外写个windows  service来做,还有就是update的速度问题,可以对update语句的作为where查询条件的字段加索引,这样可以提高update操作的效率

放到另外一张表中还是一样的写入量啊。除非再架一台数据库定时同步。

量还是一样的不过,这样可以在服务器有空闲的时候进行update操作呀

#12


引用 10 楼 gzw13999 的回复:
Quote: 引用 8 楼 Z65443344 的回复:

Quote: 引用 5 楼 gzw13999 的回复:

Quote: 引用 2 楼 Z65443344 的回复:

多机UPDATE同一条数据,而且数据重复?
我觉得你从设计层面就应该重新考虑了,为什么要这样设计


重复的都是 比如    字段=字段+1     字段2=字段2+10    前提我也不知道A机器 和B机器会重复执行。 应该怎么设计呢?我能力有限。

这是要干什么,这样做有意义?难道做投票软件?
字段=字段+1,加完了你知道是谁加上去的?

没意义就不会今天来发帖问了。每秒都执行好几十次了,再想有没有意义 更没意义。
可以理解为类似投票,张三 李四 王二  全世界再为他们投票。票数=票数+1  这种情况如何优化?

如果是投票,你必须insert一条,把投票人insert进去,防止重复投票,而不是无脑update
如果就是想update,也可以先缓存在数组中,定时update
比如
张三
李四
王五
建立个int[]数组,0,1,2位置分别存放3个人的票数
然后累计到几千了一次性执行:字段=字段+2543

#13


这种情况一般我会 分时间段,然后将这个时间段的 东西一起update。这样会快一些儿。不知道这方法有没有用。。 

#14


如果像你的例子那么简单到只更新一个表的一个字段的话,那么就
1.使用SqlParameter,传递给服务器相同的SQL字符串。
2.不使用事物处理,也不需要Lock。程序端就是提交更新要求,等待更新结果,如果Update返回更新结果件数是0、或者超时等错误的话再重复提交。
3.信任数据库服务器,一秒钟几十次UPDATE没啥问题的。
4.配置数据库服务器,定期维护索引。
5.更新数据库服务器的硬件配置。

#1


如果是回写数据库,那么应该尽量减少和数据库的交互。
我觉得可以这样:
1、适当延长回写间隔(在你的业务允许的范围内)
2、把待回写数据批量导入(SqlBulkCopy)数据库某张表(为了区分数据来源,这张表需要有一个IP或者MAC地址的字段),不管重复与否,接下来拿这些原始数据更新数据库的工作交给服务器

memcached不能保证多机写入时数据精准,不知道你是怎么得出的?
fackbook用的就少共享内存,多机写入的并发量灰常大,人家怎么可以呢?

#2


多机UPDATE同一条数据,而且数据重复?
我觉得你从设计层面就应该重新考虑了,为什么要这样设计

#3


大批量UPdate如何优化

#4


引用 1 楼 lovelj2012 的回复:
如果是回写数据库,那么应该尽量减少和数据库的交互。
我觉得可以这样:
1、适当延长回写间隔(在你的业务允许的范围内)
2、把待回写数据批量导入(SqlBulkCopy)数据库某张表(为了区分数据来源,这张表需要有一个IP或者MAC地址的字段),不管重复与否,接下来拿这些原始数据更新数据库的工作交给服务器

memcached不能保证多机写入时数据精准,不知道你是怎么得出的?
fackbook用的就少共享内存,多机写入的并发量灰常大,人家怎么可以呢?

memcached具体我没有深入研究,但是我看说明他比较适合读多写少的情况。 SQL通过主键去update有锁,memcached同时多点向他更新一个记录呢?

#5


引用 2 楼 Z65443344 的回复:
多机UPDATE同一条数据,而且数据重复?
我觉得你从设计层面就应该重新考虑了,为什么要这样设计


重复的都是 比如    字段=字段+1     字段2=字段2+10    前提我也不知道A机器 和B机器会重复执行。 应该怎么设计呢?我能力有限。

#6


个人觉得如果对数据的实时性要求不高的话,可以按1楼说的那样把要更新的数据放到另外一个表中,然后隔一段时间后再进行更新,这个操作可以在数据库中使用作业任务或者另外写个windows  service来做,还有就是update的速度问题,可以对update语句的作为where查询条件的字段加索引,这样可以提高update操作的效率

#7


引用 6 楼 wyumening 的回复:
个人觉得如果对数据的实时性要求不高的话,可以按1楼说的那样把要更新的数据放到另外一个表中,然后隔一段时间后再进行更新,这个操作可以在数据库中使用作业任务或者另外写个windows  service来做,还有就是update的速度问题,可以对update语句的作为where查询条件的字段加索引,这样可以提高update操作的效率

放到另外一张表中还是一样的写入量啊。除非再架一台数据库定时同步。

#8


引用 5 楼 gzw13999 的回复:
Quote: 引用 2 楼 Z65443344 的回复:

多机UPDATE同一条数据,而且数据重复?
我觉得你从设计层面就应该重新考虑了,为什么要这样设计


重复的都是 比如    字段=字段+1     字段2=字段2+10    前提我也不知道A机器 和B机器会重复执行。 应该怎么设计呢?我能力有限。

这是要干什么,这样做有意义?难道做投票软件?
字段=字段+1,加完了你知道是谁加上去的?

#9


建议还是从数据库设计基础开始看
不要老靠拍脑袋想

#10


引用 8 楼 Z65443344 的回复:
Quote: 引用 5 楼 gzw13999 的回复:

Quote: 引用 2 楼 Z65443344 的回复:

多机UPDATE同一条数据,而且数据重复?
我觉得你从设计层面就应该重新考虑了,为什么要这样设计


重复的都是 比如    字段=字段+1     字段2=字段2+10    前提我也不知道A机器 和B机器会重复执行。 应该怎么设计呢?我能力有限。

这是要干什么,这样做有意义?难道做投票软件?
字段=字段+1,加完了你知道是谁加上去的?

没意义就不会今天来发帖问了。每秒都执行好几十次了,再想有没有意义 更没意义。
可以理解为类似投票,张三 李四 王二  全世界再为他们投票。票数=票数+1  这种情况如何优化?

#11


引用 7 楼 gzw13999 的回复:
Quote: 引用 6 楼 wyumening 的回复:

个人觉得如果对数据的实时性要求不高的话,可以按1楼说的那样把要更新的数据放到另外一个表中,然后隔一段时间后再进行更新,这个操作可以在数据库中使用作业任务或者另外写个windows  service来做,还有就是update的速度问题,可以对update语句的作为where查询条件的字段加索引,这样可以提高update操作的效率

放到另外一张表中还是一样的写入量啊。除非再架一台数据库定时同步。

量还是一样的不过,这样可以在服务器有空闲的时候进行update操作呀

#12


引用 10 楼 gzw13999 的回复:
Quote: 引用 8 楼 Z65443344 的回复:

Quote: 引用 5 楼 gzw13999 的回复:

Quote: 引用 2 楼 Z65443344 的回复:

多机UPDATE同一条数据,而且数据重复?
我觉得你从设计层面就应该重新考虑了,为什么要这样设计


重复的都是 比如    字段=字段+1     字段2=字段2+10    前提我也不知道A机器 和B机器会重复执行。 应该怎么设计呢?我能力有限。

这是要干什么,这样做有意义?难道做投票软件?
字段=字段+1,加完了你知道是谁加上去的?

没意义就不会今天来发帖问了。每秒都执行好几十次了,再想有没有意义 更没意义。
可以理解为类似投票,张三 李四 王二  全世界再为他们投票。票数=票数+1  这种情况如何优化?

如果是投票,你必须insert一条,把投票人insert进去,防止重复投票,而不是无脑update
如果就是想update,也可以先缓存在数组中,定时update
比如
张三
李四
王五
建立个int[]数组,0,1,2位置分别存放3个人的票数
然后累计到几千了一次性执行:字段=字段+2543

#13


这种情况一般我会 分时间段,然后将这个时间段的 东西一起update。这样会快一些儿。不知道这方法有没有用。。 

#14


如果像你的例子那么简单到只更新一个表的一个字段的话,那么就
1.使用SqlParameter,传递给服务器相同的SQL字符串。
2.不使用事物处理,也不需要Lock。程序端就是提交更新要求,等待更新结果,如果Update返回更新结果件数是0、或者超时等错误的话再重复提交。
3.信任数据库服务器,一秒钟几十次UPDATE没啥问题的。
4.配置数据库服务器,定期维护索引。
5.更新数据库服务器的硬件配置。