3

我正在玩费城的交通数据,我有一个存储 gtfs 数据的 sqlite 数据库。我有这个查询寻找特定站点的出发时间:

SELECT "stop_time".departure_time FROM "stop_time"
 INNER JOIN "trip" ON "trip".trip_id = "stop_time".trip_id 

 WHERE 

 (trip.route_id = '10726' ) 
 -- AND (trip.service_id = '1') 
 AND (stop_time.stop_id = '220') 
 AND (time( stop_time.departure_time ) > time('08:30:45')) 
 AND (time( stop_time.departure_time ) < time('09:30:45'));

将 service_id 与 1 匹配的子句当前已被注释掉。如果我现在按原样运行查询,而不匹配 service_id,则需要 2 秒。如果我取消注释 service_id 子句,则需要 30。我不知道为什么,因为我已经在查看 route_id 的行程表。

有什么想法吗?

4

2 回答 2

0

如果在 service_id 上没有过滤器时使用的(route_id、stop_id 和离开时间)上定义了索引,通常会发生这种情况。一旦将其包含在WHERE子句中,由于它不存在于索引中,因此它需要 a TABLE SCAN,因此需要在执行时间中增加。如果您还包括service_id在索引定义中,则将TABLE SCAN替换为INDEX SCAN.

于 2012-09-09T13:20:08.517 回答
0

原因是您service_id选择了一个索引而不是另一个索引,并且没有很多不同的值service_id,因此使用索引并不是很有用,因为service_id = '1'.

于 2012-09-09T13:36:09.567 回答