「PostgreSQLを使用してアンカー文字列の出現をどのようにカウントしますか?」に投稿したこの回答を確認することを強くお勧めします。 。選択された回答は、適合バージョンのregexp_replace()
よりも大幅に遅いことが示されました。 。行の作成と集計の実行のオーバーヘッドが高すぎるだけです。
これを行う最も速い方法は次のとおりです...
SELECT
(length(str) - length(replace(str, replacestr, '')) )::int
/ length(replacestr)
FROM ( VALUES
('foobarbaz', 'ba')
) AS t(str, replacestr);
ここに
- 文字列の長さ
L1
を取得します -
L1
から減算 すべての置換が削除された文字列の長さL2
L3
を取得するには 文字列の長さの違い。 -
L3
を分割します オカレンスを取得するための置換の長さ
比較のために、それは約5倍速い regexp_matches()
を使用する方法よりも このように見えます。
SELECT count(*)
FROM ( VALUES
('foobarbaz', 'ba')
) AS t(str, replacestr)
CROSS JOIN LATERAL regexp_matches(str, replacestr, 'g');