频繁update数据,in里边每次大概将近1000条数据,如何提高

sslg111 2015-09-27 10:52:14
update tablename set Online=0 where Id in (‘’,‘’,‘’)

系统需要非常频繁的执行这样一条语句,大概每秒执行一次,in里边每次大概 将近1000条数据,

测试执行的时间分析,编译比较占用时间,想进一步优化,这个语句,或者有没有可以代替in操作的方式?


SQL Server 分析和编译时间:
CPU 时间 = 63 毫秒,占用时间 = 65 毫秒。
表 'tablename'。扫描计数 0,逻辑读取 2290 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
SQL Server 执行时间:
CPU 时间 = 16 毫秒,占用时间 = 64 毫秒。
...全文
1018 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
starseeker7 2015-10-13
  • 打赏
  • 举报
回复
1秒更新1000不太科学,准确来说这种即时性要求这么高的业务场景应该很少,除非你已经实现了读写分离,否则在这么高的更新频率下去,读取速度会受到影响,
建议弄了一个缓存,5秒-10秒提交修改数据到数据库一次,甚至 3秒更新一次你的压力都会小很多
这时候可以弄一个临时表存放这些需要更改的KEY,然后用inner join或者exists的方式批量更新
中国风 2015-10-13
  • 打赏
  • 举报
回复
如果是连续性列,可取范围
shinger126 2015-10-12
  • 打赏
  • 举报
回复
重建下主键,把id列的索引类型修改为非聚集索引,否则频繁更新的话,耗用的资源是非常大的
xiaoxiangqing 2015-10-01
  • 打赏
  • 举报
回复
id,Online建索引试试
xiaoxiangqing 2015-10-01
  • 打赏
  • 举报
回复
看下执行计划,看能不能走索引。
sslg111 2015-10-01
  • 打赏
  • 举报
回复
引用 10 楼 yupeigu 的回复:
[quote=引用 5 楼 sslg111 的回复:] [quote=引用 2 楼 yupeigu 的回复:] 你in里面的一大堆id是从哪儿来的呢? 如果是从表里查询出来的,尽量直接用: update tablename set Online=0 where Id in (select id from tb) 如果这个语句是动态生成的,建议是否可以先把id插入到一个临时表里,然后再想上面一样in 某个表。
临时表可以提高 分析和编译的时间是吗?执行时间,这个基本优化不了了吧?[/quote] 临时表也会有创建的开销,所以也会花时间,另外,你的表上id是否有索引?[/quote] 有索引的,并且是设置为主键了,要不cpu时间会在300毫秒左右,现在设置为主键提高了很多,但是每个小时估计几千上万次的执行这个操作,所以想看看有没有有没有更好的解决方法
LongRui888 2015-09-30
  • 打赏
  • 举报
回复
引用 5 楼 sslg111 的回复:
[quote=引用 2 楼 yupeigu 的回复:] 你in里面的一大堆id是从哪儿来的呢? 如果是从表里查询出来的,尽量直接用: update tablename set Online=0 where Id in (select id from tb) 如果这个语句是动态生成的,建议是否可以先把id插入到一个临时表里,然后再想上面一样in 某个表。
临时表可以提高 分析和编译的时间是吗?执行时间,这个基本优化不了了吧?[/quote] 临时表也会有创建的开销,所以也会花时间,另外,你的表上id是否有索引?
sslg111 2015-09-30
  • 打赏
  • 举报
回复
引用 8 楼 yooq_csdn 的回复:
[quote=引用 7 楼 sslg111 的回复:] [quote=引用 6 楼 Roy_se7en 的回复:] 1 先没说明In 里的数据集哪里来的,如果是其他表来的,那直接用好了,SQL SERVER也是要做这一步的。 2 如果帅选的数据多的话,尽量不要使用IN ,NOT IN 。采用Join的方式连表处理吧,效率会好
in的数据,是按照一定的条件,也是从这个表里边的提取出来的,[/quote] 那么 试试 update where 你说的那些条件。至少逻辑上少绕了一圈[/quote] 好的,谢谢
yooq_csdn 2015-09-30
  • 打赏
  • 举报
回复
引用 7 楼 sslg111 的回复:
[quote=引用 6 楼 Roy_se7en 的回复:] 1 先没说明In 里的数据集哪里来的,如果是其他表来的,那直接用好了,SQL SERVER也是要做这一步的。 2 如果帅选的数据多的话,尽量不要使用IN ,NOT IN 。采用Join的方式连表处理吧,效率会好
in的数据,是按照一定的条件,也是从这个表里边的提取出来的,[/quote] 那么 试试 update where 你说的那些条件。至少逻辑上少绕了一圈
sslg111 2015-09-30
  • 打赏
  • 举报
回复
引用 6 楼 Roy_se7en 的回复:
1 先没说明In 里的数据集哪里来的,如果是其他表来的,那直接用好了,SQL SERVER也是要做这一步的。 2 如果帅选的数据多的话,尽量不要使用IN ,NOT IN 。采用Join的方式连表处理吧,效率会好
in的数据,是按照一定的条件,也是从这个表里边的提取出来的,
哋岼線 2015-09-29
  • 打赏
  • 举报
回复
1 先没说明In 里的数据集哪里来的,如果是其他表来的,那直接用好了,SQL SERVER也是要做这一步的。 2 如果帅选的数据多的话,尽量不要使用IN ,NOT IN 。采用Join的方式连表处理吧,效率会好
sslg111 2015-09-29
  • 打赏
  • 举报
回复
引用 2 楼 yupeigu 的回复:
你in里面的一大堆id是从哪儿来的呢? 如果是从表里查询出来的,尽量直接用: update tablename set Online=0 where Id in (select id from tb) 如果这个语句是动态生成的,建议是否可以先把id插入到一个临时表里,然后再想上面一样in 某个表。
临时表可以提高 分析和编译的时间是吗?执行时间,这个基本优化不了了吧?
sslg111 2015-09-29
  • 打赏
  • 举报
回复
引用 1 楼 yooq_csdn 的回复:
in 里的结果是如果产生的? 如果是另外一个表的查询结果,可把结果保存为临时表,之后和tablename 关联后再更新
临时表可以提高 分析和编译的时间是吗?执行时间,这个基本优化不了了吧?
tcmakebest 2015-09-28
  • 打赏
  • 举报
回复
其实循环1000次需要多少时间呢? 早就要学习用参数传值了, 不然每次的SQL语句都在变, 肯定要重新编译的.
LongRui888 2015-09-28
  • 打赏
  • 举报
回复
你in里面的一大堆id是从哪儿来的呢? 如果是从表里查询出来的,尽量直接用: update tablename set Online=0 where Id in (select id from tb) 如果这个语句是动态生成的,建议是否可以先把id插入到一个临时表里,然后再想上面一样in 某个表。
yooq_csdn 2015-09-28
  • 打赏
  • 举报
回复
in 里的结果是如果产生的? 如果是另外一个表的查询结果,可把结果保存为临时表,之后和tablename 关联后再更新

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