【发布时间】:2014-11-25 05:22:42
【问题描述】:
我的 postgres 数据库中有一个简单的表结构:
CREATE TABLE device
(
id bigint NOT NULL,
version bigint NOT NULL,
device_id character varying(255),
date_created timestamp without time zone,
last_updated timestamp without time zone,
CONSTRAINT device_pkey PRIMARY KEY (id )
)
我经常根据 deviceId 列查询数据。该表有 350 万行,因此会导致性能问题:
"Seq Scan on device (cost=0.00..71792.70 rows=109 width=8) (actual time=352.725..353.445 rows=2 loops=1)"
" Filter: ((device_id)::text = '352184052470420'::text)"
"Total runtime: 353.463 ms"
因此我在 device_id 列上创建了索引:
CREATE INDEX device_device_id_idx
ON device
USING btree
(device_id );
但是我的问题是,该数据库仍然使用顺序扫描,而不是索引扫描。创建索引后的查询计划是一样的:
"Seq Scan on device (cost=0.00..71786.33 rows=109 width=8) (actual time=347.133..347.508 rows=2 loops=1)"
" Filter: ((device_id)::text = '352184052470420'::text)"
"Total runtime: 347.538 ms"
查询的结果是 2 行,所以我没有选择表格的大部分。我真的不明白为什么索引被忽略。我可以做些什么来提高性能?
编辑:
我的查询:
select id from device where device_id ='357560051102491A';
我在设备表上运行了analyse,但没有帮助
device_id 也包含字符。
【问题讨论】:
-
编辑您的问题并包含查询。
-
出于兴趣,如果
deviceid是数字,为什么varchar? -
尝试更新表的统计信息。看起来 postgres 对此特定表的统计信息已过时。
-
添加了查询。 DeviceId 不是数字。我在创建索引后运行了分析。
标签: sql postgresql indexing query-performance