এই ডাটাবেসটির বিরুদ্ধে ফুলটেক্সট ক্যোয়ারীগুলি (আরটি ( অনুরোধ ট্র্যাকার ) টিকিট সংরক্ষণ করা ) কার্যকর হতে খুব দীর্ঘ সময় নিচ্ছে বলে মনে হচ্ছে। সংযুক্তি টেবিল (পুরো টেক্সট ডেটা সহ) প্রায় 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।
এর সাথে কোথায় যেতে হবে আমি সত্যিই নিশ্চিত নই।