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

PostgreSQL GIN अनुक्रमणिका pg_trgm के लिए GIST से धीमी है?

कुछ मुद्दे सामने आते हैं:

सबसे पहले, पोस्टग्रेज के वर्तमान संस्करण में अपग्रेड करने पर विचार करें . लिखने के समय यह पीजी 9.6 या पीजी 10 (वर्तमान में बीटा) है। Pg 9.4 के बाद से GIN अनुक्रमणिका, अतिरिक्त मॉड्यूल pg_trgm और सामान्य रूप से बड़े डेटा के लिए कई सुधार हुए हैं।

इसके बाद, आपको और भी बहुत कुछ चाहिए RAM , विशेष रूप से एक उच्च work_mem स्थापना। मैं इस लाइन से EXPLAIN . में बता सकता हूं आउटपुट:

Heap Blocks: exact=7625 lossy=223807

"हानिकारक" बिटमैप हीप स्कैन . के विवरण में (आपके विशेष नंबरों के साथ) work_mem . की भारी कमी को दर्शाता है . Postgres केवल पंक्ति सूचकों के बजाय बिटमैप अनुक्रमणिका स्कैन में ब्लॉक पते एकत्र करता है क्योंकि यह आपके कम work_mem के साथ तेज़ होने की उम्मीद है सेटिंग (रैम में सटीक पते नहीं रख सकते)। निम्नलिखित बिटमैप हीप स्कैन में कई और गैर-योग्यता वाली पंक्तियों को फ़िल्टर करना होगा इस तरह। इस संबंधित उत्तर में विवरण है:

लेकिन work_mem सेट न करें भी पूरी स्थिति पर विचार किए बिना उच्च:

अन्य समस्याएं हो सकती हैं, जैसे इंडेक्स या टेबल ब्लोट या अधिक कॉन्फ़िगरेशन बाधाएं। लेकिन अगर आप केवल इन दो मदों को ठीक करते हैं, तो क्वेरी बहुत होनी चाहिए पहले से तेज़।

साथ ही, क्या आपको वास्तव में उदाहरण में सभी 40k पंक्तियों को पुनर्प्राप्त करने की आवश्यकता है? आप शायद एक छोटा LIMIT जोड़ना चाहते हैं क्वेरी के लिए और इसे "निकटतम-पड़ोसी" खोज बनाएं - इस मामले में एक जीआईएसटी इंडेक्स बेहतर विकल्प है, क्योंकि वह जीआईएसटी इंडेक्स के साथ तेज होना चाहिए। उदाहरण:




  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. रेल में LOWER (users.username) पर इंडेक्स कैसे बनाएं (पोस्टग्रेज का उपयोग करके)

  3. डॉकर-लिखें पर्यावरण चर

  4. Postgresql महीनों की जनरेट_सीरीज़

  5. विंडोज़ पर PostgreSQL को मैन्युअल रूप से कैसे कॉन्फ़िगर और प्रारंभ करें?