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

पोस्टग्रेएसक्यूएल pg_trgm धीमे का उपयोग करके फिर पूर्ण स्कैन

tldr:ट्रिग्राम पैटर्न की खोज करने में अच्छा नहीं हो सकता है जिसमें एकल वर्ण को N बार दोहराया जाता है (जैसे 666666 ) क्योंकि केवल 1 गैर-टर्मिनल ट्रिग्राम मौजूद है और वह सकता खोज स्थान में उच्च आवृत्ति है।

जब जिन-इंडेक्स का उपयोग किया जाता है, तो पंक्तियों का बिटमैप मेमोरी में फिट होने के लिए बहुत बड़ा होता है, इसलिए इसके बजाय यह पृष्ठों के संदर्भ को संग्रहीत करता है, और डेटाबेस को इन पृष्ठों पर एक और पुन:जांच स्कैन करना पड़ता है। यदि पुन:जांचे गए पृष्ठों की संख्या कम है, तो अनुक्रमणिका-उपयोग अभी भी फायदेमंद है, हालांकि उच्च संख्या में पुन:जाँच पृष्ठों के साथ सूचकांक खराब प्रदर्शन करता है। यह आपके व्याख्या आउटपुट में निम्नलिखित पंक्तियों द्वारा हाइलाइट किया गया है

   Recheck Cond: (x ~~* '%666666%'::text)
   Rows Removed by Index Recheck: 36257910
   Heap Blocks: exact=39064 lossy=230594

समस्या विशेष रूप से आपकी खोज स्ट्रिंग के लिए है, अर्थात 666666 , परीक्षण डेटा के संबंध में।

यदि आप select pg_trgm('666666') , आप पाएंगे:

        show_trgm        
-------------------------
 {"  6"," 66","66 ",666}
(1 row)

पहले 3 ट्रिगर एक समान संदर्भ में भी उत्पन्न नहीं होंगे (उपयोगकर्ता द्वारा सुझाए गए सुधार jjanes ) . अनुक्रमणिका पर खोज करने पर 666 . वाले सभी पृष्ठ प्राप्त होते हैं . आप ... ilike '%666%' . के साथ व्याख्या विश्लेषण क्वेरी चलाकर इसे सत्यापित कर सकते हैं , और समान Heap Blocks प्राप्त करना ऊपर के रूप में आउटपुट।

यदि आप 123456 . पैटर्न के साथ खोज करते हैं , आप देखेंगे कि यह बहुत बेहतर प्रदर्शन करता है, क्योंकि यह खोज करने के लिए ट्रिगर का एक बड़ा सेट उत्पन्न करता है:

              show_trgm              
-------------------------------------
 {"  1"," 12",123,234,345,456,"56 "}
(1 row)

मेरी मशीन पर, मुझे निम्नलिखित मिलते हैं:

|------------------------------------|
| pattern | pages rechecked          |
|         | exact | lossy  | total   |
|------------------------------------|
| 123456  |   600 |        |    600  |
| 666666  | 39454 | 230592 | 270046* |
|    666  | 39454 | 230592 | 270046* |
|------------------------------------|
*this is rougly 85% of the total # of pages used for the table 't'

यहाँ व्याख्या आउटपुट है:

postgres=> explain analyze select * from t where x ~ '123456';
                                                        QUERY PLAN                                                        
--------------------------------------------------------------------------------------------------------------------------
 Bitmap Heap Scan on t  (cost=90.75..18143.92 rows=5000 width=22) (actual time=110.962..113.509 rows=518 loops=1)
   Recheck Cond: (x ~ '123456'::text)
   Rows Removed by Index Recheck: 83
   Heap Blocks: exact=600
   ->  Bitmap Index Scan on t_x_idx  (cost=0.00..89.50 rows=5000 width=0) (actual time=110.868..110.868 rows=601 loops=1)
         Index Cond: (x ~ '123456'::text)
 Planning time: 0.703 ms
 Execution time: 113.564 ms
(8 rows)

postgres=> explain analyze select * from t where x ~ '666666';
                                                         QUERY PLAN                                                          
-----------------------------------------------------------------------------------------------------------------------------
 Bitmap Heap Scan on t  (cost=54.75..18107.92 rows=5000 width=22) (actual time=137.143..18111.609 rows=462 loops=1)
   Recheck Cond: (x ~ '666666'::text)
   Rows Removed by Index Recheck: 36258389
   Heap Blocks: exact=39454 lossy=230592
   ->  Bitmap Index Scan on t_x_idx  (cost=0.00..53.50 rows=5000 width=0) (actual time=105.962..105.962 rows=593708 loops=1)
         Index Cond: (x ~ '666666'::text)
 Planning time: 0.420 ms
 Execution time: 18111.739 ms
(8 rows)

postgres=> explain analyze select * from t where x ~ '666';
                                                        QUERY PLAN                                                         
---------------------------------------------------------------------------------------------------------------------------
 Bitmap Heap Scan on t  (cost=54.75..18107.92 rows=5000 width=22) (actual time=102.813..17285.086 rows=593708 loops=1)
   Recheck Cond: (x ~ '666'::text)
   Rows Removed by Index Recheck: 35665143
   Heap Blocks: exact=39454 lossy=230592
   ->  Bitmap Index Scan on t_x_idx  (cost=0.00..53.50 rows=5000 width=0) (actual time=96.100..96.100 rows=593708 loops=1)
         Index Cond: (x ~ '666'::text)
 Planning time: 0.500 ms
 Execution time: 17300.440 ms
(8 rows)


  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. Postgres डेटाबेस से सभी फ़ंक्शन ड्रॉप करें

  3. यदि कोई एयरलाइन Postgresql में मेरे DB के सभी हवाई अड्डों से प्रस्थान करती है तो मैं कैसे प्रदर्शित कर सकता हूँ?

  4. जब ऑटोवैक्यूम वैक्यूम नहीं करता है

  5. अतिव्यापी चर के साथ अलग-अलग तिथियों के साथ कई पंक्तियों को मिलाएं (पहली और अंतिम परिवर्तन तिथियों को पकड़ने के लिए)