我正在阅读这article,并决定尝试自己的例子。指数cond没有出现在postgres查询计划
加入索引之前:
我有表BookHibernate
,被hibernate
生成SQL:
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
:
explain analyze select * from bookhibernate where bookhibernate.price > 10
它给我:
"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"
加入指数后:
create index my_index on bookhibernate(price);
添加索引和执行相同explain analyze
我看到execution plan
没有改变,我看到Filter: (price > 10)
寄存器,但我希望看到Index cond: (price > 10)
后。
为什么我的期望失败?
更新:
我被告知,这是因为小表的大小。这听起来很合理,而且这是真的。但我试着对1000行表进行查询。
- 为什么
Postgres
决定使用过滤?为什么更好? Filter: (price > 10)
现场背后是什么?这个算法的复杂性是什么?
表中是否有任何数据?你在桌子上运行“分析”吗? – jmelesky
@jmelesky,是,两行/是 –
对于两行,没有数据库会使用索引。 –