我有如下表选择主键:为什么Postgres的喜欢做连续扫描VS索引扫描
create table log
(
id bigint default nextval('log_id_seq'::regclass) not null
constraint log_pkey
primary key,
level integer,
category varchar(255),
log_time timestamp,
prefix text,
message text
);
它包含样3万行的。
我比较以下查询:
EXPLAIN SELECT id
FROM log
WHERE log_time < now() - INTERVAL '3 month'
LIMIT 100000
这将产生以下计划:
Limit (cost=0.00..19498.87 rows=100000 width=8)
-> Seq Scan on log (cost=0.00..422740.48 rows=2168025 width=8)
Filter: (log_time < (now() - '3 mons'::interval))
而且相同的查询与ORDER BY ID指令补充说:
EXPLAIN SELECT id
FROM log
WHERE log_time < now() - INTERVAL '3 month'
ORDER BY id ASC
LIMIT 100000
收益率为
Limit (cost=0.43..25694.15 rows=100000 width=8)
-> Index Scan using log_pkey on log (cost=0.43..557048.28 rows=2168031 width=8)
Filter: (log_time < (now() - '3 mons'::interval))
我有以下问题:
缺少ORDER BY的指令允许Postgres的不关心行的顺序。他们也可以交付排序。为什么它不使用没有ORDER BY的索引?
- Postgres如何在这样的查询中首先使用索引?
WHERE
查询的子句包含非索引列,并且要读取该列,将需要进行顺序数据库扫描,但带有ORDER BY
的查询不指示该查询。
- Postgres如何在这样的查询中首先使用索引?
Postgres的手册页说:
对于需要扫描表的大部分的查询,明确的排序是可能的,因为它需要较少的磁盘I比使用索引快/ O由于以下顺序访问模式
能否请您澄清这个说法我吗?索引总是有序的。读取有序结构总是更快,它总是一个顺序访问(至少在页面扫描方面)比读取无序数据,然后手动排序。