【问题标题】:Performance issue in update query更新查询中的性能问题
【发布时间】:2014-07-09 07:17:49
【问题描述】:

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

在我的程序中,我将在一个数组中有 200 个唯一的 sl_id。我正在使用每个sl_idstatus 更新为true(总是)。

我的疑问:

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

(或)

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

哪个会更快?

【问题讨论】:

  • 您是在询问是否应该对 200 行运行 1 个查询,还是对每个 1 行运行 200 个查询?
  • @shree.pat18,是的。这是我的疑问。

标签: sql postgresql sqlperformance


【解决方案1】:

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

  • 200 个单独的查询,每个查询都在自己的事务中
  • 200 个单独的查询,一站式完成
  • 1 个带有 WHERE ... IN (...)WHERE EXISTS (SELECT ...) 的大查询
  • VALUES 子句上带有INNER JOIN 的1 个大查询
  • (仅对于非常大的值列表更快):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 标准。

查看这个相关问题:

【讨论】:

  • 如果我没记错的话,您所显示的 values 子句是在标准中定义的(虽然不是 100% 关于列定义的别名 - 但如果标准合规性很重要)
  • VALUES 是标准的,当然。我不认为将它用作子查询中的语句是 SQL 规范。当然,它在我尝试过的非 PostgreSQL 数据库中不起作用。也不是像 Pg 这样的顶级语句允许 - VALUES (1) 是合法的 PostgreSQL 查询。
  • select * from ( values (1), (2) ) t (id) 在 SQL Server 2012 和 DB2 中(至少)工作。
  • 顺便说一句:对于一个简单的测试表(150k 行),in 解决方案对我来说比使用values 连接更快:explain.depesz.com/s/9rkRexplain.depesz.com/s/7WL not in 但是基本上比左连接慢/为空解决方案
  • 要考虑的另一件事是对数据库的负载影响。我有一个非常常用的查询,其中值的数量从 5 到 30,000 不等。在对 30K 值测试不同方法时,使用临时表比加入值快一点,但对服务器 CPU 负载的影响要大得多。
【解决方案2】:

绝对应该使用WHERE IN 运算符。进行 200 个查询比一个更大的查询要慢得多。请记住,当您向数据库发送查询时,服务器和数据库之间需要额外的时间进行通信,这会影响您的性能。

【讨论】:

    【解决方案3】:

    当然IN更强大,但再次检查IN的匹配数会导致性能问题。

    所以,我建议使用 IN 但与 BATCH 一起使用,就像你有 200 条记录要更新,然后每条记录 50 条,然后进行 4 条 UPDATE 查询,或类似的东西。

    希望对你有帮助...!!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-27
      • 2019-11-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多