मैं शीर्षक में गलत सवाल पूछ सकता हूं। यहाँ तथ्य हैं:
मेरे ग्राहक सेवा लोक को हमारे Django- आधारित साइट के प्रशासन इंटरफ़ेस पर ग्राहक के लुकअप करते समय धीमी प्रतिक्रिया समय के बारे में शिकायत है।
हम Postgres का उपयोग कर रहे हैं 8.4.6। मैंने धीमी क्वेरी लॉग करना शुरू किया, और इस अपराधी की खोज की:
SELECT COUNT(*) FROM "auth_user" WHERE UPPER("auth_user"."email"::text) LIKE UPPER(E'%deyk%')
इस क्वेरी को चलाने में 32 सेकंड से अधिक समय लग रहा है। यहाँ क्वेरी योजना EXPLAIN द्वारा प्रदान की गई है:
QUERY PLAN
Aggregate (cost=205171.71..205171.72 rows=1 width=0)
-> Seq Scan on auth_user (cost=0.00..205166.46 rows=2096 width=0)
Filter: (upper((email)::text) ~~ '%DEYK%'::text)
क्योंकि यह Django ORM द्वारा Django QuerySet द्वारा बनाई गई एक क्वेरी है जो Django एडमिन एप्लिकेशन द्वारा जेनरेट की गई है, मेरे पास खुद इस क्वेरी पर कोई नियंत्रण नहीं है। एक सूचकांक तार्किक समाधान की तरह लगता है। मैंने इसे गति देने के लिए एक इंडेक्स बनाने की कोशिश की, लेकिन इससे कोई फर्क नहीं पड़ा:
CREATE INDEX auth_user_email_upper ON auth_user USING btree (upper(email::text))
मैं क्या गलत कर रहा हूं? मैं इस क्वेरी को कैसे गति दे सकता हूं?