找回密码
 加入
搜索
查看: 1561|回复: 3

[网络通信] 关于SQL UPDATE 语句执行效率的问题【已解决】

[复制链接]
发表于 2019-12-15 13:36:03 | 显示全部楼层 |阅读模式
本帖最后由 大叔 于 2019-12-15 22:32 编辑

我需要定时更新SQL数据  目前用使用下面的方式
For $i = 1 To 400 Step +1
        $Conn.Execute("update host set ll='" & $a[$i]& "' where id='" & $i & "'")
Next

发现随机部分数据更新不成功。
通过调式 确认数据没问题
怀疑上面这部分不合理
想问问大老们 有没有办法
用一条$Conn.Execute("update host  一次更新这400条数据


使用下面办法 用分号隔开语句  发现故障依旧 怀疑 下面的一条命令应该还是三次查询 并没有改变执行效率!
$Conn.Execute("update host set ll='1' where id=''1" ;"update host set ll='2' where id=''2" ; "update host set ll='3' where id=''3" )


之后继续百度发现了另一种方式  
$Conn.Execute("UPDATE host SET ll = CASE id "& _
"'"WHEN 1 THEN '" & $lldate[1] & _
"' WHEN 2 THEN '" & $lldate[2] & _
"' WHEN 3 THEN '" & $lldate[3] & _
"' END where id in (1,2,3)" 

上面这种是真正的一次查询  更新多条
之后写了个for next 循环生成SQL语句   
程序  报错 3.au3"(2,8047) : error: yacc stack overflow
疑似 单行字符过多。 之后拆分成每百条一组
400条分成四次$Conn.Execute("update
目前观察几个小时  随机丢数据的问题没有再次出现   
原因猜测     $Conn.Execute是没有回显的
所以短时间往SQL SERVER 发送了大量的查询请求
至使部分查询工作没有正常进行
理论上 我用原来的方式 加个 SLEEP(300)就不会有随机查询失败的情况了
但是数据量较大的情况下 延时不好控制  1000条就300秒。五分钟过去了
因此还是单次查询更新多条数据 更适合  此贴完结!

发表于 2019-12-15 17:44:33 | 显示全部楼层
試試
$Conn.Execute("update host set ll='" & $d & "' where id<=400")

$Conn.Execute("update host set ll='" & $d & "' where id<='400'")

盡量不要用ID當欄位名稱,或許是保留字
 楼主| 发表于 2019-12-15 18:19:00 | 显示全部楼层
本帖最后由 大叔 于 2019-12-15 19:04 编辑
yangdai 发表于 2019-12-15 17:44
試試
$Conn.Execute("update host set ll='" & $d & "' where id

感谢2喽  我是更新端口流量信息  每个ID 的值都不同。
不能用这种 where id<='400' 批量修改 方式
 楼主| 发表于 2019-12-15 18:25:17 | 显示全部楼层
经测试  $Conn.Execute("        和SQL命令行类似    支持 ; 号语句隔离  可以写多行语句  下面的例子测试通过。
  $Conn.Execute("update host set ll=1 where id=1 ;update host set ll=2 where id=2“ ;update host set ll=3 where id=3“)
现在的问题是这样值行后  是算一次查旬 还是算三次查询。有木有大老知道  求科普!~
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-16 08:19 , Processed in 0.070088 second(s), 19 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表