Skip to content

Commit a84cc63

Browse files
committed
Merge pull request #301 from mapzen/add-more-speedup-improvements
Update indexes to speed up queries
2 parents 967e52f + fde6681 commit a84cc63

File tree

5 files changed

+37
-12
lines changed

5 files changed

+37
-12
lines changed

data/apply-planet_osm_line.sql

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,33 @@ BEGIN
55
-- planet_osm_line
66
--------------------------------------------------------------------------------
77

8+
ALTER TABLE planet_osm_line ADD COLUMN mz_road_level SMALLINT;
9+
ALTER TABLE planet_osm_line ADD COLUMN mz_transit_level SMALLINT;
10+
11+
UPDATE planet_osm_line
12+
SET mz_road_level = mz_calculate_road_level(highway, railway, aeroway, route, way)
13+
WHERE mz_calculate_road_level(highway, railway, aeroway, route, way) IS NOT NULL;
14+
15+
UPDATE planet_osm_line
16+
SET mz_transit_level = mz_calculate_transit_level(route)
17+
WHERE mz_calculate_transit_level(route) IS NOT NULL;
18+
819
CREATE INDEX planet_osm_line_waterway_index ON planet_osm_line(waterway) WHERE waterway IS NOT NULL;
9-
CREATE INDEX planet_osm_line_admin_boundaries_index ON planet_osm_line(boundary) WHERE boundary='administrative';
10-
CREATE INDEX planet_osm_line_road_level_index ON planet_osm_line(mz_calculate_road_level(highway, railway, aeroway, route, way)) WHERE mz_calculate_road_level(highway, railway, aeroway, route, way) IS NOT NULL;
11-
CREATE INDEX planet_osm_line_transit_level_index ON planet_osm_line(mz_calculate_transit_level(route)) WHERE mz_calculate_transit_level(route) IS NOT NULL;
20+
CREATE INDEX planet_osm_line_road_level_index ON planet_osm_line(mz_road_level) WHERE mz_road_level IS NOT NULL;
21+
CREATE INDEX planet_osm_line_transit_level_index ON planet_osm_line(mz_transit_level) WHERE mz_transit_level IS NOT NULL;
1222

13-
CREATE INDEX planet_osm_line_roads_geom_9_index ON planet_osm_line USING gist(way) WHERE (osm_id > 0 OR route = 'ferry') AND mz_calculate_road_level(highway, railway, aeroway, route, way) <= 9;
14-
CREATE INDEX planet_osm_line_roads_geom_12_index ON planet_osm_line USING gist(way) WHERE (osm_id > 0 OR route = 'ferry') AND mz_calculate_road_level(highway, railway, aeroway, route, way) <= 12;
15-
CREATE INDEX planet_osm_line_roads_geom_15_index ON planet_osm_line USING gist(way) WHERE (osm_id > 0 OR route = 'ferry') AND mz_calculate_road_level(highway, railway, aeroway, route, way) <= 15;
23+
CREATE INDEX planet_osm_line_roads_geom_index ON planet_osm_line USING gist(way) WHERE (osm_id > 0 OR route = 'ferry') AND mz_road_level IS NOT NULL;
24+
CREATE INDEX planet_osm_line_roads_geom_9_index ON planet_osm_line USING gist(way) WHERE (osm_id > 0 OR route = 'ferry') AND mz_road_level <= 9;
25+
CREATE INDEX planet_osm_line_roads_geom_12_index ON planet_osm_line USING gist(way) WHERE (osm_id > 0 OR route = 'ferry') AND mz_road_level <= 12;
26+
CREATE INDEX planet_osm_line_roads_geom_15_index ON planet_osm_line USING gist(way) WHERE (osm_id > 0 OR route = 'ferry') AND mz_road_level <= 15;
1627

