【发布时间】:2013-03-27 22:38:22
【问题描述】:
我有一个表 my_obj 有两个字段 value_a varchar(5) 和 value_b varchar(5)
确实,这两个值变化不大,可以成对组合。充其量,最大数量 my_obj 中有几百万条记录。
所有干扰value_a 和value_b 的查询都需要很长时间。所以我决定为所有可能的对创建表对,字段为value_a 和value_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_a和value_b列有索引吗? -
子查询不相关。表
my_obj在范围表中出现两次(一次作为目标,一次在子查询中),只有一个条目被锚定。
标签: sql postgresql sql-update plpgsql postgresql-9.1