Jah, seda koodi saab kindlasti **kiirendada ja optimeerida**, eriti kuna tegemist on keeruka **ruumilise JOIN-iga**, mida tehakse mitmekordselt igas batch’is. Siin on kõige olulisemad punktid, kuidas seda kiiremaks ja tõhusamaks muuta: --- ## ✅ **1. Ära SELECT-i kogu `nodes` tabelit igas batch’is** Igas `psql -c` käsus tehakse: ```sql nodes AS (SELECT * FROM ${pk}.nodes), ``` See tähendab, et kogu `nodes` tabel **laetakse mällu iga 10 000 rea kaupa** – see on **ebavajalik kulu**. Tee sellest **ajutine temp tabel varem**: ```bash psql ${CONNECTION_NAME} -c "DROP TABLE IF EXISTS tmp_nodes; CREATE TEMP TABLE tmp_nodes AS SELECT id, geom FROM ${pk}.nodes; CREATE INDEX ON tmp_nodes USING GIST (geom);" ``` Ja siis asenda igas batch’is: ```sql nodes AS (SELECT * FROM tmp_nodes) -- või lihtsalt viita otse: tmp_nodes ``` --- ## ✅ **2. Tee geomeetriafunktsioonid eeltöötlusena** `ST_StartPoint(...)` ja `ST_EndPoint(...)` arvutatakse **iga JOIN puhul uuesti**, iga kord. See on aeglane. Lahendus: arvuta need **korra ette** ja salvesta ajutiselt: ```bash psql ${CONNECTION_NAME} -c "DROP TABLE IF EXISTS tmp_link_points; CREATE TEMP TABLE tmp_link_points AS SELECT id, ST_StartPoint(geom) AS pt_start, ST_EndPoint(geom) AS pt_end, geom FROM ${pk}.links; CREATE INDEX ON tmp_link_points USING GIST (pt_start); CREATE INDEX ON tmp_link_points USING GIST (pt_end);" ``` Ja siis batch'i sees tee näiteks: ```sql WITH link_batch AS ( SELECT * FROM tmp_link_points WHERE id BETWEEN $i AND $END ), link_data AS ( SELECT l.id, n1.id AS source, n2.id AS target, ST_Length(l.geom) AS cost FROM link_batch l JOIN tmp_nodes n1 ON ST_DWithin(l.pt_start, n1.geom, 0.01) AND ST_Distance(l.pt_start, n1.geom) = 0 JOIN tmp_nodes n2 ON ST_DWithin(l.pt_end, n2.geom, 0.01) AND ST_Distance(l.pt_end, n2.geom) = 0 ) UPDATE ${pk}.links l SET source = d.source, target = d.target, cost = ROUND(d.cost::numeric, 1) FROM link_data d WHERE l.id = d.id; ``` --- ## ✅ **3. Vähenda SQL kutsete arvu — tee kõik ühes `psql` sessioonis** Kui võimalik, tee kogu batchimine **PostgreSQLi enda sees** PL/pgSQL’ga või `DO $$ BEGIN ... END $$`. Aga isegi Bashis saad sa vältida iga 10k kaupa uut `psql` protsessi, kui kasutad nt: ```bash psql ${CONNECTION_NAME} <