2

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

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

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

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

因此,虽然customers1idc1005customers2同一个 id 中是101005,即c刚刚删除并100000添加到 id 中。

我现在正在尝试向其中添加一个customers2_id包含customers1customers2. 我想出了以下 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使用 eg 运行命令运行WHERE id = 'c1005'得很快,在 WHERE 子句中最多有 10 个元素,20 个元素的速度会大大降低
  • 这个实验表明这个操作可以快速执行:我们只是做了INSERT INTO一个新表并指定为插入 select 语句的值SELECT id, to_number(trim(leading 'c' from id), '9999') + 100000 FROM customers2;它在 <10 秒内运行
  • 我们的印象是 bytea 字段是主要问题

我们如何加快速度并解决这个问题?这么慢的真正问题是什么?

4

1 回答 1

2

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

于 2013-06-18T12:53:14.923 回答