PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

PostgreSQL LIKE क्वेरी प्रदर्शन विविधताएं

FTS LIKE का समर्थन नहीं करता

पहले स्वीकृत उत्तर गलत था। पूर्ण पाठ खोज इसकी पूर्ण पाठ अनुक्रमणिका के साथ नहीं है LIKE . के लिए ऑपरेटर बिल्कुल भी, इसके अपने ऑपरेटर हैं और मनमाने ढंग से तारों के लिए काम नहीं करते हैं। यह शब्दों . पर कार्य करता है शब्दकोशों और स्टेमिंग के आधार पर। यह करता है समर्थन शब्दों के लिए उपसर्ग मिलान , लेकिन LIKE . के साथ नहीं ऑपरेटर:

  • GIN अनुक्रमित TSVECTOR कॉलम से आंशिक मिलान प्राप्त करें

ट्रिग्राम इंडेक्स LIKE . के लिए

अतिरिक्त मॉड्यूल स्थापित करें pg_trgm जो सभी LIKE को सपोर्ट करने के लिए GIN और GiST ट्रिग्राम इंडेक्स के लिए ऑपरेटर क्लासेस प्रदान करता है और ILIKE पैटर्न , केवल लेफ्ट-एंकर वाले ही नहीं:

उदाहरण सूचकांक:

CREATE INDEX tbl_col_gin_trgm_idx  ON tbl USING gin  (col gin_trgm_ops);

या:

CREATE INDEX tbl_col_gist_trgm_idx ON tbl USING gist (col gist_trgm_ops);
  • जीआईएसटी और जीआईएन इंडेक्स के बीच अंतर

उदाहरण क्वेरी:

SELECT * FROM tbl WHERE col LIKE '%foo%';   -- leading wildcard
SELECT * FROM tbl WHERE col ILIKE '%foo%';  -- works case insensitively as well

ट्रिग्राम? छोटे तारों के बारे में क्या?

3 अक्षरों से कम . वाले शब्द अनुक्रमित मूल्यों में अभी भी काम करते हैं। मैनुअल:

<ब्लॉकक्वॉट>

स्ट्रिंग में निहित ट्रिग्राम के सेट को निर्धारित करते समय प्रत्येक शब्द को दो रिक्त स्थान उपसर्ग और एक रिक्त स्थान माना जाता है।

और 3 से कम अक्षरों वाले खोज पैटर्न? मैनुअल:

<ब्लॉकक्वॉट>

दोनों के लिए LIKE और रेगुलर-एक्सप्रेशन खोजें, ध्यान रखें कि बिना निकालने योग्य ट्रिगर वाला पैटर्न एक पूर्ण-इंडेक्स स्कैन में बदल जाएगा।

मतलब, वह इंडेक्स / बिटमैप इंडेक्स स्कैन अभी भी काम करता है (तैयार स्टेटमेंट के लिए क्वेरी प्लान नहीं टूटेगा), यह सिर्फ आपको बेहतर प्रदर्शन नहीं खरीदेगा। आम तौर पर कोई बड़ा नुकसान नहीं होता है, क्योंकि 1- या 2-अक्षर वाले तार शायद ही चयनात्मक होते हैं (अंतर्निहित तालिका मिलान के कुछ प्रतिशत से अधिक) और सूचकांक समर्थन शुरू में प्रदर्शन में सुधार नहीं करेगा, क्योंकि एक पूर्ण तालिका स्कैन तेज है।


text_pattern_ops उपसर्ग मिलान के लिए

केवल बाएं-एंकर . के लिए पैटर्न (कोई अग्रणी वाइल्डकार्ड नहीं) आपको btree अनुक्रमणिका के लिए उपयुक्त ऑपरेटर वर्ग के साथ इष्टतम मिलता है:text_pattern_ops या varchar_pattern_ops . मानक पोस्टग्रेज की दोनों अंतर्निहित विशेषताएं, किसी अतिरिक्त मॉड्यूल की आवश्यकता नहीं है। समान प्रदर्शन, लेकिन बहुत छोटा सूचकांक।

उदाहरण अनुक्रमणिका:

CREATE INDEX tbl_col_text_pattern_ops_idx ON tbl(col text_pattern_ops);

उदाहरण क्वेरी:

SELECT * FROM tbl WHERE col LIKE 'foo%';  -- no leading wildcard

या , अगर आपको अपना डेटाबेस 'C' . के साथ चलाना चाहिए लोकेल (प्रभावी रूप से नहीं लोकेल), फिर सब कुछ वैसे भी बाइट क्रम के अनुसार क्रमबद्ध किया जाता है और डिफ़ॉल्ट ऑपरेटर वर्ग के साथ एक सादा बीट्री इंडेक्स काम करता है।

dba.SE पर इन संबंधित उत्तरों में अधिक विवरण, स्पष्टीकरण, उदाहरण और लिंक:

  • PostgreSQL में LIKE, SIMILAR TO या रेगुलर एक्सप्रेशन से मिलान करने वाला पैटर्न
  • LIKE कैसे कार्यान्वित किया जाता है?
  • PostgreSQL के साथ समान स्ट्रिंग्स को शीघ्रता से ढूँढना


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. एसएसएल के माध्यम से पाइथन के साथ रिमोट पोस्टग्रेएसक्यूएल डेटाबेस से कैसे कनेक्ट करें

  2. Ansible PostgreSQL को प्यार करता है

  3. PostgreSQL डेटाबेस में SQL डंप आयात करें

  4. पोस्टग्रेएसक्यूएल क्या है?

  5. PostgreSQL फ़ंक्शन से SETOF पंक्तियाँ लौटाएँ