Возможно, я задаю не тот вопрос в названии. Вот факты:
Мои специалисты по обслуживанию клиентов жалуются на медленное время отклика при поиске клиентов в интерфейсе администрирования нашего сайта на 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 Admin, я не имею никакого контроля над самим запросом. Индекс кажется логичным решением. Я попытался создать индекс, чтобы ускорить это, но это не имело значения:
CREATE INDEX auth_user_email_upper ON auth_user USING btree (upper(email::text))
Что я делаю неправильно? Как я могу ускорить этот запрос?