2013-07-25 42 views
0

我正在使用Android上的GTFS數據(SQlite)。當我在填充了GTFS數據的數據庫中選擇查詢時,我想提高性能。下面在GTFS數據中停止時間的SQlite查詢

查詢選擇相關的路線停止時間在停止:

第一子查詢獲取每日停止時間週四。 第二個獲取所有對TODAY(2013-07-25)無效的異常停止時間。 第三個獲取僅適用於TODAY(2013-07-25)的所有異常停止時間。 然後,我刪除無效的一個,並將有效的一個添加到第一個子查詢。

select distinct stop_times_arrival_time 
from stop_times, trips, calendar 
where stop_times_trip_id=trip_id 
and calendar_service_id=trip_service_id 
and trip_route_id='11821949021891616' 
and stop_times_stop_id='3377699721872252' 
and calendar_start_date<='20130725' 
and calendar_end_date>='20130725' 
and calendar_thursday=1 
and stop_times_arrival_time>='07:40' 

except 

select stop_times_arrival_time 
from stop_times, trips, calendar, calendar_dates 
where stop_times_trip_id=trip_id 
and calendar_service_id=trip_service_id 
and calendar_dates_service_id = trip_service_id 
and trip_route_id='11821949021891694' 
and stop_times_stop_id='3377699720880977' 
and calendar_thursday=1 
and calendar_dates_exception_type=2 
and stop_times_arrival_time > '07:40' 
and calendar_dates_date = 20130725 

union 

select stop_times_arrival_time 
from stop_times, trips, calendar, calendar_dates 
where stop_times_trip_id=trip_id 
and calendar_service_id=trip_service_id 
and calendar_dates_service_id = trip_service_id 
and trip_route_id='11821949021891694' 
and stop_times_stop_id='3377699720880977' 
and calendar_thursday=1 
and calendar_dates_exception_type=1 
and stop_times_arrival_time > '07:40' 
and calendar_dates_date = 20130725; 

花了大約15秒來計算(這很長)。 我相信有更好的做這個查詢,因爲我做3個不同的查詢(幾乎相同的方式),這需要時間。

任何想法如何改善它?

編輯: 這裏是架構:

table|calendar|calendar|2|CREATE TABLE calendar (
    calendar_service_id TEXT PRIMARY KEY, 
    calendar_monday INTEGER, 
    calendar_tuesday INTEGER, 
    calendar_wednesday INTEGER, 
    calendar_thursday INTEGER, 
    calendar_friday INTEGER, 
    calendar_saturday INTEGER, 
    calendar_sunday INTEGER, 
    calendar_start_date TEXT, 
    calendar_end_date TEXT 
) 
index|sqlite_autoindex_calendar_1|calendar|3| 
table|calendar_dates|calendar_dates|4|CREATE TABLE calendar_dates (
     calendar_dates_service_id TEXT, 
     calendar_dates_date TEXT, 
     calendar_dates_exception_type INTEGER 
) 
table|routes|routes|8|CREATE TABLE routes (
     route_id TEXT PRIMARY KEY, 
     route_short_name TEXT, 
     route_long_name TEXT, 
     route_type INTEGER, 
     route_color TEXT 
) 
index|sqlite_autoindex_routes_1|routes|9| 
table|stop_times|stop_times|12|CREATE TABLE stop_times (
     stop_times_trip_id TEXT, 
     stop_times_stop_id TEXT, 
     stop_times_stop_sequence INTEGER, 
     stop_times_arrival_time TEXT, 
     stop_times_pickup_type INTEGER 
) 
table|stops|stops|13|CREATE TABLE stops (
     stop_id TEXT PRIMARY KEY, 
     stop_name TEXT, 
     stop_lat REAL, 
     stop_lon REAL 
) 
index|sqlite_autoindex_stops_1|stops|14| 
table|trips|trips|15|CREATE TABLE trips (
     trip_id TEXT PRIMARY KEY, 
     trip_service_id TEXT, 
     trip_route_id TEXT, 
     trip_headsign TEXT, 
     trip_direction_id INTEGER, 
     trip_shape_id TEXT 
) 
index|sqlite_autoindex_trips_1|trips|16| 

這裏是查詢計劃:即用於查找應該被索引

2|0|0|SCAN TABLE stop_times (~33333 rows) 
2|1|1|SEARCH TABLE trips USING INDEX sqlite_autoindex_trips_1 (trip_id=?) (~1 rows) 
2|2|2|SEARCH TABLE calendar USING INDEX sqlite_autoindex_calendar_1 (calendar_service_id=?) (~1 rows) 
3|0|3|SCAN TABLE calendar_dates (~10000 rows) 
3|1|2|SEARCH TABLE calendar USING INDEX sqlite_autoindex_calendar_1 (calendar_service_id=?) (~1 rows) 
3|2|0|SEARCH TABLE stop_times USING AUTOMATIC COVERING INDEX (stop_times_stop_id=?) (~7 rows) 
3|3|1|SEARCH TABLE trips USING INDEX sqlite_autoindex_trips_1 (trip_id=?) (~1 rows) 
1|0|0|COMPOUND SUBQUERIES 2 AND 3 USING TEMP B-TREE (EXCEPT) 
4|0|3|SCAN TABLE calendar_dates (~10000 rows) 
4|1|2|SEARCH TABLE calendar USING INDEX sqlite_autoindex_calendar_1 (calendar_service_id=?) (~1 rows) 
4|2|0|SEARCH TABLE stop_times USING AUTOMATIC COVERING INDEX (stop_times_stop_id=?) (~7 rows) 
4|3|1|SEARCH TABLE trips USING INDEX sqlite_autoindex_trips_1 (trip_id=?) (~1 rows) 
0|0|0|COMPOUND SUBQUERIES 1 AND 4 USING TEMP B-TREE (UNION) 
+0

請出示的數據庫架構和[解釋查詢計劃]輸出(http://www.sqlite.org/eqp.html )爲這個查詢。 –

+0

當然,我只是編輯我的文章,我希望它會有所幫助。 – lost17

回答

0

列,但是對於單(子)查詢,每個表不能使用多個索引。

對於這個特定的查詢,以下附加指標將有助於:

CREATE INDEX some_index ON stop_times(
    stop_times_stop_id, 
    stop_times_arrival_time); 
CREATE INDEX some_other_index ON calendar_dates(
    calendar_dates_service_id, 
    calendar_dates_exception_type, 
    calendar_dates_date);