約210万のタプルを持つテーブルがあります。緯度と経度の列があります。これを地理タイプ(SRIDのあるポイント)に変換しようとしています。
私が書いた関数(プロシージャ)は、エントリを制限すると正常に機能します(たとえば:) SELECT id,longitude,latitude FROM list_of_location limit 50
。
CREATE OR REPLACE FUNCTION convertlatlon() RETURNS VOID AS $$
DECLARE rec RECORD;
BEGIN
FOR rec IN SELECT id,longitude,latitude FROM list_of_location
LOOP
UPDATE list_of_location SET location= concat('SRID=4326;POINT(',rec.longitude,' ',rec.latitude,')') WHERE id=rec.id;
END LOOP;
END;
$$ LANGUAGE 'plpgsql' ;
- テーブル全体で実行しようとすると、PostgreSQLは何もしないようです。1時間半待っています。
- 実行中のコアでCPUの99%を消費します。
- 他のコアを利用するためにPostgreSQLの他のインスタンスを起動しません(要求は単一のユーザーからのものであるため?)。
- これはロック(行レベル)が原因ですか?
- これを回避する方法は?
PS私はこれがオフトピックとして閉じられるとかなり確信しています。しかし、私は答えを探さなければなりません。