Witajcie.
Mam bazę danych adresów (PostgreSQL):
CREATE TABLE adresy (
id serial4 NOT NULL,
prg_id text NULL,
kod text NULL,
miasto text NULL,
ulica text NULL,
numer text NULL,
powiat text NULL,
adres text NULL
);
CREATE UNIQUE INDEX adresy_id_pkey ON adresyg USING btree (id);
Baza w sumie ma parę GB.
id = id rekordu w bazie,
kod = kod pocztowy,
ulica = ulica,
numer = numer domu,
powiat = powiat,
adres = kod pocztowy miasto ulica numer
Mam problem z zapytaniami typu:
- SELECT ulica, kod, miasto, numer, similarity('ulica' , '$address') AS similarity, row_number() OVER () AS rank FROM adresy where ulica LIKE '%$address%' and miasto = '$miejsce' and kod = '$kod' order by rank LIMIT 1;
- SELECT ulica, kod, miasto, ulica <-> '$address' AS distance, row_number() OVER () AS rank FROM adresy WHERE miasto = '$miejsce' and kod = '$kod' ORDER BY distance LIMIT 1;
(zwrócenie wyniku trwa nawet 15 sekund).
funkcja similarity wygląda tak:
CREATE OR REPLACE FUNCTION public.similarity(text, text)
RETURNS real
LANGUAGE c
IMMUTABLE PARALLEL SAFE STRICT
AS '$libdir/pg_trgm', $function$similarity$function$
;
Wie ktoś może jak można zoptymalizować zapytanie lub bazę / tabelę?