Postgresql

时间:2015-11-22 12:06:29

标签: sql postgresql indexing postgresql-performance

我正在使用Postgresql 9.2,我正面临着索引使用的问题。

考虑一个包含2列的相当大的表(124M记录):device_id,date。

Device_id 是在此表中保存数据的设备的ID。

日期是时间戳。设备每天产生大约50-2000条记录。 我基于(date,device_id)在此表上有一个索引。

当我执行查询时:

select date 
from table 
where device_id = 1 
order by date asc 
limit 1

当此表中有针对device_id == 1 的记录时,它完全正常(以毫秒执行)

当device_id == 1没有记录时,问题就开始了。 Explain 命令显示规划器正在使用索引,但执行时需要几分钟(有时几乎一小时)。

第一种情况的查询计划(记录存在于表中):

"Limit  (cost=0.00..3.87 rows=1 width=8) (actual time=0.020..0.021 rows=1 loops=1)"
"  Output: date"
"  Buffers: shared hit=5"
"  ->  Index Scan using i_table_deviceid_date on public.table  (cost=0.00..1406868.86 rows=363300 width=8) (actual time=0.018..0.018 rows=1 loops=1)"
"        Output: date"
"        Index Cond: ((table.device_id)::text = '354330030970803'::text)"
"        Buffers: shared hit=5"
"Total runtime: 0.039 ms"

第二种情况的查询计划(尚未记录):

"Limit  (cost=0.00..3.99 rows=1 width=8) (actual time=2067070.604..2067070.604 rows=0 loops=1)"
"  Output: date"
"  Buffers: shared hit=41587 read=141992 written=564"
"  ->  Index Scan using i_table_deviceid_date on public.table  (cost=0.00..446995.42 rows=112010 width=8) (actual time=2067070.602..2067070.602 rows=0 loops=1)"
"        Output: date"
"        Index Cond: ((table.device_id)::text = '354330030957453'::text)"
"        Buffers: shared hit=41587 read=141992 written=564"
"Total runtime: 2067070.620 ms"

特定device_id没有记录的可能原因有两个:

  1. 删除了所有数据
  2. 此devide_id的第一个数据尚未保存
  3. 任何帮助都会很棒。

0 个答案:

没有答案