私は本質的にこれである非常に単純なクエリを持っています:
Select * from my_table Where my_field != '';
テーブルには約 40,000 行あり、「my_field」列はテキスト フィールドです (varchar 255)
クエリの実行には約 39,000 ミリ秒かかります。空の文字列ではないものについて各レコードを調べる必要があるためだと思います。my_field 列にインデックスを付けましたが、何も変更されていません。
念のため、クエリプランは次のとおりです。
"Seq Scan on my_table (cost=0.00..3468.91 rows=39744 width=459)"
" Filter: ((my_field)::text <> ''::text)"
ここで私の最良の選択肢は何ですか?
説明する 分析する:
"Seq Scan on my_table (cost=0.00..3468.91 rows=39730 width=459) (actual time=0.021..13.763 rows=39714 loops=1)"
" Filter: ((my_field)::text <> ''::text)"
"Total runtime: 14.856 ms"
これらのインデックスを追加しました
CREATE INDEX aa_idx ON my_table(my_field);
CREATE INDEX aa_idx ON my_table(my_field) WHERE my_field <> '';
Postgres 9.1 です
編集: [2013-02-26 00:04GMT]
チェック制約として「my_field」にパーティションを作成する利点はありますか?
CHECK(my_field = '') のようなもので、パーティション 2 では CHECK(my_field != '')
私が持っているのは、行がたくさんあるテーブルだけだと思いますか?しかし、これは、パーティションに約 80% のデータが含まれていても、select != '' クエリの実行速度が大幅に向上することを意味するでしょうか?
全文検索も調べましたが、これはOTTのようでした。列を 0 または 1 (bool) の int にすることも検討しましたが、これはパフォーマンスに影響しませんでした (= 1 はまだ多くの行を返すためだと思います)。