@@ -278,32 +278,30 @@ AND "date" <= dates_filter_max('2022-03-23T12:35:00+01') -- evaluates to 2023-03
278278
279279` gtfs-via-duckdb `  is fast enough for most use cases I can think of. If there's a particular kind of query that you think should be faster, please [ open an Issue] ( https://github.com/public-transport/gtfs-via-duckdb/issues/new ) !
280280
281- todo: re-run them
282- The following benchmarks were run with the 
[ 2025-05-21 VBB GTFS dataset
] ( https://vbb-gtfs.jannisr.de/2025-05-21/ )  (41k 
` stops ` , 6m 
` stop_times ` , 207m arrivals/departures) using 
` [email protected] `  and DuckDB v1.3 on an 
[ M2
] ( https://en.wikipedia.org/wiki/Apple_M2 )  laptop running macOS 14.7.6; All measurements are in milliseconds.
281+ The following benchmarks were run with the 
[ 2025-05-21 VBB GTFS dataset
] ( https://vbb-gtfs.jannisr.de/2025-05-21/ )  (41k 
` stops ` , 6m 
` stop_times ` , 207m arrivals/departures) using 
` [email protected] `  and DuckDB v1.3 on an 
[ M2
] ( https://en.wikipedia.org/wiki/Apple_M2 )  laptop running macOS 14.7.7; All measurements are in milliseconds.
283282
284283|  query |  avg |  min |  p25 |  p50 |  p75 |  p95 |  p99 |  max |  iterations | 
285284|  - |  - |  - |  - |  - |  - |  - |  - |  - |  - | 
286- |  <pre >SELECT * <br >FROM stops<br >ORDER BY ST_Distance(stop_loc::geometry, ST_SetSRID(ST_MakePoint(9.7, 50.547), 4326)) ASC<br >LIMIT 100</pre > |  15 |  14.982 |  15 |  15 |  15 |  15 |  15 |  15.488 |  100 | 
287- |  <pre >SELECT * <br >FROM arrivals_departures<br >WHERE route_short_name = 'S1'<br >AND t_departure >= '2022-08-09T07:10+02' AND t_departure <= '2022-08-09T07:30+02'<br >AND date >= dates_filter_min('2022-08-09T07:10+02')<br >AND date <= dates_filter_max('2022-08-09T07:30+02')</pre > |  61 |  60.901 |  61 |  61 |  61 |  61 |  62 |  61.778 |  100 | 
288- |  <pre >SELECT * <br >FROM arrivals_departures<br >WHERE station_id = 'de:11000:900100001' -- S+U Friedrichstr. (Berlin)<br >AND t_departure >= '2022-08-09T07:10+02' AND t_departure <= '2022-08-09T07:30+02'<br >AND date >= dates_filter_min('2022-08-09T07:10+02')<br >AND date <= dates_filter_max('2022-08-09T07:30+02')</pre > |  33 |  33.129 |  33 |  33 |  33 |  33 |  33 |  33.342 |  40 | 
289- |  <pre >SELECT * <br >FROM arrivals_departures<br >WHERE station_id = 'de:11000:900100001' -- S+U Friedrichstr. (Berlin)<br >AND t_departure >= '2022-08-09T07:10+02' AND t_departure <= '2022-08-09T07:30+02'<br >AND date >= dates_filter_min('2022-08-09T07:10+02')<br >AND date <= dates_filter_max('2022-08-09T07:30+02')<br >AND stop_sequence = 0</pre > |  5 |  4.548 |  5 |  5 |  5 |  5 |  5 |  4.598 |  50 | 
290- |  <pre >SELECT * <br >FROM arrivals_departures<br >WHERE stop_id = 'de:11000:900100001::4' -- S+U Friedrichstr. (Berlin)<br >AND t_departure >= '2022-08-09T07:10+02' AND t_departure <= '2022-08-09T07:30+02'<br >AND date >= dates_filter_min('2022-08-09T07:10+02')<br >AND date <= dates_filter_max('2022-08-09T07:30+02')</pre > |  8 |  8.038 |  8 |  8 |  8 |  8 |  8 |  8.164 |  100 | 
291- |  <pre >SELECT * <br >FROM arrivals_departures<br >WHERE trip_id = '168977951'<br >AND date > '2022-08-08' AND date <= '2022-08-09'</pre > |  2 |  1.878 |  2 |  2 |  2 |  2 |  2 |  1.911 |  100 | 
292- |  <pre >SELECT count(* )<br >FROM arrivals_departures<br >WHERE stop_id = 'de:11000:900100001::4' -- S+U Friedrichstr. (Berlin)</pre > |  58 |  57.485 |  58 |  58 |  58 |  58 |  58 |  57.789 |  100 | 
293- |  <pre >SELECT count(* )<br >FROM arrivals_departures<br >WHERE stop_id = 'definitely-non-existent'</pre > |  2 |  1.832 |  2 |  2 |  2 |  2 |  2 |  1.876 |  100 | 
294- |  <pre >SELECT * <br >FROM arrivals_departures<br >WHERE t_departure >= '2022-08-09T07:10+02' AND t_departure <= '2022-08-09T07:30+02'<br >AND date >= dates_filter_min('2022-08-09T07:10+02'::timestamp with time zone)<br >AND date <= dates_filter_max('2022-08-09T07:30+02'::timestamp with time zone)</pre > |  6310 |  6238.819 |  6241 |  6262 |  6311 |  6503 |  6560 |  6573.768 |  10 | 
295- |  <pre >SELECT * <br >FROM arrivals_departures<br >WHERE t_departure >= '2022-08-09T07:10+02' AND t_departure <= '2022-08-09T07:30+02'<br >AND date >= '2022-08-08'<br >AND date <= '2022-08-09'</pre > |  4931 |  4914.388 |  4925 |  4928 |  4937 |  4946 |  4948 |  4948.689 |  10 | 
296- |  <pre >SELECT * <br >FROM connections<br >WHERE route_short_name = 'S1'<br >AND t_departure >= '2022-08-09T07:10+02' AND t_departure <= '2022-08-09T07:30+02'<br >AND date >= dates_filter_min('2022-08-09T07:10+02')<br >AND date <= dates_filter_max('2022-08-09T07:30+02')</pre > |  164 |  163.018 |  163 |  164 |  164 |  164 |  165 |  166.568 |  100 | 
297- |  <pre >SELECT * <br >FROM connections<br >WHERE from_station_id = 'de:11000:900100001' -- S+U Friedrichstr. (Berlin)<br >AND t_departure >= '2022-08-09T07:10+02' AND t_departure <= '2022-08-09T07:30+02'<br >AND date >= dates_filter_min('2022-08-09T07:10+02')<br >AND date <= dates_filter_max('2022-08-09T07:30+02')</pre > |  59 |  58.137 |  58 |  58 |  59 |  60 |  61 |  61.461 |  40 | 
298- |  <pre >SELECT * <br >FROM connections<br >WHERE from_station_id = 'de:11000:900100001' -- S+U Friedrichstr. (Berlin)<br >AND t_departure >= '2022-08-09T07:10+02' AND t_departure <= '2022-08-09T07:30+02'<br >AND date >= dates_filter_min('2022-08-09T07:10+02')<br >AND date <= dates_filter_max('2022-08-09T07:30+02')<br >AND from_stop_sequence = 0</pre > |  7 |  7.439 |  7 |  7 |  7 |  7 |  7 |  7.49 |  50 | 
299- |  <pre >SELECT * <br >FROM connections<br >WHERE from_stop_id = 'de:11000:900100001::4' -- S+U Friedrichstr. (Berlin)<br >AND t_departure >= '2022-08-09T07:10+02' AND t_departure <= '2022-08-09T07:30+02'<br >AND date >= dates_filter_min('2022-08-09T07:10+02')<br >AND date <= dates_filter_max('2022-08-09T07:30+02')</pre > |  15 |  14.529 |  15 |  15 |  15 |  15 |  15 |  14.698 |  100 | 
300- |  <pre >SELECT * <br >FROM connections<br >WHERE trip_id = '168977951'<br >AND date > '2022-08-08' AND date <= '2022-08-09'</pre > |  3 |  2.86 |  3 |  3 |  3 |  3 |  3 |  2.931 |  100 | 
301- |  <pre >SELECT count(* )<br >FROM connections<br >WHERE from_stop_id = 'de:11000:900100001::4' -- S+U Friedrichstr. (Berlin)</pre > |  73 |  72.687 |  73 |  73 |  73 |  73 |  73 |  73.35 |  100 | 
302- |  <pre >SELECT count(* )<br >FROM connections<br >WHERE from_stop_id = 'definitely-non-existent'</pre > |  3 |  3.428 |  3 |  3 |  3 |  3 |  4 |  3.525 |  100 | 
303- |  <pre >SELECT * <br >FROM connections<br >WHERE t_departure >= '2022-08-09T07:10+02' AND t_departure <= '2022-08-09T07:30+02'<br >AND date >= dates_filter_min('2022-08-09T07:10+02'::timestamp with time zone)<br >AND date <= dates_filter_max('2022-08-09T07:30+02'::timestamp with time zone)<br >ORDER BY t_departure<br >LIMIT 100</pre > |  13127 |  13056.841 |  13086 |  13125 |  13170 |  13194 |  13199 |  13200.027 |  7 | 
304- |  <pre >SELECT * <br >FROM connections<br >WHERE t_departure >= '2022-08-09T07:10+02' AND t_departure <= '2022-08-09T07:30+02'<br >AND date >= '2022-08-08'<br >AND date <= '2022-08-09'<br >ORDER BY t_departure<br >LIMIT 100</pre > |  6417 |  6237.932 |  6346 |  6394 |  6512 |  6562 |  6570 |  6571.455 |  7 | 
305- |  <pre >SELECT * <br >FROM stats_by_route_date<br >WHERE route_id = '17452_900' -- M4<br >AND date >= '2022-08-08' AND date <= '2022-08-14'<br >AND is_effective = true</pre > |  2862 |  2853.972 |  2860 |  2863 |  2863 |  2867 |  2867 |  2866.798 |  10 | 
306- 
285+ |  <pre >SELECT * <br >FROM stops<br >ORDER BY ST_Distance(stop_loc::geometry, ST_Point(9.7, 50.547)) ASC<br >LIMIT 100</pre > |  6.35 |  5.91 |  5.98 |  6.25 |  6.6 |  6.86 |  8.41 |  10.05 |  1576 | 
286+ |  <pre >SELECT * <br >FROM arrivals_departures<br >WHERE route_short_name = 'S1'<br >AND t_departure >= '2025-05-27T07:10:00+02' AND t_departure <= '2025-05-27T07:30:00+02'<br >AND date >= dates_filter_min('2025-05-27T07:10:00+02'::timestamp with time zone)<br >AND date <= dates_filter_max('2025-05-27T07:30+02'::timestamp with time zone)</pre > |  305.15 |  260.52 |  303.8 |  307.73 |  312.2 |  320.64 |  326.84 |  328.44 |  33 | 
287+ |  <pre >SELECT * <br >FROM arrivals_departures<br >WHERE station_id = 'de:11000:900100001' -- S+U Friedrichstr. (Berlin)<br >AND t_departure >= '2025-05-27T07:10+02' AND t_departure <= '2025-05-27T07:30+02'<br >AND date >= dates_filter_min('2025-05-27T07:10+02')<br >AND date <= dates_filter_max('2025-05-27T07:30+02')</pre > |  129.43 |  119.85 |  126.19 |  128.62 |  131.84 |  138.44 |  140.46 |  142 |  78 | 
288+ |  <pre >SELECT * <br >FROM arrivals_departures<br >WHERE station_id = 'de:11000:900100001' -- S+U Friedrichstr. (Berlin)<br >AND t_departure >= '2025-05-27T07:10+02' AND t_departure <= '2025-05-27T07:30+02'<br >AND date >= dates_filter_min('2025-05-27T07:10+02')<br >AND date <= dates_filter_max('2025-05-27T07:30+02')<br >AND stop_sequence = 0</pre > |  81.42 |  65.73 |  79.48 |  82.11 |  84.33 |  87.26 |  89.64 |  102.97 |  123 | 
289+ |  <pre >SELECT * <br >FROM arrivals_departures<br >WHERE stop_id = 'de:11000:900100001::4' -- S+U Friedrichstr. (Berlin)<br >AND t_departure >= '2025-05-27T07:10+02' AND t_departure <= '2025-05-27T07:30+02'<br >AND date >= dates_filter_min('2025-05-27T07:10+02')<br >AND date <= dates_filter_max('2025-05-27T07:30+02')</pre > |  83.79 |  64.57 |  82.15 |  84.64 |  85.83 |  91.36 |  95.79 |  97.08 |  120 | 
290+ |  <pre >SELECT * <br >FROM arrivals_departures<br >WHERE trip_id = '262623609' -- route_id=10144_109, route_short_name=S2<br >AND date = '2025-05-27'</pre > |  14.25 |  12.38 |  13.42 |  13.98 |  14.84 |  16.12 |  18.98 |  21.77 |  702 | 
291+ |  <pre >SELECT count(* )<br >FROM arrivals_departures<br >WHERE stop_id = 'de:11000:900100001::4' -- S+U Friedrichstr. (Berlin)</pre > |  70.9 |  67.54 |  69.09 |  70.1 |  72.47 |  75.73 |  77.24 |  78.83 |  142 | 
292+ |  <pre >SELECT count(* )<br >FROM arrivals_departures<br >WHERE stop_id = 'definitely-non-existent'</pre > |  23.61 |  20.31 |  21.97 |  22.67 |  24.84 |  27.51 |  30.78 |  40.43 |  424 | 
293+ |  <pre >SELECT * <br >FROM arrivals_departures<br >WHERE t_departure >= '2025-05-27T07:10+02' AND t_departure <= '2025-05-27T07:30+02'<br >AND date >= '2025-05-25'<br >AND date <= '2025-05-27'</pre > |  1269.86 |  1139.03 |  1254.52 |  1272.09 |  1318.94 |  1329.66 |  1331.44 |  1331.89 |  8 | 
294+ |  <pre >SELECT * <br >FROM arrivals_departures<br >WHERE t_departure >= '2025-05-27T07:10:00+02' AND t_departure <= '2025-05-27T07:30:00+02'<br >AND "date" >= dates_filter_min('2025-05-27T07:10:00+02'::timestamp with time zone)<br >AND "date" <= dates_filter_max('2025-05-27T07:30:00+02'::timestamp with time zone)</pre > |  34148.21 |  32101.25 |  33459.12 |  34816.99 |  35171.69 |  35455.44 |  35512.2 |  35526.38 |  3 | 
295+ |  <pre >SELECT * <br >FROM connections<br >WHERE route_short_name = 'S1'<br >AND t_departure >= '2025-05-27T07:10+02' AND t_departure <= '2025-05-27T07:30+02'<br >AND date >= dates_filter_min('2025-05-27T07:10+02')<br >AND date <= dates_filter_max('2025-05-27T07:30+02')</pre > |  8697.84 |  8629.78 |  8673.26 |  8716.73 |  8731.86 |  8743.96 |  8746.39 |  8746.99 |  3 | 
296+ |  <pre >SELECT * <br >FROM connections<br >WHERE from_station_id = 'de:11000:900194006' -- S Schöneweide/Sterndamm (Berlin)<br >AND t_departure >= '2025-05-27T07:10+02' AND t_departure <= '2025-05-27T07:30+02'<br >AND date >= dates_filter_min('2025-05-27T07:10+02')<br >AND date <= dates_filter_max('2025-05-27T07:30+02')</pre > |  1154.01 |  1070.8 |  1115.77 |  1156.47 |  1168.38 |  1243.5 |  1281.37 |  1290.84 |  9 | 
297+ |  <pre >SELECT * <br >FROM connections<br >WHERE from_station_id = 'de:11000:900194006' -- S Schöneweide/Sterndamm (Berlin)<br >AND t_departure >= '2025-05-27T07:10+02' AND t_departure <= '2025-05-27T07:30+02'<br >AND date >= dates_filter_min('2025-05-27T07:10+02')<br >AND date <= dates_filter_max('2025-05-27T07:30+02')<br >AND from_stop_sequence_consec = 0</pre > |  482.23 |  454.29 |  466.55 |  467.45 |  475.64 |  555.32 |  571.05 |  574.98 |  21 | 
298+ |  <pre >SELECT * <br >FROM connections<br >WHERE from_stop_id = 'de:11000:900100001::4' -- S+U Friedrichstr. (Berlin)<br >AND t_departure >= '2025-05-27T07:10+02' AND t_departure <= '2025-05-27T07:30+02'<br >AND date >= dates_filter_min('2025-05-27T07:10+02')<br >AND date <= dates_filter_max('2025-05-27T07:30+02')</pre > |  885.14 |  835.29 |  869.24 |  875.76 |  909.79 |  922.32 |  923.64 |  923.97 |  12 | 
299+ |  <pre >SELECT * <br >FROM connections<br >WHERE trip_id = '262535123' -- route_id=17452_900 (M4)<br >AND date >= '2025-05-26' AND date <= '2025-06-01'</pre > |  19.31 |  15.83 |  18.02 |  18.99 |  20.27 |  22.76 |  24.78 |  27.96 |  519 | 
300+ |  <pre >SELECT count(* )<br >FROM connections<br >WHERE from_stop_id = 'de:11000:900100001::4' -- S+U Friedrichstr. (Berlin)</pre > |  341.42 |  263.96 |  340.65 |  346.83 |  350.72 |  355.91 |  358.76 |  359.65 |  30 | 
301+ |  <pre >SELECT count(* )<br >FROM connections<br >WHERE from_stop_id = 'definitely-non-existent'</pre > |  343.5 |  314.1 |  319.13 |  345.04 |  354.63 |  362.52 |  463.4 |  503.94 |  30 | 
302+ |  <pre >SELECT * <br >FROM connections<br >WHERE t_departure >= '2025-05-27T07:10+02' AND t_departure <= '2025-05-27T07:30+02'<br >AND date >= dates_filter_min('2025-05-27T07:10+02'::timestamp with time zone)<br >AND date <= dates_filter_max('2025-05-27T07:30+02'::timestamp with time zone)<br >ORDER BY t_departure<br >LIMIT 100</pre > |  1013055.35 |  986377.24 |  1026394.41 |  1009900.4 |  1026394.41 |  992028.36 |  1042228.66 |  1042888.42 |  3 | 
303+ |  <pre >SELECT * <br >FROM connections<br >WHERE t_departure >= '2025-05-27T07:10+02' AND t_departure <= '2025-05-27T07:30+02'<br >AND date >= '2025-05-25' AND date <= '2025-05-27'<br >ORDER BY t_departure<br >LIMIT 100</pre > |  16347.21 |  16250.36 |  16285.17 |  16319.98 |  16395.63 |  16456.16 |  16468.27 |  16471.29 |  3 | 
304+ |  <pre >SELECT * <br >FROM stats_by_route_date<br >WHERE route_id = '17452_900' -- M4<br >AND date >= '2025-05-26' AND date <= '2025-06-01'<br >AND is_effective = true</pre > |  4765.59 |  4704.49 |  4706.87 |  4709.25 |  4796.14 |  4865.64 |  4879.54 |  4883.02 |  3 | 
307305
308306## Related Projects  
309307
0 commit comments