タイトルに間違った質問をしている可能性があります。事実は次のとおりです。
カスタマーサービスの担当者は、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 Adminアプリケーションによって生成されたDjango QuerySetからDjango ORMによって生成されたクエリなので、クエリ自体を制御することはできません。インデックスは論理的なソリューションのようです。これを高速化するためにインデックスを作成しようとしましたが、違いはありません。
CREATE INDEX auth_user_email_upper ON auth_user USING btree (upper(email::text))
何が間違っていますか?このクエリを高速化するにはどうすればよいですか?