Autor Zpráva
Camo
Profil
Zdravím zo Slovenska!
Potreboval by som sa uistiť o jednej veci. doteraz som si myslel, že toto je optimálny výraz pre výber troch stĺpcov z dvoch tabuliek napr.:
SELECT faktury.polozka, faktury.ciastka, zakaznik.meno FROM faktury, zakaznik WHERE faktury.zakID = zakaznik.ID

No a dnes som sa dozvedel že by to malo optimálne vyzerať takto(ak to správne chápem a na to sa pýtam):
SELECT faktury.polozka, faktury.ciastka, zakaznik.meno FROM faktury JOIN zakaznik ON faktury.zakID = zakaznik.ID

Je ten druhý spôsob rýchlejší(ako som čítal, ak som to pochopil)? Lebo doteraz som žil (asi chybne)v tej prvej alternatíve...
Ďakujem za rady/názory/opravy...
bohyn
Profil
Camo:
Nevím jak v ostatních *SQL, ale v MySQL jsou obě metody totožné. Mají stejný execution plan tedy i stejnou rychlost.
TomášK
Profil
Máš někde zdroj, který to říká? Případně jsi si 100% jist? Pokud si dobře pamatuju, tak jsem jednou narazil na situaci, kdy plány shodné nebyly, dost mě to tehdy zaskočilo. Ale už je to dlouho, možná, že mě klame paměť. Zkoušel jsem chvíli hledat v dokumentaci, ale nenašel jsem tam informaci, že to je opravdu ekvivalentní.
__construct
Profil
TomášK:
Máš někde zdroj, který to říká?
Súhlasím s bohynom - zdroj - prax a nejaké tie knihy .. ;-) to čo je uvedené v prvom príklade je tzv. CROSS JOIN .. defaultný JOIN..

Camo:
Ako optimalizovať dotaz záleží na konkrétnom dotaze .. JOINov máš niekoľko typov - spomínaný CROSS, NATURAL, INNER, LEFT (OUTER), RIGHT (OUTER) ..
bohyn
Profil
TomášK:
Is there a performance difference between JOIN and WHERE?
JOIN je součástí SQL standardu až někdy od začátku 90-tých let a WHERE se běžně používá ještě dnes
TomášK
Profil
Perfektní, dík. Zas jedna fáma v mé hlavě vyvrácena.
Camo
Profil
__construct:
To čo som napísal je predsa iner join a nie cross. Je možné, že v tom mám zmätok, ale cross to nie je, lebo tam mám podmienku - faktury.zakID = zakaznik.ID - nie?.
No a tú vec mám z tadeto(posledná veta): http://www.linuxsoft.cz/article.php?id_article=827
__construct
Profil
Camo:
lebo tam mám podmienku
áno samozrejme, ospravedlňujem sa .. nevšimol som si to tam (už by som mal ísť spať :-) ) .. keby tam podmienka nebola bol by to CROSS ..čiže takto:
SELECT faktury.polozka, faktury.ciastka, zakaznik.meno FROM faktury, zakaznik;
SELECT faktury.polozka, faktury.ciastka, zakaznik.meno FROM faktury JOIN zakaznik;


//edit: Inak trochu matematiky - CROSS JOIN sa označuje aj ako Karteziánsky JOIN .. podľa Katreziánskeho súčinu ..teda s podmienkou by to neplatilo .. :)
Camo
Profil
__construct:
Som rád, že mi nestraší vo veži...

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: