gpt4 book ai didi

sql - 更新查询中的性能问题

转载 作者:行者123 更新时间:2023-11-29 11:18:16 25 4
gpt4 key购买 nike

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

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

我的疑问:

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

(或)

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

哪个会更快?

最佳答案

按照从慢到快的粗略顺序:

  • 200 个单独的查询,每个查询都在自己的事务中
  • 200 个单独的查询,全部在一个事务中
  • 1 个使用 WHERE ... IN (...)WHERE EXISTS (SELECT ...)
  • 的大查询
  • 1 个大查询,在 VALUES 子句上使用 INNER JOIN
  • (仅对于非常大的值列表更快):COPY 值列表到临时表,对其进行索引,然后在临时表上JOIN

如果您使用数百个值,我真的建议通过 VALUES 子句加入。对于数以千计的值,COPY 到一个临时表并为其建立索引,然后加入它。

加入值(value)条款的例子。鉴于此 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 标准。

请参阅此相关问题:

关于sql - 更新查询中的性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24647503/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com