更新查询中的性能问题

时间:2014-07-09 07:17:50

标签: sql postgresql sqlperformance

我对查询性能有一点疑问。基本上,我有一张超过1C记录的表。 sl_id是该表中的主键。目前,我正在使用status将表格列true更新为false(默认sl_id)。

在我的程序中,我将在数组中有200个唯一sl_id。我正在使用每个statustrue更新为sl_id(始终)。

我怀疑:

我应该通过在where条件中指定每个sl_id来更新状态来使用单独的更新查询吗?

(OR)

我应该使用IN运算符并将所有200个唯一sl_id放在一个查询中吗?

哪一个会更快?

3 个答案:

答案 0 :(得分:22)

从慢到快的粗略顺序:

  • 200个单独的查询,每个查询都在自己的交易中
  • 200个人查询,全部在一次交易中
  • WHERE ... IN (...)WHERE EXISTS (SELECT ...)
  • 的1大查询
  • 一个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查询,或类似的东西。

希望它有所帮助...... !!