我有一个 postgresql 9.2 安装,其中包含一个包含客户数据(约 500K 客户)的表,不幸的是还包括一些重bytea
类型字段。
CUSTOMERS1 | id | first name | last name | ...
----------------------------------------------------- ...
c1005 ... ... ...
我们的任务是将数据与外部源合并,不幸的是没有使用完全相同的外键。
CUSTOMERS2 | id | first name | last name | ...
----------------------------------------------------- ...
101005 ... ... ...
因此,虽然customers1
idc1005
在customers2
同一个 id 中是101005
,即c
刚刚删除并100000
添加到 id 中。
我现在正在尝试向其中添加一个customers2_id
包含customers1
与customers2
. 我想出了以下 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 字段是主要问题
我们如何加快速度并解决这个问题?这么慢的真正问题是什么?