Názor k článku Markus Winand: SQL Performance Explained od Karel - Ano, skoro vždy to skončí inner joinem. Jen...

  • Článek je starý, nové názory již nelze přidávat.
  • 8. 7. 2013 13:12

    Karel (neregistrovaný)

    Ano, skoro vždy to skončí inner joinem. Jen občas nějakou exotikou. Já nekritizoval inner joiny. Ono bez joinu to ani nejde.

    Já upozorňoval na lidi, kteří joinují tabulku T2, která má složený klíč A a B tak, že A joinují na jednu tabulku a B joinují na jinou tabulku nebo konstantu. Co databáze udělá je dotaz na tabulku T2 přes klíč A. Následně, podle nálady, buď udělá znovu dotaz na tabulku T2, tentokrát přes sloupec B, který není zaindexovaný, a pak ty dva výsledky spojí průnikem, nebo, v tom lepším případě, vezme výsledky přes klíč A a dále to zůží dotazem přes B, tentokrát také bez indexu, protože tabulka index začínající B nemá. Neudělá to na jeden dotaz přes index A,B, protože podmínky A a B odkazují na různé zdroje. A právě ten druhý filtr přes B, které není zaindexované, je zabiják výkonu.

    Kdyby se místo toho dal dotaz přes A i B ze stejné joinované tabulky nebo oba jako konstanta, pak se dotaz provede přes index A,B, což je nesrovnatelně lepší výsledek.

    Prostě je to o tom, že nevhodně zadaná podmínka místo dotazu jednoho udělá dotazů na stejnou tabulku více, obvykle neindexované, a pak teprve výsledky spojuje do jednoho.

    A ten inner select má tu výhodu, že databáze ví, co se snažím udělat. Nalinkuje to správně, dokonce i když udělám dvě podmínky na různé zdroje (viz výše), tak to naplánuje tak, aby dotaz byl jediný. A tím, že z mého FROM zmizela tabulka, mám o to méně práce. U dvou tabulek to není takový rozdíl, ale dostat se z 10 tabulek na 3 už za to stojí (obzvláště pokud mám problém s kardinalitou nebo null hodnotami). Ve výsledku z toho stejně bude zase 10 tabulek, ale já se opticky starám jen o 3 a ten zbytek je najoinován automaticky a obvykle efektivně.

    Je to léty ověřená praxe. Včetně toho, že neplatí univerzálně. Bez Explain Plan se neobejdu a občas jsem velmi překvapen. Zatím se mi ale nestalo, aby optimalizace pro jednu verzi Oracle způsobovala ve vyšší verzi problémy. Vyšší verze někdy nabízí ještě lepší řešení, ale nestává se, že by něco dobře běžícího ve staré verzi v té nové mělo zásadní problém. Tedy pokud nezačnete používat Pragma, ale to je pak jiná pohádka. Začínal jsem na Oracle 7.