我正在尝试使用 Postgresql 上某个字段中的字数来更新一个大表(大约 100 万行)。
此查询有效,并设置 token_count
字段计算表 my_table
中 longtext
中的单词(标记):
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 是正确的值。
问题是它非常慢,2 天时间不足以完成 100 万行。
你会做什么来优化它?有没有办法避免连接?
如何使用 limit
和 offset
将批处理分成 block ?
感谢您的任何提示,
乐龙
更新:我测量了 array_split 的性能,无论如何更新都会很慢。因此,也许解决方案包括将其并行化。如果我从 psql
运行不同的查询,只有一个查询有效,其他查询等待它完成。如何并行更新?
最佳答案
您是否尝试过使用 array_length
?
UPDATE my_table mt
SET token_count = array_length(regexp_split_to_array(trim(longtext), E'\\W+','g'), 1)
http://www.postgresql.org/docs/current/static/functions-array.html
# select array_length(regexp_split_to_array(trim(' some long text '), E'\\W+'), 1);
array_length
--------------
3
(1 row)
关于SQL 优化 - 字符串中的字数统计 - Postgresql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17197929/