我有一个表call_logs,它包含一个ID,DEVICE_ID,时间戳和其他一些领域一起变量。 我目前正试图编写一个查询,返回最后一次调用,如果它正在为每个设备工作。 当前我的查询是这样的:,Postgres的查询与指数仅缓慢扫描
SELECT DISTINCT ON (device_id) c.device_id, c.timestamp, c.working, c.id
FROM call_logs c
ORDER BY c.device_id, c.timestamp desc;
它返回我想要的信息。 但是我的生产服务器现在变得相当庞大,我在表中有大约6,000,000条记录。
我增加了一个索引的表:
CREATE INDEX cl_device_timestamp
ON public.call_logs USING btree
(device_id, timestamp DESC, id, working)
TABLESPACE pg_default;
但我得到什么,我认为是很慢的时间: 这里是一个解释分析F中的查询:
EXPLAIN ANALYSE SELECT DISTINCT ON (device_id) c.device_id, c.timestamp, c.working, c.id
FROM call_logs c
ORDER BY c.device_id, c.timestamp desc;
QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
Unique (cost=0.56..363803.37 rows=120 width=25) (actual time=0.069..2171.201 rows=124 loops=1)
-> Index Only Scan using cl_device_timestamp on call_logs c (cost=0.56..347982.87 rows=6328197 width=25) (actual time=0.067..1594.953 rows=6331024 loops=1)
Heap Fetches: 8051
Planning time: 0.184 ms
Execution time: 2171.281 ms
(5 rows)
我只有124个唯一的device_id。我不会认为这将是一个缓慢的过程与索引?任何想法出了什么问题?或者为什么它如此缓慢?
怎么样的执行时间,如果你删除'DISTINCT'?如果你只想要最后一次调用,你不能添加'LIMIT 1'并且不需要'DISTINCT'吗? –
尽量避免截然不同,请参阅:https://dba.stackexchange.com/questions/93158/how-to-speed-up-select-distinct – Tisp
但限制1只给我1个设备1每个设备需要1个 – user1434177