假设我有10,000行需要更新。什么会更快
UPDATE DB.Servers SET Live = 1 where name = 'server1';
UPDATE DB.Servers SET Live = 1 where name = 'server2';
...
UPDATE DB.Servers SET Live = 1 where name = 'server100000';
OR
UPDATE DB.Servers SET Live = 1 where name in ('server1', 'server2'...'server10000');
我认为第二种选择更快,但我不确定。让我担心的是我不知道SQL stm是否有长度限制。在这种情况下会推荐什么?
谢谢
答案 0 :(得分:3)
SQL应该是一种声明性语言;它不期望用户说"如何"得到结果,只有"什么"期望的结果是。所以原则上我会使用in()
构造,因为这是最简洁的(从逻辑角度来看)要求结果的方式,让DBMS(任何DBMS!)决定什么是最好的。
答案 1 :(得分:2)
单个更新通常会更快,因为整个事情通常都会在一次提交中完成。根据我的经验,10,000应该不是问题,但根据您的平台,生成像这样的大SQL可能不是最好的。
确定服务器是否正常运行的是什么?你在哪个平台?是否有可能将一个表作为参数发送到过程(SQL Server表值参数),然后直接在UPDATE查询中使用?
最终,您只能通过查看执行计划和自己进行基准测试来判断。
答案 2 :(得分:1)
单个UPDATE
更快。
我已经用MySQL 5.1.73测试过
CREATE TABLE test_random (
val char(40) NOT NULL default '',
num int NOT NULL default '0',
KEY val (val)
) TYPE=MyISAM;
INSERT INTO test_random (val, num) VALUES
('MXZJBXUGNFOZMMQMYZEMLKZZKTCIGEU',889),
('ZTEBMDHOJGYBYEOPZIIPPJQQOKXMTKU',351),
... [200K records total inserted] ...
('ADLDYZQHDEZMYBHORKGJYMIOVUETQCM',786);
然后是 random-update-single.sql :
UPDATE test_random SET num=1 WHERE val IN (
'PXTUKCZMRFZDTWUPULAPENPNQCSPFQJ',
'GDIMLSCDRSNCMUNUZLQIDFZSEELNZLR',
... [100K records] ...
'ADLDYZQHDEZMYBHORKGJYMIOVUETQCM');
这是 random-update-multiple.sql :
UPDATE test_random SET num=2 WHERE val='PXTUKCZMRFZDTWUPULAPENPNQCSPFQJ';
UPDATE test_random SET num=2 WHERE val='GDIMLSCDRSNCMUNUZLQIDFZSEELNZLR';
... [100K records] ...
UPDATE test_random SET num=2 WHERE val='ADLDYZQHDEZMYBHORKGJYMIOVUETQCM';
这是结果:
> time mysql -uroot test < random-update-single.sql
0.075u 0.009s 0:01.78 3.9% 0+0k 0+0io 0pf+0w
> time mysql -uroot test < random-update-single.sql
0.074u 0.009s 0:01.76 3.9% 0+0k 0+0io 0pf+0w
> time mysql -uroot test < random-update-single.sql
0.069u 0.013s 0:01.57 4.4% 0+0k 0+0io 0pf+0w
> time mysql -uroot test < random-update-multiple.sql
1.746u 1.515s 0:11.14 29.1% 0+0k 0+0io 0pf+0w
> time mysql -uroot test < random-update-multiple.sql
2.183u 2.150s 0:14.83 29.1% 0+0k 0+0io 0pf+0w
> time mysql -uroot test < random-update-multiple.sql
1.961u 1.949s 0:13.96 27.9% 0+0k 0+0io 0pf+0w
也就是说,多个UPDATE
比单个UPDATE
慢5-6倍。