2

Postgres (すべて localhost) で GIN インデックスを使用して全文検索を行っています。独自のクエリを作成して psql で実行すると、応答時間がEXPLAIN ANALYZE長くなり、インデックス ヒット (woohoo) が報告されます。同じ検索用語を使用して Django 管理者の検索ボックスを介してクエリを実行すると、インデックスがスキャンされず、クエリが完了するまでに永遠に時間がかかります。

私のインデックスは、完全に素晴らしい pg_trgm Postgres 拡張機能を介して作成されます。

CREATE INDEX name_gin ON entity USING gin (name gin_trgm_ops);

このクエリはインデックスにヒットし、90 万件のフルテキスト レコードを検索するのに 84ミリ秒という驚異的な時間を要します。

SELECT COUNT(*) 
FROM entity 
WHERE name LIKE UPPER('%dubteeeff%') 
 AND name LIKE UPPER('%django%');

Django Admin インターフェイスによって作成されたものとまったく同じクエリには、938msかかります。

SELECT COUNT(*) 
FROM entity 
WHERE UPPER("entity"."name"::text) LIKE UPPER('%dubteeeff%') 
  and UPPER("entity"."name"::text) LIKE UPPER('%django%');`

唯一の違いは、列が参照される方法のようです-私はDjangoとPostgresにかなり慣れていません-Postgres構成設定またはDjango管理QuerySet-something、またはこれを高速化するためにオーバーライドまたは変更できるRawQueryがあります上?管理ページがせいぜい遅くなりたくないし、最悪の場合、サイトの残りの部分を引きずり下ろしたくありません。

前もって感謝します。

4

2 に答える 2

4

Django が生成している大文字と小文字を区別しない検索ではentity(upper(name))なく、インデックスを追加する必要があるようです。entity(name)

于 2013-01-11T19:18:49.720 に答える
0

これはおそらく、Postgres で COUNT(*) が遅いという問題ですか? Postgres の既知の問題であるため、正確な数ではなく推定値を返すようにクエリを変更することをお勧めします。

于 2013-01-11T18:42:20.150 に答える