পোস্টগ্রিস 9.1 ডাটাবেসে আমার কাছে table1
1.5 টাকার সারি এবং একটি কলাম সহ একটি টেবিল রয়েছে label
(এই প্রশ্নের জন্য সহজ সরল নাম)।
সেখানে একটি কার্যকরী ত্রিগ্রাম-সূচক রয়েছে lower(unaccent(label))
( সূচকে unaccent()
এটির ব্যবহারের অনুমতি দেওয়ার জন্য অচল করে দেওয়া হয়েছে)।
নিম্নলিখিত ক্যোয়ারী বেশ দ্রুত:
SELECT count(*) FROM table1
WHERE (lower(unaccent(label)) like lower(unaccent('%someword%')));
count
-------
1
(1 row)
Time: 394,295 ms
তবে নিম্নলিখিত কোয়েরিটি ধীর:
SELECT count(*) FROM table1
WHERE (lower(unaccent(label)) like lower(unaccent('%someword and some more%')));
count
-------
1
(1 row)
Time: 1405,749 ms
অনুসন্ধান আরও কঠোর হলেও আরও শব্দ যুক্ত করা এমনকি ধীর।
আমি প্রথম শব্দের জন্য একটি সাবকিউারি চালানোর জন্য একটি সাধারণ কৌশল চেষ্টা করেছি এবং তারপরে সম্পূর্ণ অনুসন্ধানের স্ট্রিং সহ একটি কোয়েরি করেছি, তবে (দুঃখের সাথে) ক্যোয়ারির পরিকল্পনাকারী আমার কৌশলগুলি দেখেছি:
EXPLAIN ANALYZE
SELECT * FROM (
SELECT id, title, label from table1
WHERE lower(unaccent(label)) like lower(unaccent('%someword%'))
) t1
WHERE lower(unaccent(label)) like lower(unaccent('%someword and some more%'));
টেবিল 1 এ বিটম্যাপ হ্যাপ স্ক্যান (ব্যয় = 16216.01..16220.04 সারি = 1 প্রস্থ = 212) (প্রকৃত সময় = 1824.017..1824.019 সারি = 1 লুপ = 1) পুনঃপরীক্ষার অবস্থা: ((নিম্ন (অবাস্তব ((লেবেল) :: পাঠ্য))) ~~ '% কিছু শব্দ%' :: পাঠ্য) এবং (নিম্ন (অবাস্তব ((লেবেল) :: পাঠ্য)))% '% কিছু শব্দ এবং আরও কিছু % ':: পাঠ্য)) -> টেবিল 1_লাবেল_হুন_গিন_টিগ্রামে বিটম্যাপ সূচক স্ক্যান (ব্যয় = 0.00..16216.01 সারি = 1 প্রস্থ = 0) (প্রকৃত সময় = 1823.900..1823.900 সারি = 1 লুপ = 1) সূচকের অবস্থা: ((নিম্ন (অচেতন ((লেবেল) :: পাঠ্য))) ~~ '% কিছু শব্দ%' :: পাঠ্য) এবং (নিম্ন (অবাস্তব ((লেবেল) :: পাঠ্য)))% '% কিছু শব্দ এবং আরও কিছু % ':: পাঠ্য)) মোট রানটাইম: 1824.064 এমএস
আমার চূড়ান্ত সমস্যাটি হ'ল অনুসন্ধানের স্ট্রিংটি একটি ওয়েব ইন্টারফেস থেকে আসে যা বেশ দীর্ঘ স্ট্রিং প্রেরণ করতে পারে এবং এটি বেশ ধীর হতে পারে এবং ডস ভেক্টরও গঠন করতে পারে।
সুতরাং আমার প্রশ্নগুলি হ'ল:
- কীভাবে ক্যারিয়ারটি গতিময় করবেন?
- এটি দ্রুততর করার জন্য কি এটিকে উপবিভাজনে ভাঙ্গার কোনও উপায় আছে?
- পোস্টগ্রিসের পরবর্তী সংস্করণটি আরও ভাল? (আমি 9.4 চেষ্টা করেছি এবং এটি দ্রুত বলে মনে হচ্ছে না: এখনও একই প্রভাব Maybe সম্ভবত পরবর্তী সংস্করণ?)
- অন্য একটি সূচক কৌশল প্রয়োজন হতে পারে?
unaccent
অপরিবর্তনীয় ঘোষণা করেছিলাম । আমি এই প্রশ্নের সাথে যোগ।
unaccent
মডিউলটি আপডেট করবেন তখন হ্যাকটি ওভাররাইট হয়েছে সে বিষয়ে সচেতন থাকুন । আমি এর পরিবর্তে কোনও ফাংশন র্যাপারের পরামর্শ দেওয়ার একটি কারণ।
unaccent()
অতিরিক্ত মডিউল দ্বারা সরবরাহ করাও রয়েছে এবং পোস্টগ্রিস ডিফল্টরূপে ফাংশনটিতে সূচিগুলি সমর্থন করে না কারণ এটি নেইIMMUTABLE
। আপনার অবশ্যই কিছু পরিবর্তন হয়েছে এবং আপনার প্রশ্নে আপনি ঠিক কী করেছেন তা উল্লেখ করা উচিত। আমার স্থায়ী পরামর্শ: stackoverflow.com/a/11007216/939860 । এছাড়াও, ট্রাইগ্রাম সূচিগুলি বাক্সের বাইরে কেস-সংবেদনশীল ম্যাচ সমর্থন করে। আপনি এটিকে সরল করতে পারেন:WHERE f_unaccent(label) ILIKE f_unaccent('%someword%')
- একটি ম্যাচিং সূচক সহ। বিশদ: স্ট্যাকওভারফ্লো . com / a / 28636000 / 939860 ।