Mysql a outer join (OT)

Zakkr zakkr na zf.jcu.cz
Pondělí Říjen 4 20:23:08 CEST 1999



On Mon, 4 Oct 1999, Jan Kasprzak wrote:

> 	Zdravim, mam takovy problem - a nevim jak to vyoptimalizovat:
> Mam tabulku T2 s primarnim klicem ID (int), a tabulku T1 s primarnim
> klicem ID (int) a tremi dalsimi ciselnymi sloupci C1, C2 a C3, na kterych
> mam index, a ktere maji slouzit jako vazba do T2. Potrebuju najit
> takove radky v T2, ktere nemaji odkaz z T1 ani v jednom z C1, C2, C3.
> 
> 	Pro jeden sloupec je to rozumne rychle:
> 
> SELECT T2.ID FROM T2 LEFT OUTER JOIN T1 ON T2.ID = T1.C1 WHERE T1.ID IS NULL;
> 
> (explain rika, ze se pouzije "ref" a skutecne je to celkem rychle).
> Ale pokud chci testovat vsechny tri sloupce, explain mi rekne, ze pouziva
> "ALL" a skutecne je to hrozne pomale:
> 
> SELECT T2.ID FROM T2 LEFT OUTER JOIN T1 ON T2.ID = T1.C1 OR T2.ID = T1.C2
> OR T2.ID = T1.C3 WHERE T1.ID IS NULL;
> 
> 	On asi nepozna, ze ten ON vyraz je v podstate jednoduchy, nebo
> tak neco.
> 
> 	Nebo jinak: Jak co nejrychleji vyberu z T2 radky, ktere nejsou
> navazany na T1 ani pres jedno z C1, C2 nebo C3?

No vim, ze ti tim nepomohu, (a nejake lepsi reseni nez join asi ani
nenajdes..), ale mozne a celkem hezke reseni (nevim jak rychle) v 
PostgreSQL by bylo pomoci array typu - kdy C1-C2-C3 jsou jedno int4[]
(rikejme mu C_all). Pak staci jen:

	SELECT T2.id FROM T2, T1 WHERE not T2.id *= T1.C_all;

... pekne, ze :-))
						Zakkr
						





Další informace o konferenci Databases