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.