पोस्टग्रेज 9.2 या बाद के संस्करण आम तौर पर यह समझने के लिए पर्याप्त स्मार्ट है कि स्थिति
WHERE name LIKE '%%'
चयनात्मक नहीं है और जीआईएसटी सूचकांक की अनदेखी करते हुए अनुक्रमिक स्कैन का सहारा लेता है - यहां तक कि तैयार बयानों के साथ भी। आप करते हैं हालांकि, बेकार की स्थिति के लिए एक छोटी सी कीमत चुकाएं।
Postgres 9.1 या इससे पहले के संस्करण में मैं विशेष मामले के लिए एक अलग क्वेरी बनाऊंगा।
नोट्स की तुलना करें PREPARE
. के लिए अनुभाग संस्करणों के लिए मैनुअल में विवरण 9.1मजबूत>
, 9.2
और 9.3
।
स्वयं सत्यापित करें
स्टेटमेंट तैयार करें और EXPLAIN ANALYZE
run चलाएं परीक्षण करने के लिए:
PREPARE plan1 (text) AS
SELECT * FROM file
WHERE name LIKE $1;
EXPLAIN ANALYZE EXECUTE plan1('%123%');
EXPLAIN ANALYZE EXECUTE plan1('%%');
योजनाएं आमतौर पर सत्र की अवधि के लिए कैश की जाती हैं।
वैकल्पिक क्वेरी
आपके द्वारा चलाए जा रहे संस्करण के बावजूद, यदि आप हमेशा एक पूर्ण पाठ खोज (बाएं और दाएं वाइल्डकार्ड) करते हैं, तो यह क्वेरी तैयार कथन के लिए तेज़ होनी चाहिए:
SELECT * FROM files WHERE name LIKE ('%' || $1 || '%');
और बिना जोड़े वाइल्डकार्ड के पैटर्न पास करें (%
), बेशक। इस तरह, Postgres योजना बनाते समय वाइल्डकार्ड में संलग्न पैटर्न की अपेक्षा करना जानता है।
->SQLfiddle डेमो।
खाली LIKE के लिए अनुक्रमिक स्कैन और दो योजनाओं के बीच प्रदर्शन अंतर पर ध्यान दें।
SQLfiddle लोड आदि के आधार पर बहुत भिन्न होता है। एक एकल रन विश्वसनीय नहीं हो सकता है। अपने परिवेश में बेहतर परीक्षण करें और कैश को संतृप्त करने और शोर को खत्म करने के लिए प्रत्येक कथन को दो बार चलाएं।