sql - 将字符串比较 where 子句添加到内部连接会对 SQLite 产生巨大的性能影响

标签 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 个。我不知道为什么,因为我已经在查看 route_id 的行程表。

有什么想法吗?

最佳答案

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

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

相关文章:

android - 如何设计 SQLite DB 使其可用于多种语言?

mysql - 为什么是语法错误?

sql - t-sql GROUP BY 和 COUNT,然后包含 COUNT 中的 MAX

mysql - 对数据框应用函数返回不正确的结果

sql - 删除逗号分隔表列中值内的逗号

mysql - 查询以获取开始日期和结束日期之间的重复客户

iphone - 如何保护核心数据 iPhone 应用程序中的 sqlite 数据库?

android - 从数据库中获取特定行时抛出数字格式异常

c - BerkeleyDB 变胖变慢

database - 餐厅网站的一对多关系?