Aby som bol uplny a predisiel zbytocnemu neporozumeniu, toto je ta veta, s ktorou nemozem principialne suhlasit (s p. Stehulem).
Výkonnostní problémy s databázemi většinou nejsou o tom, jak jsou napsaná SQLka (což neznamená, že se SQL nedá napsat blbě, když se chce)
Samozřejmě, že každý můžeme mít vlastní názor - a vlastní zkušenosti
.
Ono také extrémně záleží na kvalitě optimalizace té či oné databáze. S "ideálním" optimalizátorem by mělo být úplně jedno, jak dotaz napíšete. Ideální optimalizátor nemáme, ale zas pokud se trefí predikce, tak jsou dnešní optimalizátory poměrně slušné. Nesmíte brát v potaz starší verze MySQL - fakticky až do 8čky MySQL optimalizátor za moc nestojí.
Další věcí jsou mýty z dob, kdy optimalizátory byly rule based. Tam skutečně záleželo, jak se dotaz zapíše. Pokud ale vím, tak dnes se takový nikde masověji nepoužívá.
V prvom rade, neznasam myty a tie v IT (kde prakticky vsetko je trasovatelne a meratelne) nemaju co hladat. Napriek tomu je ich v tomto odvetvi mnoho. Napriklad jeden z najstarsich, ze je potrebne indexovat vseko to com mam v predikatoch alebo ze full table scan je zly...
Ako Ste spravne poznamenali "idealny optimalizator" neexistuje. Co sa tyka RBO suhlasim, nemal by sa pouzivat, ale zial velakrat je mozne vidiet ako je (napr. v Oracle) pouzity +RULE hint (napriek milionu upozorneni o supporte) a paradoxne v niektorych pripadoch ho interne (vramci data dictionary) vyuziva spominany Oracle sam :-). Iste kvalita algoritmov CB optimalizatorov sa vyvija milovymi krokmi dopredu, ale stale nie su idealne a este dlho potrva, kym sa o tuto temu nebudeme musiet v zasade zaujimat.
Samozrejme nemozme pominut fakt, ze je CB optimizer sa na zaklade "niecoho" rozhoduje. A jedno z toho "nieco" je zial aj samotne query. Napriek rozdielnosti skusenosti (ako ste sam spomenuli) nikdy sa Vam nestalo, ze problem bol za danych okolnosti riesitelne iba prepisom query? Alebo sa Vam niekdy nestalo, ze vyvojar napisal query, kde dany zapis/logika SQL query fungovala rychlo/OK do <10000 riadkov, ale pri milionoch zaznamov bol zrazu problem? Potom Ste naozaj stastny clovek.
K CBO, ked uz ste napisali, ze mame na dobrej urovni optimalizatory, opat dam priklad z Oracle (ked uz som s nim zacal pred tym priklad s nim). CBO prisiel vo verzii Oracle 7.x v 1998 (to sa cerstvo objavil PostreSQL 6.5 ak ma pamat neklame), ako tak OK, zacal byt CBO v vo verzii 10g R2, co hovorime cca o roku 2005, pricom sa zmenil zakladny costing model z IO na CPU (co znamenalo a aj rezultovalo do hodne problemov). V 11g prisiel adaptivny cursor sharing (co bol akysi fix pre CBO vyvedeny do feature, pretoze storovany/cachovany plan mohol byt suboptimalny pri rozdielnej distribucii hodnot v stlpci) a v 12c (R1) sa veci menili opat reps. priadali sa adaptivne plany (spolu s adaptivnymi statistikami), kde vybrany realny plan sa pocas svojho vykonavania moze zmenit. V 18c sa to cele este riadne vylepsilo. Napriek niekolkonasobnemu (a zasadnemu) zlepseniu algoritmov samotneho CBO u tohto vendora, po 18 rokoch pomerne dramatickeho vyvoja, stale potrebujete trasovat chovanie CBO aby ste si vyjasnili mnohe veci, pouzivat veci ako SPM alebo dokonca SQL profiles, precizne zbierat statistiky a histogramy a k tomu vsetkemu dokonca aj riadne pisat SQL query, dokonca ich rovno aj prepisat. Chcete snad podsunut myslienku, ze napr. Postgre, MySQL (

, MariaDB, DB2 alebo MSSQL su niekde inde? Analogicky mi to pride obdobne ako ked L. Ellison vyhlasil, ze Oracle DB bude self-managed alebo self-tuned a stalo sa to uz 3x. 1. prave v roku ked prisla Oracle 7, 2. pri prichode 10g a 3. ked ohlasoval autonomous database (pri 18c engineered systeme). Hadajte co? Zatial vsetko ostalo pri starom a zial zla sprava pre vyvojarov je, ze stale je potrebne rozmyslat pri designe a aj pri pisani SQL a zial i pri tom ked sa snazime zistit preco to nejde tak ako by sme chceli alebo aky bol zamer.
Dalej beznemu designerovi/vyvojarovi obycajne nehovoria nic terminy ako kardinalita, selektivita, statistiky, histogramy atd., ale zial ani co je EXPLAIN alebo EXPLAIN ANALYZE (u Postgre) a aky je medzi nimi rozdiel.
Osobne mne by stacila aspon tak vedomost, ze co su bind variables a preco sa to bez mala 20 rokov stale dookola obmiela. Stacilo by mi svoj zapis query pisal/testoval na viac ako 10-timi vzorovymi zaznamami v tabulke/ach. Ze ked uz sa naozaj, ale naozaj nemozem vyhnut nad pouzitim funkcii nad stlpcami vo WHERE klauzule, tak ze existuje nieco ako FBI. Ze pouzitie monotonne rastucej hodnoty nemusi byt zrovna to prave orechove pre primarny kluc u vysokotranzakcnej tabulky v multisession prostredi. Ze nizky "Cost" nemusi byt vzdy alfa a omega, ale ze mame tu nejaky Response time (Service+Wait time). A neposladnom rade spravne interpretovat vystup z explain...