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

0
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 毫秒。
已邀请:
1

GeorgeYao - 路漫漫其修远兮,吾将上下而求索! 2015-10-08 回答

将in里面的数据存到一张临时表中,然后将更新的表和临时表关联起来限制条件;批量update,这样效率会有所提升。(建议使用merge语句,将以下语句写到存储过程,定时执行即可。)
 
eg:insert into t1 select t.id from tables t where .......;
 
  merge into t2 t
  using t1 s on(t.id = s.id)
  when matched then
  update set 某个字段 = '';
 
 
1

老头子 - 专注是唯一的捷径 2015-10-09 回答

sqlserver不懂,如果是Oracle通常会绑定变量,但是不知道你的in里面是不是固定的数量,如果不是固定的,根据你说的时间基本都浪费在解析上,就cache执行计划,减少解析时间,sqlserver看下有没有这种方式吧 :)
ps:索引建不建要看你 update的数据/表的总数据 如果小于15%就可以建立索引,最好小于5%
0

- 取是能力,舍是境界 2015-10-03 回答

写个存储过程,把in后面的数值做为表变量参数的内容传递试下。
0

seng - 从事BI、大数据、数据分析工作 2015-10-09 回答

使用临时表吧,注意建索引
update tablename set Online=0 where exists (selectr a.Id from temptable a where a.Id  = tablename .id )

要回复问题请先登录注册