मैं इस उत्तर की जाँच करने का अत्यधिक सुझाव दूंगा जिसे मैंने पोस्ट किया था "आप 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
get प्राप्त करने के लिए स्ट्रिंग की लंबाई में अंतर।- विभाजित करें
L3
घटनाओं . प्राप्त करने के लिए प्रतिस्थापन की लंबाई से
तुलना के लिए यह लगभग पांच गुना तेज . है regexp_matches()
. का उपयोग करने की विधि की तुलना में जो इस तरह दिखता है।
SELECT count(*)
FROM ( VALUES
('foobarbaz', 'ba')
) AS t(str, replacestr)
CROSS JOIN LATERAL regexp_matches(str, replacestr, 'g');