将字符串比较where子句添加到内连接会使SQLite受到巨大的性能影响

时间:2012-09-09 13:14:15

标签: sql database sqlite

我正在玩费城交通数据,我有一个存储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个。我不知道为什么因为我已经在查看trip_id的trip表。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

如果在service_id上​​没有过滤器时使用的(route_id,stop_id和departure_time)上定义了索引,则通常会发生这种情况。一旦在WHERE子句中包含它,因为它不存在于索引中,它需要TABLE SCAN,因此在执行时间内会出现问题。如果您还在索引定义中包含service_id,那么TABLE SCAN将替换为INDEX SCAN

答案 1 :(得分:0)

原因是你有一个service_id的索引正在被选择,而不是另一个索引,service_id的值不是很多,所以使用索引不是很有用,因为service_id = '1'有很多行。