私はdjangoを使用していますが、すべてのクエリはdjangoによって作成されているため、手書きのクエリはありません...
のテーブルがBillRecords
あり、フィールドがありますsubscriberno
。私のdjangoフィルターでは、次のようなフィルタークエリを使用します。
BillRecords.objects.filter(subscriberno__icontains='123456')
subscriberno
顧客が実数のかなり短縮されたバージョンであるかもしれないと言ったので...
そのフィルターは次のようなクエリを出力します。
SELECT "subscriberno" FROM "BillRecords" WHERE UPPER("subscriberno"::text) LIKE UPPER(E'%123456%');
subscriberno
一部の数値にはアルファと一部の特殊文字が含まれているため、は文字フィールドです。
私のデータベースには、同僚によって作成された、その列の2つのインデックスがあります。
"BillRecords_subscriberno" btree (subscriberno)
"BillRecords_fsubscriberno_like" btree (subscriberno varchar_pattern_ops)
このようなクエリに2つのインデックスを使用するのは論理的だと思います。私たちのすべてのdjangoフィルターはicontains
、上記のようなクエリを作成するために使用します。
クエリのPostgres分析は次のとおりです。
Seq Scan on BillRecords (cost=0.00..159782.40 rows=370 width=15) (actual time=579.637..3705.079 rows=10 loops=1)
Filter: (upper((subscriberno)::text) ~~ '%123456%'::text)
Total runtime: 3705.106 ms
(3 rows)
したがって、私が見る限り、インデックスは使用されていません。インデックスusegaはデータの挿入と更新にコストがかかるため、(この分析からわかる限り)使用されていない2つのインデックスを持つことは論理的ではないように思われました。
djangoが同様のicontanis
フィルターに対して異なるクエリを出力する可能性はありますか?または、私のインデックスはまったく役に立たないのですか?