posgresql skorelowane podzapytania czy

pyt Q

Jak pisałem w poprzednim poście, podzapytania z sekcji SELECT są zawsze gorsze, bo trzeba wielokrotnie wykonać podzapytania. Ale jak komuś tak ekham. pozwolę sobie mieć inne zdanie.
nie w temacie wielokrotnego wykonywania, ale w kontekście "zawsze gorsze".
jeśli wiem cokolwiek o bazach to jest to jedno: nie ma "zawsze" i "nigdy".
depesz

odp A

Znaczy uważasz, że engine mozolnie wykonuje te zapytania w pętli? Sprawdzałeś, że tak rzeczywiście jest? jeśli zapytanie w subselectie (mówię teraz o subselect'cie w klauzuli select) odwołuje się do danych "z zewnątrz" to (przynajmniej postgres) wykona nested loopa:
#v+ # explain analyze select c.relname, (select a.attname from pg_attribute a where a.attrelid = c.oid and a.attnum = 1) from pg_class c; QUERY PLAN ----------------------------------------------------------------------------------------------------------------------------------------------------------- Seq Scan on pg_class c (cost=0.00...62 rows"7 widthh) (actual time=0.049..4.670 rows"7 loops=1) SubPlan -> Index Scan using pg_attribute_relid_attnum_index on pg_attribute a (cost=0.00..8.27 rows=1 widthd) (actual time=0.010..0.013 rows=1 loops"7) Index Cond: ((attrelid = $0) AND (attnum = 1)) Total runtime: 5.166 ms (5 rows) #v-
optymalizowanie tego inaczej może być: a. trudne b. niemożliwe
zależnie od zapytania.
w sytuacji gdy pobierasz dane "niezwiązane", nie ma nested loopa:
#v+ # explain analyze select c.relname, (select a.attname from pg_attribute a limit 1) from pg_class c; QUERY PLAN --------------------------------------------------------------------------------------------------------------------------- Seq Scan on pg_class c (cost=0.03..8.30 rows"7 widthd) (actual time=0.041..0.603 rows"7 loops=1) InitPlan -> Limit (cost=0.00..0.03 rows=1 widthd) (actual time=0.015..0.017 rows=1 loops=1) -> Seq Scan on pg_attribute a (cost=0.00..47.82 rows82 widthd) (actual time=0.010..0.010 rows=1 loops=1) Total runtime: 1.045 ms (5 rows) #v-
i na koniec - zgadują, że są jakieś edge-case'y gdzie jest inaczej, ale ogólnie to działa chyba raczej tak.
depesz

Dodaj odpowiedź

Tytuł:

Mail: (w celu weryfikacji posta)