我在玩费城交通数据,我有一个sqlite数据库存储gtfs数据。我有一个查询,查询某一站的发车时间:

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'));

将服务ID与1匹配的子句当前已被注释掉。如果我现在运行查询,而没有匹配的服务ID,则需要2秒。如果我取消注释SERVICE\U ID子句,则需要30分钟。我不知道为什么,因为我已经在查旅行表上的路线。
有什么想法吗?

最佳答案

如果在没有对服务ID进行筛选时使用的索引(route_id、stop_id和deparent_time)上定义了索引,则通常会发生这种情况。一旦将该索引包含在WHERE子句中,由于索引中不存在该索引,它就需要一个TABLE SCAN并因此需要在执行时间内进行跳转。如果索引定义中也包含service_id,则TABLE SCAN将替换为INDEX SCAN

关于sql - 在内部联接中添加字符串比较where子句会极大地影响SQLite的性能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12339362/

10-11 02:52