Postgresql:更新命令未停止

Postgresql:更新命令未停止,sql,postgresql,Sql,Postgresql,我安装了一个postgresql 9.2,其中有一个表,其中包含客户数据(~500K个客户),不幸的是还包含一些繁重的bytea类型字段 CUSTOMERS1 | id | first name | last name | ... ----------------------------------------------------- ... c1005 ... ... ...

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

CUSTOMERS1 |    id    |   first name  |  last name  |   ...
-----------------------------------------------------   ...
               c1005         ...            ...         ...
我们的任务是将数据与外部源合并,不幸的是,外部源没有使用完全相同的外键

CUSTOMERS2 |    id    |   first name  |  last name  |   ...
-----------------------------------------------------   ...
              101005         ...            ...         ...
因此,虽然
customers1
customers2
中有id
c1005
,但相同的id是
101005
,也就是说,
c
刚刚被删除,而
100000
被添加到id中

我现在尝试将一列
customers2\u 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个元素的速度大大降低

  • 这个实验表明,这个操作可以快速执行:我们只需在一个新表中插入一个
    ,并将select语句
    select id中插入的值指定为指定的值,以_编号(trim(从id开始的'c','9999')+100000(从customers2开始)
    ;它在中运行,表似乎已损坏。我们通过重新创建模式并在
    中插入来复制表(为了方便起见,我们在新模式中添加了新id字段,并让它在插入时计算新id)。现在一切都很顺利。

    最有可能的是
    ALTER TABLE
    被此表上的某些操作阻塞了。@IgorRomanchenko:听起来很可疑:死锁最终会导致查询出错。表损坏了吗?听起来真奇怪。我从来没有听说过博士后腐蚀桌子的事。(光盘或文件系统故障的情况除外)