Eu sugiro verificar esta resposta que postei em "Como você conta as ocorrências de uma string ancorada usando o PostgreSQL?" . A resposta escolhida mostrou ser massivamente mais lenta do que uma versão adaptada de
regexp_replace()
. A sobrecarga de criar as linhas e a execução da agregação é simplesmente muito alta. A maneira mais rápida de fazer isso é a seguinte...
SELECT
(length(str) - length(replace(str, replacestr, '')) )::int
/ length(replacestr)
FROM ( VALUES
('foobarbaz', 'ba')
) AS t(str, replacestr);
Aqui nós
- Pegue o comprimento da string,
L1
- Subtrair de
L1
o comprimento da string com todas as substituições removidasL2
para obterL3
a diferença no comprimento da string. - Divida
L3
pela duração da substituição para obter as ocorrências
Para comparação, é cerca de cinco vezes mais rápido do que o método de usar
regexp_matches()
que se parece com isso. SELECT count(*)
FROM ( VALUES
('foobarbaz', 'ba')
) AS t(str, replacestr)
CROSS JOIN LATERAL regexp_matches(str, replacestr, 'g');