Postgresql:更新命令没有停止

时间:2013-06-18 09:26:05

标签: sql postgresql

我有一个postgresql 9.2安装,其中包含一个包含客户数据的表(约500K客户),不幸的是还包括一些重bytea类型的字段。

CUSTOMERS1 |    id    |   first name  |  last name  |   ...
-----------------------------------------------------   ...
               c1005         ...            ...         ...

我们的任务是将数据与外部源合并,遗憾的是,它不使用完全相同的外键。

CUSTOMERS2 |    id    |   first name  |  last name  |   ...
-----------------------------------------------------   ...
              101005         ...            ...         ...

因此,虽然customers1c1005中的ID为customers2,但同一个ID为101005,即c刚刚被删除,100000被添加到id。

我现在正在尝试将customers2_id列添加到customers1,其中包含与customers2中相同的ID。我提出了以下SQL命令:

ALTER TABLE customers1 ADD COLUMN customers2_id numeric(15,0);
UPDATE customers1 
SET customers2_id = to_number(trim(leading 'c' from id), '9999') + 100000;

不幸的是,当我运行命令时,它需要永远(我们让它运行> 15小时仍然没有完成)。此外,postgres进程似乎是空闲的(根据活动监视器)。

一些注意事项:

  • 我们删除了索引
  • 运行UPDATE命令,例如WHERE id = 'c1005'快速运行,WHERE子句中包含~10个元素,20个元素速度大幅降低
  • 这个实验表明这个操作可以快速执行:我们刚刚做了INSERT INTO个新表并指定为插入select语句SELECT id, to_number(trim(leading 'c' from id), '9999') + 100000 FROM customers2的值;它运行在< 10秒
  • 我们的印象是bytea字段是主要问题

我们怎样才能加快速度并解决这个问题?什么可能是那么慢的真正问题?

1 个答案:

答案 0 :(得分:2)

桌子似乎已经腐败了。我们通过重新创建模式并执行INSERT INTO来复制表(为方便起见,我们将新的id字段添加到新模式,并让它在插入时计算新的id)。现在一切顺利。