-
Notifications
You must be signed in to change notification settings - Fork 588
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Make more simple incremental update (#944)
Replacing update on the whole table with an update only on changed rows. The goal is to update more quickly by just updating the changing content. The update now focus on osm_id of changed rows, it use index. Add a where clause tags != update_tags(tags, geometry) en ensure only update when changed. It requires one more trigger and a table to store changed osm_id. The UPDATE is keep in a function to be reusable for initial setup and trigger update. I try many code layout before done it in this way with the goal to keep the code for initial pass and for update. It should have low impact on initial data load. Better performance for row update can be achieve with BEFORE UPDATE, but require to duplicate the logic. It is not based on the already merged #896 because calling and update within a function for each updated row was not efficient for larger table (like housenumber). It addresses #814. * Remake update_peak_point use incremental update #814 * Make update_aerodrome_label_point use incremental update #814 * Make housenumber_centroid use incremental update #814 * Make update_continent_point use incremental update #814 * Make update_island_point use incremental update #814 * Make update_island_polygon use incremental update #814 * Remove dead code in update_state_point.sql * Make update_state_point use incremental update #814 * Remove dead code in update_country_point.sql * Make update_country_point use incremental update #814 * Make osm_poi_polygon use incremental update #814 Thanks @frodrigo
- Loading branch information
Showing
9 changed files
with
366 additions
and
103 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,32 +1,82 @@ | ||
DROP TRIGGER IF EXISTS trigger_update_point ON osm_peak_point; | ||
DROP TRIGGER IF EXISTS trigger_flag ON osm_peak_point; | ||
DROP TRIGGER IF EXISTS trigger_store ON osm_peak_point; | ||
DROP TRIGGER IF EXISTS trigger_refresh ON mountain_peak_point.updates; | ||
|
||
CREATE SCHEMA IF NOT EXISTS mountain_peak_point; | ||
|
||
CREATE TABLE IF NOT EXISTS mountain_peak_point.osm_ids | ||
( | ||
osm_id bigint | ||
); | ||
|
||
-- etldoc: osm_peak_point -> osm_peak_point | ||
CREATE OR REPLACE FUNCTION update_osm_peak_point(new_osm_id bigint) RETURNS void AS | ||
CREATE OR REPLACE FUNCTION update_osm_peak_point(full_update boolean) RETURNS void AS | ||
$$ | ||
UPDATE osm_peak_point | ||
SET tags = update_tags(tags, geometry) | ||
WHERE (new_osm_id IS NULL OR osm_id = new_osm_id) | ||
AND COALESCE(tags -> 'name:latin', tags -> 'name:nonlatin', tags -> 'name_int') IS NULL | ||
AND tags != update_tags(tags, geometry) | ||
UPDATE osm_peak_point | ||
SET tags = update_tags(tags, geometry) | ||
WHERE (full_update OR osm_id IN (SELECT osm_id FROM mountain_peak_point.osm_ids)) | ||
AND COALESCE(tags -> 'name:latin', tags -> 'name:nonlatin', tags -> 'name_int') IS NULL | ||
AND tags != update_tags(tags, geometry) | ||
$$ LANGUAGE SQL; | ||
|
||
SELECT update_osm_peak_point(NULL); | ||
SELECT update_osm_peak_point(true); | ||
|
||
-- Handle updates | ||
|
||
CREATE SCHEMA IF NOT EXISTS mountain_peak_point; | ||
CREATE OR REPLACE FUNCTION mountain_peak_point.store() RETURNS trigger AS | ||
$$ | ||
BEGIN | ||
IF (tg_op = 'DELETE') THEN | ||
INSERT INTO mountain_peak_point.osm_ids VALUES (OLD.osm_id); | ||
ELSE | ||
INSERT INTO mountain_peak_point.osm_ids VALUES (NEW.osm_id); | ||
END IF; | ||
RETURN NULL; | ||
END; | ||
$$ LANGUAGE plpgsql; | ||
|
||
CREATE OR REPLACE FUNCTION mountain_peak_point.update() RETURNS trigger AS | ||
CREATE TABLE IF NOT EXISTS mountain_peak_point.updates | ||
( | ||
id serial PRIMARY KEY, | ||
t text, | ||
UNIQUE (t) | ||
); | ||
CREATE OR REPLACE FUNCTION mountain_peak_point.flag() RETURNS trigger AS | ||
$$ | ||
BEGIN | ||
PERFORM update_osm_peak_point(new.osm_id); | ||
INSERT INTO mountain_peak_point.updates(t) VALUES ('y') ON CONFLICT(t) DO NOTHING; | ||
RETURN NULL; | ||
END; | ||
$$ LANGUAGE plpgsql; | ||
|
||
CREATE CONSTRAINT TRIGGER trigger_update_point | ||
AFTER INSERT OR UPDATE | ||
CREATE OR REPLACE FUNCTION mountain_peak_point.refresh() RETURNS trigger AS | ||
$$ | ||
BEGIN | ||
RAISE LOG 'Refresh mountain_peak_point'; | ||
PERFORM update_osm_peak_point(false); | ||
-- noinspection SqlWithoutWhere | ||
DELETE FROM mountain_peak_point.osm_ids; | ||
-- noinspection SqlWithoutWhere | ||
DELETE FROM mountain_peak_point.updates; | ||
RETURN NULL; | ||
END; | ||
$$ LANGUAGE plpgsql; | ||
|
||
CREATE TRIGGER trigger_store | ||
AFTER INSERT OR UPDATE OR DELETE | ||
ON osm_peak_point | ||
FOR EACH ROW | ||
EXECUTE PROCEDURE mountain_peak_point.store(); | ||
|
||
CREATE TRIGGER trigger_flag | ||
AFTER INSERT OR UPDATE OR DELETE | ||
ON osm_peak_point | ||
FOR EACH STATEMENT | ||
EXECUTE PROCEDURE mountain_peak_point.flag(); | ||
|
||
CREATE CONSTRAINT TRIGGER trigger_refresh | ||
AFTER INSERT | ||
ON mountain_peak_point.updates | ||
INITIALLY DEFERRED | ||
FOR EACH ROW | ||
EXECUTE PROCEDURE mountain_peak_point.update(); | ||
EXECUTE PROCEDURE mountain_peak_point.refresh(); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.