এই ডাটাবেসটির বিরুদ্ধে ফুলটেক্সট ক্যোয়ারীগুলি (আরটি ( অনুরোধ ট্র্যাকার ) টিকিট সংরক্ষণ করা ) কার্যকর হতে খুব দীর্ঘ সময় নিচ্ছে বলে মনে হচ্ছে। সংযুক্তি টেবিল (পুরো টেক্সট ডেটা সহ) প্রায় 15 জিবি।
ডাটাবেস স্কিমা নীচে, এটি প্রায় 2 মিলিয়ন সারি:
rt4 = # \ d + সংযুক্তি সারণী "পাবলিক.ট্যাচমেন্টস" কলাম | প্রকার | সংশোধক | স্টোরেজ | বিবরণ ----------------- + + ----------------------------- - -------------------------------------------------- ------ + + ---------- + + ------------- আইডি | পূর্ণসংখ্যা | পরেরটি নাল ডিফল্ট নয় ('সংযুক্তি_আইডি_সেক' :: রেগক্লাস) | সরল | লেনদেন | পূর্ণসংখ্যা | নাল না | সরল | অভিভাবক | পূর্ণসংখ্যা | নাল ডিফল্ট 0 | সরল | ম্যাসেজিড | চরিত্রের পার্থক্য (160) | | প্রসারিত | বিষয় | চরিত্রের পার্থক্য (255) | | প্রসারিত | ফাইলের নাম | চরিত্রের পার্থক্য (255) | | প্রসারিত | কন্টেন্টটাইপ | চরিত্রের পার্থক্য (80) | | প্রসারিত | কনটেনটকোডিং | চরিত্রের পার্থক্য (80) | | প্রসারিত | সামগ্রী | পাঠ্য | | প্রসারিত | শিরোনাম | পাঠ্য | | প্রসারিত | স্রষ্টা | পূর্ণসংখ্যা | নাল ডিফল্ট 0 | সরল | তৈরি | সময় অঞ্চল ছাড়া টাইমস্ট্যাম্প | | সরল | কন্টেন্টইন্ডেক্স | tsvector | | প্রসারিত | ইনডেক্সে: "সংযুক্তি_পকি" প্রাথমিক কী, বিটি (আইডি) "সংযুক্তি 1" বিটিরি (পিতামাতা) "সংযুক্তি 2" বিটিরি (লেনদেন) "সংযুক্তি 3" বিটিরি (পিতা বা মাতা, লেনদেন) "কন্টেন্টইন্ডেক্স_আইডিএক্স" জিন (কন্টেন্টইন্ডেক্স) ওআইডি রয়েছে: না
আমি খুব দ্রুত (<1s) এর সাথে একটি ডেটাবেসকে নিজের ক্যোয়ারী দিয়ে জিজ্ঞাসা করতে পারি যেমন:
select objectid
from attachments
join transactions on attachments.transactionid = transactions.id
where contentindex @@ to_tsquery('frobnicate');
যাইহোক, আরটি একই টেবিলটিতে একটি পূর্ণ পাঠ্য সূচি অনুসন্ধান করার কথা বলে এমন একটি ক্যোয়ারি চালায়, সাধারণত এটি সম্পূর্ণ হতে কয়েকশ সেকেন্ড সময় নেয়। কোয়েরি বিশ্লেষণ আউটপুট নীচে:
প্রশ্ন
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
আউটপুট
QUERY প্ল্যান -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------- সমষ্টি (ব্যয় = 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 ব্যবহার করে সূচক স্ক্যান করুন (ব্যয় = 0.00..1.61 সারি = 1 প্রস্থ = 4) (প্রকৃত সময় = 0.266..0.266 সারি = 0 লুপ = 1714818) সূচকের অবস্থা: ফিল্টার: (কন্টেন্টইন্ডেক্স @@ প্লেইনটো_টেস্কোয়ারি ('ফ্রোবনেট' :: টেক্সট)) মোট রানটাইম: 477778.883 এমএস
যতদূর আমি বলতে পারি, সমস্যাটি মনে হচ্ছে এটি contentindex
ক্ষেত্রের ( contentindex_idx
) তৈরি করা সূচকটি ব্যবহার করছে না , বরং এটি সংযুক্তি টেবিলের সাথে সংখ্যক মিলের সারিগুলিতে একটি ফিল্টার করছে। বর্ণিত আউটপুটে সারি গণনাগুলি সাম্প্রতিককালের পরেও ANALYZE
: বুনোভাবে ভুল বলে মনে হচ্ছে : আনুমানিক সারিগুলি = 6507 প্রকৃত সারি = 1714818।
এর সাথে কোথায় যেতে হবে আমি সত্যিই নিশ্চিত নই।