我对查询性能有一点疑问。基本上,我有一张超过1C记录的表。 sl_id
是该表中的主键。目前,我正在使用status
将表格列true
更新为false
(默认sl_id
)。
在我的程序中,我将在数组中有200个唯一sl_id
。我正在使用每个status
将true
更新为sl_id
(始终)。
我怀疑:
我应该通过在where条件中指定每个sl_id
来更新状态来使用单独的更新查询吗?
(OR)
我应该使用IN
运算符并将所有200个唯一sl_id
放在一个查询中吗?
哪一个会更快?
答案 0 :(得分:22)
从慢到快的粗略顺序:
WHERE ... IN (...)
或WHERE EXISTS (SELECT ...)
INNER JOIN
超过VALUES
子句的大查询COPY
值列表,索引值和临时表上的JOIN
。如果您使用了数百个值,我建议您加入VALUES
条款。对于成千上万的值,COPY
到临时表和索引然后加入它。
加入values子句的示例。鉴于此IN
查询:
SELECT *
FROM mytable
WHERE somevalue IN (1, 2, 3, 4, 5);
与VALUES
等价的是:
SELECT *
FROM mytable
INNER JOIN (
VALUES (1), (2), (3), (4), (5)
) vals(v)
ON (somevalue = v);
但请注意,使用VALUES
这种方式是PostgreSQL扩展,而IN
或使用临时表是SQL标准。
请参阅此相关问题:
答案 1 :(得分:1)
当然你应该使用WHERE IN
运算符。进行200次查询比一次查询慢得多。请记住,当您向数据库发送查询时,服务器和数据库之间需要额外的时间进行通信,这会破坏您的性能。
答案 2 :(得分:0)
肯定IN更强大,但是再次检查IN的匹配数量会导致性能问题。
所以,我建议使用IN但使用BATCH,如果你有200条记录要更新,然后分成50条,然后进行4条UPDATE查询,或类似的东西。
希望它有所帮助...... !!