残念ながら、いくつかの重いbytea
タイプのフィールドを含む、顧客データ (〜 500K の顧客) を含むテーブルを備えた postgresql 9.2 インストールがあります。
CUSTOMERS1 | id | first name | last name | ...
----------------------------------------------------- ...
c1005 ... ... ...
残念ながら、まったく同じ外部キーを使用していない外部ソースとデータをマージするタスクがあります。
CUSTOMERS2 | id | first name | last name | ...
----------------------------------------------------- ...
101005 ... ... ...
そのため、は同じ idにid をcustomers1
持っています。つまり、はドロップされ、id に追加されます。c1005
customers2
101005
c
100000
にあるのと同じIDを含む列customers2_id
を追加しようとしています。次のSQLコマンドを思いつきました:customers1
customers2
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 フィールドが主な問題であるという印象があります。
どうすれば物事をスピードアップし、この問題を解決できるでしょうか? それほど遅いという本当の問題は何でしょうか?