इस डेटाबेस के विरुद्ध फुलटेक्स्ट क्वेश्चन (आरटी ( रिक्वेस्ट ट्रैकर ) टिकटों को स्टोर करके ) निष्पादित करने में बहुत लंबा समय लगता है। अटैचमेंट टेबल (फुलटेक्स्ट डेटा युक्त) लगभग 15GB है।
डेटाबेस स्कीमा निम्नानुसार है, यह लगभग 2 मिलियन पंक्तियाँ हैं:
rt4 = # \ d + अनुलग्नक टेबल "public.attachments" स्तंभ | प्रकार | संशोधक | भंडारण | विवरण ----------------- + ----------------------------- + - -------------------------------------------------- ------ + ---------- + ------------- आईडी | पूर्णांक | डिफॉल्ट नेक्स्ट नेवल नहीं ('अटैचमेंट्स_ड_सेक' :: regclass) | सादा | लेन-देन | पूर्णांक | अशक्त नहीं | सादा | माता पिता | पूर्णांक | डिफ़ॉल्ट नहीं 0 | सादा | संदेश देने वाला | चरित्र भिन्न (160) | | विस्तारित | विषय | वर्ण भिन्नता (255) | | विस्तारित | फ़ाइल नाम | वर्ण भिन्नता (255) | | विस्तारित | सामग्री चरित्र भिन्न (80) | | विस्तारित | सामग्री चरित्र भिन्न (80) | | विस्तारित | सामग्री | पाठ | | विस्तारित | हेडर | पाठ | | विस्तारित | निर्माता | पूर्णांक | डिफ़ॉल्ट नहीं 0 | सादा | बनाया | टाइम ज़ोन के बिना टाइमस्टैम्प | | सादा | contentindex | tsvector | | विस्तारित | इंडेक्स: "संलग्नक_पैक" प्राथमिक कुंजी, बीटीआरआई (आईडी) "संलग्नक 1" बीटीआरवाई (मूल) "संलग्नक 2" बीटीआरआई (लेन-देन) "संलग्नक 3" बीटीआरवाई (मूल, लेन-देन) "contentindex_idx" जिन (contentindex) OIDs है: नहीं
मैं इस पर डेटाबेस को बहुत तेज़ी से क्वेरी कर सकता हूं (<1s) जैसे कि क्वेरी के साथ:
select objectid
from attachments
join transactions on attachments.transactionid = transactions.id
where contentindex @@ to_tsquery('frobnicate');
हालाँकि, जब RT एक क्वेरी चलाता है जो एक ही टेबल पर एक फुलटेक्स इंडेक्स सर्च करने के लिए होती है, तो इसे पूरा होने में आमतौर पर सैकड़ों सेकंड लगते हैं। क्वेरी विश्लेषण आउटपुट निम्नानुसार है:
सवाल
SELECT COUNT(DISTINCT main.id)
FROM Tickets main
JOIN Transactions Transactions_1 ON ( Transactions_1.ObjectType = 'RT::Ticket' )
AND ( Transactions_1.ObjectId = main.id )
JOIN Attachments Attachments_2 ON ( Attachments_2.TransactionId = Transactions_1.id )
WHERE (main.Status != 'deleted')
AND ( ( ( Attachments_2.ContentIndex @@ plainto_tsquery('frobnicate') ) ) )
AND (main.Type = 'ticket')
AND (main.EffectiveId = main.id);
EXPLAIN ANALYZE
उत्पादन
जल्दी योजना -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------- सकल (लागत = 51210.60..51210.61 पंक्तियाँ = 1 चौड़ाई = 4) (वास्तविक समय = 477778.806..477778.806 पंक्तियाँ = 1 छोर = 1) -> नेस्टेड लूप (लागत = 0.00..51210.57 पंक्तियाँ = 15 चौड़ाई = 4) (वास्तविक समय = 17943.986..477775.174 पंक्तियाँ = 4197 छोर = 1) -> नेस्टेड लूप (लागत = 0.00..40643.08 पंक्तियाँ = 6507 चौड़ाई = 8) (वास्तविक समय = 8.526..20610.380 पंक्तियाँ = 1714818 लूप = 1) -> टिकट मुख्य पर स्कैन स्कैन (लागत = 0.00..9818.37 पंक्तियों = 598 चौड़ाई = 8) (वास्तविक समय = 0.008..256.042 पंक्तियों = 96990 छोरों = 1) फ़िल्टर: (((स्टेटस) :: टेक्स्ट 'डिलीट' :: टेक्स्ट) और (आईडी = प्रभावी) और (टाइप) :: टेक्स्ट = 'टिकट' :: टेक्स्ट) -> लेनदेन लेनदेन 1 पर लेनदेन 1 का उपयोग करके सूचकांक स्कैन करें (लागत = 0.00..51.36 पंक्तियों = 15 चौड़ाई = 8) (वास्तविक समय = 0.102..0.202 पंक्तियों = 18 छोरों = 96990) सूचकांक कंडोम: (((ऑब्जेक्टिव) :: टेक्स्ट = 'आरटी :: टिकट' :: टेक्स्ट) और (ऑब्जेक्टिड = मेन.ड) -> अनुलग्नकों पर अनुलग्नकों 2 का उपयोग कर सूचकांक स्कैन करें। संलग्नक_2 (लागत = 0.00..1.61 पंक्तियाँ = 1 चौड़ाई = 4) (वास्तविक समय = 0.266..0.266 पंक्तियाँ = 0 छोर = 1714818) सूचकांक कंडोम: (लेन-देन = लेनदेन_1.id) फ़िल्टर: (contentindex @@ plainto_tsquery ('फ्रोबनिकेट' :: टेक्स्ट)) कुल रनटाइम: 477778.883 एमएस
जहां तक मैं बता सकता हूं, मुद्दा यह प्रतीत होता है कि यह contentindex
फ़ील्ड पर बनाए गए सूचकांक ( contentindex_idx
) का उपयोग नहीं कर रहा है , बल्कि यह संलग्नक तालिका में बड़ी संख्या में मिलान पंक्तियों पर एक फिल्टर कर रहा है। व्याख्या आउटपुट में पंक्ति गिना जाना भी एक गलत ANALYZE
अनुमान है, भले ही हाल ही में : अनुमानित पंक्तियों = 6507 वास्तविक पंक्तियों = 1714818।
मुझे यकीन नहीं है कि इसके साथ आगे कहां जाना है।