Sample Header Ad - 728x90

How to create an index to speed up an aggregate LIKE query on an expression?

30 votes
2 answers
34494 views
I may be asking the wrong question in the title. Here are the facts: My customer service folk have been complaining about slow response times when doing customer lookups on the administration interface of our Django-based site. We're using Postgres 8.4.6. I started logging slow queries, and discovered this culprit: SELECT COUNT(*) FROM "auth_user" WHERE UPPER("auth_user"."email"::text) LIKE UPPER(E'%deyk%') This query is taking upwards of 32 seconds to run. Here's the query plan provided by 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) Because this is a query generated by the Django ORM from a Django QuerySet generated by the Django Admin application, I don't have any control over the query itself. An index seems like the logical solution. I tried creating an index to speed this up, but it hasn't made a difference: CREATE INDEX auth_user_email_upper ON auth_user USING btree (upper(email::text)) What am I doing wrong? How can I speed up this query?
Asked by David Eyk (537 rep)
Aug 9, 2011, 11:04 PM
Last activity: Aug 1, 2023, 06:09 PM