sql - 提高 UPDATE WHERE sql 查询的性能

标签 sql postgresql performance

我有一个非常简单的查询

UPDATE TableA
SET date_type = TableB.date_type
FROM TableB
WHERE TableB.int_type = TableA.int_type

我的指数是: TableA(int_type), TableB(int_type, date_type)

EXPLAIN 结果:

Update on TableA  (cost=2788789.320..34222368.900 rows=82594592 width=261)
  ->  Hash Join  (cost=2788789.320..34222368.900 rows=82594592 width=261)
          Hash Cond: (TableA.int_type = TableB.int_type)
        ->  Seq Scan on tableA  (cost=0.000..12610586.960 rows=101433296 width=247)
        ->  Hash  (cost=1272403.920..1272403.920 rows=82594592 width=18)
              ->  Seq Scan on TableB  (cost=0.000..1272403.920 rows=82594592 width=18)

查询正在进行超过 3 小时。

怎样做才能让它运行得更快?从 EXPLAIN 结果中可以看出,没有使用索引。我是否应该选择其他索引/进行任何其他改进以使查询运行得更快?

PostgreSQL 9.6

最佳答案

您可以做的是避免幂等更新:


UPDATE TableA a
SET date_type = b.date_type
FROM TableB b
WHERE b.int_type = a.int_type
AND a.date_type IS DISTINCT FROM b.date_type  -- <<-- avoid updates with the same value
        ;

而且,也许您假设 A 和 B 之间存在一对一的关系,但 DBMS 却没有。 您可以限制每个目标行最多更新一个源行:


EXPLAIN
UPDATE TableA a
SET date_type = b.date_type
FROM ( SELECT int_type, date_type
        , row_number() OVER(PARTITION BY int_type) AS rn
        FROM TableB
        ) b
WHERE b.int_type = a.int_type
AND a.date_type IS DISTINCT FROM b.date_type -- <<-- avoid idempotent updates
AND b.rn=1 -- <<-- allow only one update per target row.
        ;

关于sql - 提高 UPDATE WHERE sql 查询的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53299884/

相关文章:

php - 为什么 echo 只打印 PHP 数组中的一个值?

mysql - 如何获取触发器的插入值

复杂查询的 MySQL 查询优化

sql - 使用 for 循环插入到表中

postgresql - 如何用Doobie正确处理Hikari连接池

ruby-on-rails - 数据库设计 - 存储不同的 Assets (同表与差异表)

r - 求和或矩阵乘法更快吗?

MySQL 选择/更新竞赛条件

c - 高效计算 nCk mod p

C# LINQ 和涉及大型数据集的计算