2

この部分インデックスを考えると:

CREATE INDEX orders_id_created_at_index 
   ON orders(id) WHERE created_at < '2013-12-31';

このクエリはインデックスを使用しますか?

SELECT * 
FROM orders 
WHERE id = 123 AND created_at = '2013-10-12';

ドキュメントによると、「クエリの WHERE 条件がインデックスの述語を数学的に意味することをシステムが認識できる場合にのみ、クエリで部分インデックスを使用できます」。

それは、インデックスが使用されるか使用されないことを意味しますか?

4

1 に答える 1

3

確認できます。はい、使用されます。次のようなクエリで確認するために、SQLフィドルを作成しました。

create table orders(id int, created_at date);

CREATE INDEX orders_id_created_at_index ON orders(id) WHERE created_at < '2013-12-31';

insert into orders
select
    (random()*500)::int, '2013-01-01'::date + ((random() * 200)::int || ' day')::interval
from generate_series(1, 10000) as g

SELECT * FROM orders WHERE id = 123 AND created_at = '2013-10-12';
SELECT * FROM orders WHERE id = 123 AND created_at = '2014-10-12';

sql fiddle demo

これらのクエリの実行計画を確認すると、最初のクエリが次のように表示されます。

Bitmap Heap Scan on orders (cost=4.39..40.06 rows=1 width=8) Recheck Cond: ((id = 123) AND (created_at < '2013-12-31'::date)) Filter: (created_at = '2013-10-12'::date)
-> Bitmap Index Scan on orders_id_created_at_index (cost=0.00..4.39 rows=19 width=0) Index Cond: (id = 123)

および 2 番目のクエリの場合:

Seq Scan on orders (cost=0.00..195.00 rows=1 width=8) Filter: ((id = 123) AND (created_at = '2014-10-12'::date))
于 2013-08-31T17:20:59.240 に答える