Ik raad je ten zeerste aan om dit antwoord te lezen dat ik heb gepost op "Hoe tel je het aantal keren dat een verankerde string voorkomt met PostgreSQL?" . Het gekozen antwoord bleek enorm langzamer te zijn dan een aangepaste versie van regexp_replace()
. De overhead van het maken van de rijen en het uitvoeren van het aggregaat is gewoon te hoog.
De snelste manier om dit te doen is als volgt...
SELECT
(length(str) - length(replace(str, replacestr, '')) )::int
/ length(replacestr)
FROM ( VALUES
('foobarbaz', 'ba')
) AS t(str, replacestr);
Hier zijn we
- Neem de lengte van de string,
L1
- Aftrekken van
L1
de lengte van de string met alle vervangingen verwijderdL2
omL3
. te krijgen het verschil in stringlengte. - Verdeel
L3
door de lengte van de vervanging om de voorvallen . te krijgen
Ter vergelijking:dat is ongeveer vijf keer sneller dan de methode van het gebruik van regexp_matches()
die er zo uitziet.
SELECT count(*)
FROM ( VALUES
('foobarbaz', 'ba')
) AS t(str, replacestr)
CROSS JOIN LATERAL regexp_matches(str, replacestr, 'g');