Postgresql のフィールド内の単語数で大きなテーブル (約 1M 行) を更新しようとしています。このクエリは機能し、テーブルtoken_count
内の単語 (トークン) をカウントするフィールドを設定します。longtext
my_table
UPDATE my_table mt SET token_count =
(select count(token) from
(select unnest(regexp_matches(t.longtext, E'\\w+','g')) as token
from my_table as t where mt.myid = t.myid)
as tokens);
myid
テーブルの主キーです。
\\w+
特殊文字を無視して単語を数えたいので必要です。たとえば、A test . ; )
スペースベースのカウントでは 5 を返しますが、正しい値は 2 です。問題は、それが恐ろしく遅く、1M 行で完了するのに 2 日では足りないことです。それを最適化するために何をしますか?結合を回避する方法はありますか?
たとえばlimit
andを使用して、バッチをブロックに分割するにはどうすればよいoffset
ですか?
ヒントをありがとう、
ムロン
更新: array_split のパフォーマンスを測定しましたが、とにかく更新が遅くなります。したがって、解決策はそれを並列化することで構成されるかもしれません。から別のクエリを実行するとpsql
、1 つのクエリだけが機能し、他のクエリはそのクエリが完了するまで待機します。更新を並列化するにはどうすればよいですか?