【问题标题】:Update query taking forever更新查询需要永远
【发布时间】:2013-03-27 22:38:22
【问题描述】:

我有一个表 my_obj 有两个字段 value_a varchar(5)value_b varchar(5)

确实,这两个值变化不大,可以成对组合。充其量,最大数量 my_obj 中有几百万条记录。

所有干扰value_avalue_b 的查询都需要很长时间。所以我决定为所有可能的对创建表对,字段为value_avalue_b。因此,我在表 my_obj 中添加了一个字段 id_pair。

我已经用它的所有对填充了表对,没关系。 所以,现在,我想用这个命令相应地更新表my_obj

update my_obj
set id_pair = p.id
from my_obj as o
inner join pair as p on p.value_a = o.value_a and p.value_b = o.value_b;

虽然查询已启动很长时间,但我运行了 select count(*) from my_obj where id_pair > 0;,它返回了我 0

所以我的更新查询有问题。 EDIT / N.B.:plpgsql 函数,它是一个事务单元,在事务结束时执行提交,所以 完全正常 我在表中没有看到任何修改因为我打断了这个功能。

我用my_obj主键上的条件更改了更新查询,以便只对一条记录执行一个update

update my_obj
set id_pair = p.id
from my_obj as o
inner join pair as p on p.value_a = o.value_a and p.value_b = o.value_b
where o.id = 1234567;  -- 1234567 being the key of an existing record

令人惊讶的是,当我启动这个应该update 只有一条记录的查询时,它似乎需要永远

我做错了什么?

【问题讨论】:

  • my_obj.id 上有索引吗?
  • 您有没有在第一个更新还在运行时尝试运行第二个更新?
  • postgresql 主键中的@Gerrat 自动有一个索引,所以是的。
  • 您对相关表的value_avalue_b 列有索引吗?
  • 子查询不相关。表my_obj 在范围表中出现两次(一次作为目标,一次在子查询中),只有一个条目被锚定。

标签: sql postgresql sql-update plpgsql postgresql-9.1


【解决方案1】:

这对你有什么作用?

update my_obj o
set    id_pair = p.id
from   pair p
where  p.value_a = o.value_a and
       p.value_b = o.value_b and
       o.id = 1234567; 

【讨论】:

  • @StephaneRolland 请在 SO 允许时接受答案。
猜你喜欢
  • 2017-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-21
  • 1970-01-01
  • 2015-01-11
  • 2013-04-06
  • 1970-01-01
相关资源
最近更新 更多