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

Postgres के साथ Django के लिए टेक्स्ट क्वेरी की गिनती में सुधार कैसे करें

यदि आप SearchRank को छोड़ देते हैं और केवल क्वेरी का उपयोग करके फ़िल्टर करें यह GIN अनुक्रमणिका का उपयोग करेगा और बहुत तेज़ प्रदर्शन करेगा:

query = SearchQuery(termo,config='portuguese')
entries = Article.objects.filter(search_vector=query)

आप .explain() जोड़ सकते हैं। क्वेरी पर एक नज़र डालने के लिए और यह देखने के लिए कि क्या अनुक्रमणिका का उपयोग किया गया है:

print(entries.explain(analyze=True))

आपको बिटमैप हीप स्कैन का उपयोग करके क्वेरी देखनी चाहिए और निष्पादन समय बहुत तेज़ होना चाहिए।

Bitmap Heap Scan on your_table
...
Planning Time: 0.176 ms Execution Time: 0.453 ms

जब आप टिप्पणी करते हैं जैसे आप ऊपर हैं, तो आप प्रत्येक . पर टिप्पणी कर रहे हैं Article ऑब्जेक्ट - इसलिए पोस्टग्रेज़ एक सेक स्कैन (या समानांतर सेक स्कैन) करने का निर्णय लेता है जो यह तय करता है कि यह अधिक कुशल है। अधिक जानकारी यहां

जोड़ने का प्रयास करें .explain(verbose=True) या .explain(analyze=True) तुलना करने के लिए अपनी प्रारंभिक SearchRank विधि से।

query = SearchQuery(termo,config='portuguese')
search_rank = SearchRank(F('search_vector'), query)
entries = Article.objects.annotate(rank=search_rank).filter(search_vector=query).order_by('-rank')

print(entries.explain(analyze=True))

मैं स्वयं इस मुद्दे का सामना कर रहा हूं, जिसमें 990k प्रविष्टियों वाली एक तालिका है जिसमें ~ 10 सेकंड लगते हैं। यदि आप किसी अन्य फ़ील्ड का उपयोग करके एनोटेशन से पहले क्वेरी को फ़िल्टर कर सकते हैं - यह क्वेरी प्लानर को इंडेक्स का उपयोग करने की ओर वापस धकेल देगा।

इस उत्तर से




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. pgmemcache बनाम अनंत कैश

  2. पोस्टग्रेज जांचें कि क्या आईपी (इनेट) आईपी रेंज की सूची में है

  3. अन्य कॉलम के आधार पर एक कॉलम में एक वास्तविक संख्या डालें पुराने INSERTs

  4. ResetDjango postgresql डेटाबेस? फ्लश काम नहीं करता

  5. Ubuntu 18.04 पर PostgreSQL 11 के साथ शुरुआत करना