更新查询中的性能问题

问题描述 投票:6回答:3

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

在我的程序中,我将在阵列中有200个独特的sl_id。我通过使用每个status更新truesl_id(总是)。

我怀疑:

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

(要么)

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

哪一个会更快?

sql postgresql sqlperformance
3个回答
23
投票

按从粗到慢的粗略顺序:

  • 200个人查询,每个查询都在自己的交易中
  • 200个单独查询,全部在一个交易中
  • sl_idWHERE ... IN (...)的1大疑问
  • WHERE EXISTS (SELECT ...)条款中使用INNER JOIN进行的1大查询
  • (对于非常大的值列表,速度更快):VALUES值列表到临时表,索引它,以及临时表上的COPY

如果你使用了数百个值,我真的建议加入JOIN条款。对于成千上万的值,VALUES到临时表并索引然后加入它。

连接值子句的示例。鉴于此COPY查询:

IN

SELECT * FROM mytable WHERE somevalue IN (1, 2, 3, 4, 5); 相当的是:

VALUES

但请注意,使用qazxsw poi这种方式是PostgreSQL扩展,而qazxsw poi或使用临时表是SQL标准。

看到这个相关的问题:

  • SELECT * FROM mytable INNER JOIN ( VALUES (1), (2), (3), (4), (5) ) vals(v) ON (somevalue = v);

1
投票

当然你应该使用VALUES运算符。进行200次查询比一次查询慢得多。请记住,当您向数据库发送查询时,服务器和数据库之间需要额外的时间进行通信,这会破坏您的性能。


0
投票

肯定IN更强大,但是再次检查IN的匹配数量会导致性能问题。

因此,我建议使用IN但使用BATCH,如果你有200条记录要更新,然后分成50条,然后进行4次UPDATE查询,或类似的东西。

希望能帮助到你...!!

© www.soinside.com 2019 - 2024. All rights reserved.