Eu posso estar fazendo a pergunta errada no título. Aqui estão os fatos:
Meu pessoal de atendimento ao cliente está reclamando de tempos de resposta lentos ao fazer pesquisas de clientes na interface de administração do nosso site baseado em Django.
Estamos usando o Postgres 8.4.6. Comecei a registrar consultas lentas e descobri o culpado:
SELECT COUNT(*) FROM "auth_user" WHERE UPPER("auth_user"."email"::text) LIKE UPPER(E'%deyk%')
Esta consulta está demorando mais de 32 segundos para ser executada. Aqui está o plano de consulta fornecido pelo 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)
Como esta é uma consulta gerada pelo Django ORM a partir de um Django QuerySet gerado pelo aplicativo Admin do Django, não tenho controle sobre a própria consulta. Um índice parece ser a solução lógica. Tentei criar um índice para acelerar isso, mas não fez diferença:
CREATE INDEX auth_user_email_upper ON auth_user USING btree (upper(email::text))
O que estou fazendo errado? Como posso acelerar esta consulta?