私はこれを読んでarticle、私自身で例を試してみることにしました。インデックス追加する前にインデックスはpostgresクエリプランに表示されませんでした
:
私が持っているテーブルBookHibernate
は、SQLはhibernate
によって生成された:それは私を与える
explain analyze select * from bookhibernate where bookhibernate.price > 10
:
CREATE TABLE bookhibernate
(
book_id bigint NOT NULL,
bought boolean,
genre character varying(255),
name character varying(255) NOT NULL,
price integer NOT NULL,
author_id bigint,
CONSTRAINT bookhibernate_pkey PRIMARY KEY (book_id),
CONSTRAINT fk_hlepqn9vy6biuo6vn47jo5ewx FOREIGN KEY (book_id)
REFERENCES authorhibernate (author_id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT fk_r9o6704wcbcawmruyqojj4nab FOREIGN KEY (author_id)
REFERENCES authorhibernate (author_id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
OIDS=FALSE
);
は、だから私は
explain analyze
と呼ばれます
"Seq Scan on bookhibernate (cost=0.00..1.02 rows=1 width=1053) (actual time=0.007..0.008 rows=2 loops=1)"
" Filter: (price > 10)"
"Planning time: 0.054 ms"
"Execution time: 0.021 ms"
は、インデックス追加した後:インデックスを追加し、同じexplain analyze
を実行した後
create index my_index on bookhibernate(price);
を私はexecution plan
が変更されていないと私はFilter: (price > 10)
レジスタを参照していることがわかり、私はIndex cond: (price > 10)
を見て期待していました。
私の期待はなぜ失敗するのですか?
更新日:
私はそれが小さいため、テーブルのサイズを言われました。それは妥当と思われ、それは本当です。しかし、私は1000行のテーブルに対して私のクエリを試みました。
Postgres
はなぜフィルタリングを使用するのですか?それはなぜ好ましいですか?Filter: (price > 10)
の背景は何ですか?このアルゴリズムの複雑さは何ですか?
テーブルにデータがありますか?あなたはテーブル上で 'analyze'を実行しましたか? – jmelesky
@jmelesky、yes、2 rows/yes –
2行の場合、データベースはインデックスを使用しません。 –