1

Temat: Select zabiera straaasznie duzo czasu

Witam
Mam taki problem z baza:
Sa 2 tabele - dla uproszczenia nazwe je master i detail
obie maja pole GID (varchar(32), unique, primary key)
w tabeli master jest ok 32 tysiecy rekordow, w tabeli detail jest okolo 20 tysiecy rekordow;
do obydwu tabel dochodza rekordy w tępie mniej wiecej 1 rekord na 5 minut, w mniej wiecej takim samym tępie niektore z nich sa kasowane. (tu nie ma problemu z czasem, wykonanie delete/inserta trwa ponizej 20ms)
z kolei wywolanie zapytania:

SELECT GID FROM master WHERE GID NOT IN (SELECT GID FROM details);

trwa zazwyczaj ok 200 (sic!) sekund hmm - nie mam zbyt duzego doswiadczenia w z postgreesem ale to zapytanie nie wydaje sie jakos szczegolnie ciezkie (chce poprostu wybrac GIDy wszystkich rekordow dla ktorych nie ma informacji o detalach w drugiej tablicy (jest ich zazwyczaj 16 tysiecy (16 tysiece * varchar(32) to nie jest duzo danych ...).
jesli zrobie vacuum'a to sytuacja poprawia sie ale tylko dopuki nie zmieni sie ok 200 rekordow, potem znowu jakas kosmiczna ilosc czasu zajmuje to zapytanie.

cala baza nie jest duza, (170MB) - posiada tylko te 2 tabele
jakies pomysly co moze byc nie tak ? (reindexowanie nie pomaga, klucze i w jednej i w drugiej tabeli sa unikalne)

czy jest jakis lepszy sposob na sformulowanie tego zapytania ?

2

Odp: Select zabiera straaasznie duzo czasu

Dobrze włączyć na tabelach autovaccum - baza automatycznie będzie się zaśmiecała

Twoje zapytanie można trochę zoptymalizować
rozwiązanie 1
select m.GID from master m where not exists (select 1 from details d where d.GID=m.GID);
rozwiązanie 2
select m.GID from master m left join details d on m.GID=d.GID where d.GID is null;

Zakładam, że na tabeli details  ma polu GID masz założony index unikatowy (jeśli nie to pamiętaj, że założenie indeksu przyspiesza selecty ale zwalnia wykonywanie insertów)