Posted By: medved (A~z na v~eky Mikov~ce.) on 'CZdatabases'
Title:     Re: Subselect versus join (spojeni)
Date:      Thu Mar 23 14:20:30 2000

> Ahoj.
> 
>   Nekdo mi tvrdil, ze 
> 
> Select xxx FROM A WHERE A.yyy IN (SELECT zzzz FROM B)
> 
> Je rychlejsi, nez
> 
> Select xxx FROM A,B WHERE A.yyy = B.zzz
> 
> 
> Mozna zalezi na implementaci DB stroje, alee me se zda, ze obecne by mel byt
> ten druhy zpusob rychlejsi, ne ? 

Vzdy to zalezi na implementaci daneho db serveru. Obecne ale lze rici toto:

V pripade 'where' - klasickeho joinu davate db serveru, resp. jeho 
optimalizatoru, plnou volnost pri volbe strategie provedeni dotazu.

V pripade 'in' - subquery jiz rikate, ze ma dohledavat radky z A na zaklade 
vysledku z B.

Obecne existuji dve strategie:

Nested loop - setridi se prvni tabulka podle sloupce  v joinu a cyklicky se 
vyhledavaji radky z druhe tabulky.

Sort and merge - setridi se obe tabulky podle joinovacich sloupcu a krizem se 
prohledavaji (pokud se najde nejaky radek z A s yyy rovnou jinemu radku z 
B.zzz, tak zadne 'predchozi, jiz prohledane radky, z B nemohou nabyt hodnoty 
nektereho z nasledujicich A.yyy)

Tyto dve strategie predpokladaji vyuziti nejakych indexu - lze ale take 
sekvencne prohledavat jednu tabulku a k nalezenym hodnotam hledat v druhe 
tabulce.

Je ale otazkou jake z techto strategii dany db server podporuje (a jak se 
mezi nimi dokaze rozhodovat).
Pri pouziti subquery muzeme (pri 'order by v subquery) docilit neceho 
podpobneho tomu sort & merge - ale to vubec nemusi byt ten nejrychlejsi 
pristup (neco zabere ten order by). 

> Jovo.
> PS: Samozrejme jsou situace, kdy je treba strelit ten prvni zpusob - treba 
> kdyz upravujeme jiz vznikly select a nemuzeme mu vlizt do FROM ...   A taky 
> bude zalezet na velikosti tabulek... 

Bye

Medved

Si vis pacem, para bellum.

Search the boards