我正在使用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没有记录的可能原因有两个:
任何帮助都会很棒。