【发布时间】:2016-07-25 12:46:35
【问题描述】:
我正在阅读此article,并决定自己尝试示例。
添加索引之前:
我有表BookHibernate,sql是由hibernate生成的:
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)的幕后黑手是什么?这个算法的复杂度是多少?
【问题讨论】:
-
你的表里有数据吗?你在桌子上跑
analyze了吗? -
@jmelesky,是的,两行 / 是的
-
对于两行,任何数据库都不会使用索引。
-
@a_horse_with_no_name,我更新了我的问题。谢谢!
-
条件删除了多少行?为 1000 行的表添加使用
explain (analyze, verbose) select ...的执行计划。
标签: postgresql indexing sql-execution-plan