আপনার জিজ্ঞাসাটি সর্বোত্তম is সিনট্যাক্স খুব বেশি সংক্ষিপ্ত হবে না, ক্যোয়ারী খুব দ্রুত পাবে না:
SELECT name
FROM spelers
WHERE name LIKE 'B%' OR name LIKE 'D%'
ORDER BY 1;
যদি আপনি সত্যিই বাক্য সংক্ষিপ্ত করতে চান তবে শাখাগুলি সহ একটি নিয়মিত প্রকাশটি ব্যবহার করুন :
...
WHERE name ~ '^(B|D).*'
বা কিছুটা দ্রুত, একটি অক্ষর শ্রেণীর সাথে :
...
WHERE name ~ '^[BD].*'
সূচক ছাড়াই একটি দ্রুত পরীক্ষা SIMILAR TOআমার পক্ষে উভয় ক্ষেত্রে তুলনায় দ্রুত ফলাফল দেয় ।
যথাযথ বি-ট্রি সূচক সহ, LIKEবিশালতার আদেশে এই রেসটি জয়ী।
ম্যানুয়ালটিতে প্যাটার্ন মিলের বিষয়ে প্রাথমিক বিষয়গুলি পড়ুন ।
উচ্চতর পারফরম্যান্সের জন্য সূচক
আপনি যদি পারফরম্যান্স নিয়ে উদ্বিগ্ন হন তবে বড় টেবিলগুলির জন্য এই জাতীয় সূচি তৈরি করুন:
CREATE INDEX spelers_name_special_idx ON spelers (name text_pattern_ops);
আকারের আদেশ দিয়ে এই ধরণের ক্যোয়ারী দ্রুততর করে তোলে। লোকাল-নির্দিষ্ট সাজানোর ক্রমের জন্য বিশেষ বিবেচনাগুলি প্রযোজ্য। ম্যানুয়ালটিতে অপারেটর ক্লাস সম্পর্কে আরও পড়ুন । আপনি যদি স্ট্যান্ডার্ড "সি" লোকেল ব্যবহার করেন (বেশিরভাগ লোকেরা করেন না), একটি সরল সূচক (ডিফল্ট অপারেটর শ্রেণি সহ) করবে।
এই জাতীয় সূচকটি কেবল বাম-অ্যাঙ্কার্ড প্যাটার্নের জন্য ভাল (স্ট্রিংয়ের শুরু থেকে মিলছে)।
SIMILAR TOবা বেসিক বাম-অ্যাঙ্কার্ড এক্সপ্রেশন সহ নিয়মিত প্রকাশগুলিও এই সূচকটি ব্যবহার করতে পারে। তবে শাখা বা চরিত্রের ক্লাসগুলির সাথে নয় (অন্ততপক্ষে পোস্টগ্রাইএসকিউএল 9.0 এ আমার পরীক্ষাগুলিতে)।(B|D)[BD]
ত্রিগ্রামের মিল বা পাঠ্য অনুসন্ধানে বিশেষ জিন বা জিআইএসটি সূচকগুলি ব্যবহার করা হয়েছে।
প্যাটার্ন ম্যাচিং অপারেটরগুলির ওভারভিউ
LIKE( ~~) সহজ এবং দ্রুত তবে এর ক্ষমতাগুলিতে সীমিত।
ILIKE( ~~*) কেস সংবেদনশীল বৈকল্পিক।
pg_trgm উভয়ের জন্য সূচী সমর্থন প্রসারিত করে।
~ (নিয়মিত অভিব্যক্তি ম্যাচ) শক্তিশালী তবে আরও জটিল এবং বেসিক এক্সপ্রেশনগুলির চেয়ে বেশি কিছু জন্য ধীর হতে পারে।
SIMILAR TOশুধু অর্থহীন । একটি অদ্ভুত অর্ধবৃত্ত LIKEএবং নিয়মিত অভিব্যক্তি। আমি কখনই এটি ব্যবহার করি না। নিচে দেখ.
% হ'ল "মিল" অপারেটর, অতিরিক্ত মডিউল দ্বারা সরবরাহ করাpg_trgm। নিচে দেখ.
@@এটি পাঠ্য অনুসন্ধান অপারেটর। নিচে দেখ.
pg_trgm - ট্রিগার মিল
পোস্টগ্রেএসকিউএল 9.1 এর সাথে শুরু করে আপনি কোনও জিআইএন বা জিআইএসটি সূচক ব্যবহার করে যে কোনও / প্যাটার্ন (এবং সাধারণ রেজিপ্যাক্স প্যাটার্নগুলি ) এর pg_trgmজন্য সূচী সহায়তা সরবরাহ করতে এক্সটেনশনটিকে সহজতর করতে পারেন । LIKEILIKE~
বিশদ, উদাহরণ এবং লিঙ্কগুলি:
pg_trgmএই অপারেটরগুলি প্রদান করে :
% - "মিল" অপারেটর
<%( %>চালক:) - পোস্টগ্রাজ 9.6 বা তার পরে "ওয়ার্ড_সিমারিটি" অপারেটর
<<%( %>>অভিযাত্রী:) - 11 বা তার পরে পোস্টগ্রিসে "কড়া_শব্দ_সমন্থিতা" অপারেটর
টেক্সট অনুসন্ধান
পৃথক পরিকাঠামো এবং সূচক প্রকারের সাথে এক বিশেষ ধরণের প্যাটার্নের মিল। এটি অভিধান এবং স্টেমিং ব্যবহার করে এবং দস্তাবেজগুলিতে বিশেষত প্রাকৃতিক ভাষার জন্য শব্দগুলি সন্ধান করার জন্য একটি দুর্দান্ত সরঞ্জাম।
উপসর্গ মিলও সমর্থিত:
পোস্টগ্রিস 9.6 থেকে বাক্যাংশ অনুসন্ধানের পাশাপাশি :
বিবেচনা করুন ম্যানুয়াল ভূমিকা এবং অপারেটরদের এবং ফাংশন ওভারভিউ ।
অস্পষ্ট স্ট্রিং মিলের জন্য অতিরিক্ত সরঞ্জাম
অতিরিক্ত মডিউল ফাজিস্ট্রমেটম আরও কয়েকটি বিকল্প সরবরাহ করে তবে কার্য সম্পাদন উপরের সমস্তটির চেয়ে সাধারণত নিকৃষ্ট হয়।
বিশেষত, levenshtein()ফাংশনের বিভিন্ন বাস্তবায়ন সহায়ক হতে পারে।
নিয়মিত এক্সপ্রেশন ( ~) সবসময় কেন দ্রুত হয় SIMILAR TO?
উত্তরটি সহজ। SIMILAR TOঅভিব্যক্তিগুলি অভ্যন্তরীণভাবে নিয়মিত প্রকাশে আবার লেখা হয়। সুতরাং, প্রতিটি SIMILAR TOঅভিব্যক্তির জন্য, কমপক্ষে একটি দ্রুত নিয়মিত এক্সপ্রেশন থাকে (যা এক্সপ্রেশনটি পুনরায় লেখার ওভারহেড সংরক্ষণ করে)। SIMILAR TO কখনও ব্যবহার করে কোনও পারফরম্যান্স লাভ হয় না ।
এবং LIKE( ~~) দিয়ে করা যায় এমন সাধারণ এক্সপ্রেশন LIKEযেভাবেই দ্রুত হয় ।
SIMILAR TOএটি কেবল পোস্টগ্রাইএসকিউএলে সমর্থিত কারণ এটি এসকিউএল স্ট্যান্ডার্ডের প্রারম্ভিক খসড়াগুলিতে শেষ হয়েছিল। তারা এখনও এ থেকে মুক্তি পান নি। তবে এটি সরানোর এবং এর পরিবর্তে রিজেপএক্স ম্যাচগুলি অন্তর্ভুক্ত করার পরিকল্পনা রয়েছে - বা তাই শুনেছি।
EXPLAIN ANALYZEএটি প্রকাশ করে। যে কোনও টেবিলে নিজে চেষ্টা করুন!
EXPLAIN ANALYZE SELECT * FROM spelers WHERE name SIMILAR TO 'B%';
প্রকাশিত:
...
Seq Scan on spelers (cost= ...
Filter: (name ~ '^(?:B.*)$'::text)
SIMILAR TOনিয়মিত অভিব্যক্তি ( ~) দিয়ে আবার লেখা হয়েছিল ।
এই বিশেষ ক্ষেত্রে চূড়ান্ত কর্মক্ষমতা
তবে EXPLAIN ANALYZEআরও প্রকাশ করে। পূর্বে উল্লিখিত সূচীটি সহ চেষ্টা করুন:
EXPLAIN ANALYZE SELECT * FROM spelers WHERE name ~ '^B.*;
প্রকাশিত:
...
-> Bitmap Heap Scan on spelers (cost= ...
Filter: (name ~ '^B.*'::text)
-> Bitmap Index Scan on spelers_name_text_pattern_ops_idx (cost= ...
Index Cond: ((prod ~>=~ 'B'::text) AND (prod ~<~ 'C'::text))
অভ্যন্তরীণভাবে, একটি সূচক (যে স্থানীয়ের সচেতন নয় সঙ্গে text_pattern_opsবা ব্যবহার লোকেল C:) সহজ বাঁ-নোঙর এক্সপ্রেশন এই টেক্সট প্যাটার্ন অপারেটরদের সঙ্গে পুনর্লিখিত হয় ~>=~, ~<=~, ~>~, ~<~। এই ক্ষেত্রে দেখা যায় ~, ~~বা SIMILAR TOসমান মনে করে।
একই বা সাথে varcharপ্রকারের সূচকগুলির ক্ষেত্রেও এটি সত্য ।varchar_pattern_opscharbpchar_pattern_ops
সুতরাং, আসল প্রশ্নের ক্ষেত্রে প্রয়োগ করা, এটি সবচেয়ে দ্রুততম উপায় :
SELECT name
FROM spelers
WHERE name ~>=~ 'B' AND name ~<~ 'C'
OR name ~>=~ 'D' AND name ~<~ 'E'
ORDER BY 1;
অবশ্যই, যদি আপনার নিকটবর্তী প্রাথমিকের সন্ধানের ঘটনা ঘটে তবে আপনি আরও সহজ করতে পারেন:
WHERE name ~>=~ 'B' AND name ~<~ 'D' -- strings starting with B or C
এর সাধারণ ব্যবহার ~বা লাভ ~~খুব সামান্য is যদি পারফরম্যান্সটি আপনার সর্বজনীন প্রয়োজন না হয় তবে আপনার কেবল স্ট্যান্ডার্ড অপারেটরদের সাথে থাকা উচিত - আপনার ইতিমধ্যে প্রশ্নটিতে যা আছে তা পৌঁছে।
s.nameইন্ডেক্স?