Portál AbcLinuxu, 22. července 2025 16:39
Řešení dotazu:
Nezarucene info:
U Oracle funguje/fungoval WHERE lepsie tam, kde mu to napovie. Ked robis nejaky JOIN cez 20 tabuliek a az na konci das WHERE, tak to Oracle bezne nezvlada. Ked preusporiadas WHERE lepsie alebo pouzijes WHERE namiesto JOINu, tak je to niekedy lepsie.
Celkovo to pomaha, ak ide o 1 hodnotu - teda ... WHERE x = (SELECT ...).
U Oracle u nejakeho podivneho nastavenia mi to tusim fungovalo tak, ze INNER JOIN uprednostnoval FULL SCAN tabuliek a WHERE uprednostnoval FULL scan 1 tabulky a vyhladavanie jednotlivych matchujucich zaznamov v druhej tabulke - tj WHERE sa choval horsie v beznych situaciach. Mozno islo len o zhodu nahod alebo som si to pomylil s vecou spominanou v predchadzajucom odstavci.
Celkovo odporucam skusit a prezriet si, ako sa to vykonava.
postgres=# EXPLAIN SELECT c.* FROM pg_class c JOIN pg_index i ON c.oid = i.indexrelid; QUERY PLAN ──────────────────────────────────────────────────────────────────────── Hash Join (cost=5.52..231.75 rows=112 width=202) Hash Cond: (c.oid = i.indexrelid) -> Seq Scan on pg_class c (cost=0.00..223.99 rows=299 width=206) -> Hash (cost=4.12..4.12 rows=112 width=4) -> Seq Scan on pg_index i (cost=0.00..4.12 rows=112 width=4) (5 rows) postgres=# EXPLAIN SELECT c.* FROM pg_class c WHERE EXISTS(SELECT * FROM pg_index i WHERE c.oid = i.indexrelid); QUERY PLAN ──────────────────────────────────────────────────────────────────────── Hash Semi Join (cost=5.52..231.54 rows=112 width=202) Hash Cond: (c.oid = i.indexrelid) -> Seq Scan on pg_class c (cost=0.00..223.99 rows=299 width=206) -> Hash (cost=4.12..4.12 rows=112 width=4) -> Seq Scan on pg_index i (cost=0.00..4.12 rows=112 width=4) (5 rows)
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.