Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将字符串比较where子句添加到内部联接会对SQLite的性能造成巨大影响_Sql_Database_Sqlite - Fatal编程技术网

将字符串比较where子句添加到内部联接会对SQLite的性能造成巨大影响

将字符串比较where子句添加到内部联接会对SQLite的性能造成巨大影响,sql,database,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.

我正在处理费城交通数据,我有一个存储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匹配的子句当前已注释掉。如果按现在的方式运行查询,而不使用匹配的服务id,则需要2秒钟。如果我取消对service_id子句的注释,需要30分钟。我不知道为什么,因为我已经在查看路线id的行程表了


有什么想法吗?

如果在路由id、停止id和出发时间上定义了索引(在服务id上没有筛选器时使用),则通常会发生这种情况。一旦将该索引包含在WHERE子句中,因为它不在索引中,它需要表扫描,因此需要在执行时间内启动。如果在索引定义中还包括服务id,则表扫描将替换为索引扫描。

原因是您在服务id上有一个优先于另一个索引的索引,并且服务id的不同值不多,因此,使用索引不是很有用,因为服务的行太多了。\u id=“1”。

表上有哪些索引?你有没有试过解释有没有服务id的查询计划?我没有索引任何东西,这会解释很多。我现在正在研究。我在trip列中没有定义trip\u id列的整数主键,而是得到:0,0,1,扫描表trip~10000行0,1,0,使用自动覆盖索引stop\u id=?和trip_id=~添加7行后,我得到:0,0,0,扫描表停止时间~25000行0,1,1,使用整数主键rowid=~1行,性能问题消失。