17-
CREATE INDEX planet_osm_line_waterway_geom_index ON planet_osm_line USING gist(way) WHERE waterway IN ('canal', 'river', 'stream', 'dam', 'ditch', 'drain');
28+
CREATE INDEX planet_osm_line_transit_geom_index ON planet_osm_line USING gist(way) WHERE mz_transit_level IS NOT NULL;
29+
CREATE INDEX planet_osm_line_transit_geom_6_index ON planet_osm_line USING gist(way) WHERE mz_transit_level <= 6;
30+
CREATE INDEX planet_osm_line_transit_geom_9_index ON planet_osm_line USING gist(way) WHERE mz_transit_level <= 9;
31+
CREATE INDEX planet_osm_line_transit_geom_12_index ON planet_osm_line USING gist(way) WHERE mz_transit_level <= 12;
32+
CREATE INDEX planet_osm_line_transit_geom_15_index ON planet_osm_line USING gist(way) WHERE mz_transit_level <= 15;
1833

19-
CREATE INDEX planet_osm_line_transit_geom_9_index ON planet_osm_line USING gist(way) WHERE mz_calculate_transit_level(route) <= 9;
20-
CREATE INDEX planet_osm_line_transit_geom_12_index ON planet_osm_line USING gist(way) WHERE mz_calculate_transit_level(route) <= 12;
21-
CREATE INDEX planet_osm_line_transit_geom_15_index ON planet_osm_line USING gist(way) WHERE mz_calculate_transit_level(route) <= 15;
34+
CREATE INDEX planet_osm_line_waterway_geom_index ON planet_osm_line USING gist(way) WHERE waterway IN ('canal', 'river', 'stream', 'dam', 'ditch', 'drain');
2235

2336
END $$;
2437

data/apply-planet_osm_polygon.sql

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ BEGIN
99
CREATE INDEX planet_osm_polygon_wayarea_index ON planet_osm_polygon(way_area);
1010
CREATE INDEX planet_osm_polygon_building_index ON planet_osm_polygon(building) WHERE building IS NOT NULL;
1111
CREATE INDEX planet_osm_polygon_admin_level_index ON planet_osm_polygon(admin_level) WHERE boundary = 'administrative';
12+
CREATE INDEX planet_osm_polygon_admin_level_geom_index ON planet_osm_polygon USING gist(way) WHERE boundary = 'administrative';
1213
CREATE INDEX planet_osm_polygon_is_building_or_part_index ON planet_osm_polygon(mz_calculate_is_building_or_part(building, "building:part")) WHERE mz_calculate_is_building_or_part(building, "building:part") = TRUE;
1314
CREATE INDEX planet_osm_polygon_is_water_index ON planet_osm_polygon(mz_calculate_is_water("waterway", "natural", "landuse")) WHERE mz_calculate_is_water("waterway", "natural", "landuse") = TRUE;
1415

data/triggers.sql

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,14 @@ END;
3535
$$ LANGUAGE plpgsql VOLATILE;
3636

3737
CREATE TRIGGER mz_trigger_point BEFORE INSERT OR UPDATE ON planet_osm_point FOR EACH ROW EXECUTE PROCEDURE mz_trigger_function_point();
38+
39+
CREATE OR REPLACE FUNCTION mz_trigger_function_line()
40+
RETURNS TRIGGER AS $$
41+
BEGIN
42+
NEW.mz_road_level := mz_calculate_road_level(NEW.highway, NEW.railway, NEW.aeroway, NEW.route, NEW.way);
43+
NEW.mz_transit_level := mz_calculate_transit_level(NEW.route);
44+
RETURN NEW;
45+
END;
46+
$$ LANGUAGE plpgsql VOLATILE;
47+
48+
CREATE TRIGGER mz_trigger_line BEFORE INSERT OR UPDATE ON planet_osm_line FOR EACH ROW EXECUTE PROCEDURE mz_trigger_function_line();

queries/roads.jinja2

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ FROM planet_osm_line
6060

6161
WHERE
6262
{{ bounds|bbox_filter('way') }}
63-
AND mz_calculate_road_level(highway, railway, aeroway, route, way) <= {{ zoom }}
63+
AND mz_road_level <= {{ zoom }}
6464
-- the below is to filter out any relations-as-roads, since instead we are
6565
-- projecting the network attribute onto the ways. it needs some adjustment as
6666
-- other features, in this case ferry routes, are routinely mapped as relations.

queries/transit.jinja2

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,4 @@ FROM planet_osm_line
2222

2323
WHERE
2424
{{ bounds|bbox_filter('way') }}
25-
AND mz_calculate_transit_level(route) <= {{ zoom }}
25+
AND mz_transit_level <= {{ zoom }}

0 commit comments

Comments
 (0)