"Určitě je ale vhodné mít základy pro každou používanou technologii a vědět něco i o věcech, které se zrovna ve firmě nepoužívají."
To je v hrubém rozporu s požadavky firem, jak lze vidět z komentářů, které se ady občas vyskytnou.
Jakékoliv hlubší znalosti nejsou vítány a jsou zbytečné. Jednak mohou být dotyční lidé s těmito znalostmi chytřejší, než průměrný manažer, což je nežádoucí, a nebo mají přemíru samostatného myšlení, což je taky nežádoucí. Ideální je člověk co umí výborně používat nějakou technologii, moc nekecá a dělá co se mu řekne.
V tzv. "velkych" firmach jde i o nahraditelnost cloveka. Proto vesmes manageri pristupuji k lidek jako ke kusu dobytka. K cemu je ti nekdo chytrej, kdyz ho pak sejme nekde ponorka na prechodu a ty nemas nikoho, kdo by ho nahradil a projekt timeline jde do ... ? Proto je "lepsi" resit veci hrubou silou, ve smyslu poctu. A proto bych nikdy v takove "firmne" delat nemohl (o: Dokonce jsem zazil, ze firma preferovala kod, co byl napsanej vylozene spatne - ale protoze pouzival jen std. navrhove vzory, mohlo do nej koukat kazde pako. Extrem je pak to, kdyz se pouzivaji JEN navrhove vzory. At zije management :)
R.
Nemyslím si, že jde o reklamu.
Četl jsem zde na Rootu s chutí několik autorových článků a věřím tomu, že problematice rozumí.
Naopak nevěřím tomu, že by měl zájem dělat reklamu zde nějaké publikaci. Proto děkuji za krátkou recenzi publikace a půjdu se zeptat zaměstnavatele, jestli bychom ji nemohli koupit do knihovny ;-)
Primárně je to moje doporučení (pod které se mohu podepsat) přečíst si tuto knihu - a věřte mi, že jsem nedostal od Markuse ani halíř, a předpokládám, že iinfo na tom trhe zrovna takovou částku.
Přijde mi hrozně hloupé, že programátoři neustále opakují jednoduché chyby, které nedokáží jednoduše opravit (jelikož netuší, v čem je problém) a tak si hrozně komplikují život. A kolikrát ho komplikují i ostatním. Není to jenom moje zdejší zkušenost - zrovna tak to je i v Rakousku a jinde, kde Markus pracoval.
Mne osobne to prislo fajn, protoze po techto vecech nekoukam. Jsem odkazan na to, ze kdyz nekdo ze sveho oboru narazi na neco zajimaveho, upozorni na to.
Spise by mne zajimalo, jesli ta uroven konci na podobnem "prikladu" (coz je opravdu "o nicem" a vychazi to jen z logiky veci) nebo jsou tam reseny veci, ktery uz nejsou vubec zrejmy (ruzny joiny, poradi vnorenych selektu, ....). A jestli to ma vlastne zas takovej prinos, vzhledem k tomu, ze si to planer stejne prekope "jak se mu libi".
Jestli bych se mohl Pavla na neco zeptat, jak by otazka znela: je knizka prinosem oproti pouziti "query plan" na postgresu (jinou DB osobne nepouzivam) ? Jesli ano o kolik :) Pac potom by za to asi stala. Papir je papir (:
Dekujemes
R.
Odpovím oklikou - většina problémů s výkonem je způsobená špatným zápisem podmínek, díky kterému si to planner nemůže překopat - a výsledkem je pomalý dotaz. Markus si postupně staví prostor, pro to, aby mohl tyto antipaterny vysvětlit - a aby čtenář prozřel - nestačí jenom vědět, co nedělat - důležité, je vědět, proč to nedělat. Tomu je věnována víc než polovina knihy.
Samotného popis optimalizace a interních mechanismů v DB tam moc není - alespoň z mého pohledu. Primární cílovou skupinou jsou aplikační vývojáři, kteří o db netuší vůbec nic a nevědí, co dělají - případně vývojáři, kteří o db něco vědí, ale kteří si chtějí ověřit svoje znalosti a svoje pozorování.
Není to o tom, že by se člověk dozvěděl víc nebo něco jiného než EXPLAIN query. Je to i tom, aby člověk přemýšlel, jestli to co dělá, dělá chytře a správně. Můžete mít dotaz, kde Vám EXPLAIN potvrdí, že všude jsou indexy, a přesto to může být špatně použitý dotaz.
Já osobně jsem se z této knihy o pg nedozvěděl nic nového, ale připomenuj jsem si pár základních antipaternů a jejich korektní řešení. Tohle není knížka, která by měla sedět v knihovně a prášit se na ní - každý vývojář by si ji měl přečíst pravidelně při nástupu do práce, a pak pravidelně prolistovat každý rok (cca 20 min), aby si připomněl jestli nedělá nějakou bejkárnu.
Přesně tak. Měl jsem v plánu recenzi pro LE, ale předběhl jsi mě. :-)
Souhlasím se vším, co je napsáno. Knihu jsem si koupil hned po Markově přednášce na P2D2 ne snad proto, že bych z té přednášky něco nevěděl a bylo to pro mě zcela nové, ale hlavně proto, abych si připomenul, ja se věcí mají (a hlavně nemají) skládat dohromady.
Knihu bych skutečně doporučil každému, kdo píše dotazy (což já mimochodem nejsem, já jsem administrátor db serverů, ale i tak si vždy rád přečtu o tom, co se v tom stroji děje uvnitř a jak to dělat lépe), měl by ji mít, alespoň nějaký čas na pracovním stole.
Když už pro nic jiného, tak jen pro přílohu o čtení prováděcího plánu. Spousta lidí píšící dotazy o plánu neví a i příkaz explain je pro ně novinkou (natož, aby plán uměli číst). Takže za mě, když už nic jiného, tak tato kapitolka by měla být povinná :-)
Několik let jsem se víceméně živil optimalizací dotazů a reportů pro databázi Oracle. Prakticky cokoliv se dalo s pomocí indexů a vhodně zapsaných podmínek zrychlit. Obvykle se dařilo report, co běžel hodinu, zkrátit na několik desítek sekund. Ne proto, že bychom byli nějací úžasní mistři světa, ale proto, že autor původního kódu byl trouba.
Tou nejtriviálnější a bohužel i nejčastější chybou jsou neúplné dotazy.
Příklad:
Máme tabulku T1, klíč je A.
Máme tabulku T2, klíč je složený A a B.
Bohužel se pak běžně potkáte s dotazem:
SELECT ..
FROM T1, T2
WHERE T1.A = T2.A
AND T1.A = 'a'
AND T2.B = 'b'
Lidem, co tohle dokáží napsat, nepomůže ani svěcená voda. Přepsání do syntaxe INNER JOIN to může zatemnit, ale na výsledku nic nezmění. Do tabulky T2 se to prostě celým indexem nekoukne ani za zlaté prase. A přitom jsou hned tři způsoby jak to zlepšit. Který je nejvhodnější už závisí na konkrétních datech a je to potřeba zkusit. Konkrétně:
1. Změnit " AND T1.A = 'a' " na " AND T2.A = 'a' "
2. Přidat podmínku " AND T2.A = 'a' "
3. Tabulku T1 do joinu vůbec nedat a data z ní do SELECT vytaháme pomocí vnořeného selectu. Tedy něco jako:
SELECT T2.*, (select x from T1 where t1.A = t2.A)
FROM T2
WHERE T2.A = 'a'
AND T2.B = 'b'
Jakkoliv tato třetí metoda vypadá prasácky, tak v případech, kdy potřebuji jen jeden údaj a tabulka T2 má o několik řádů více záznamů než tabulka T1, to dává zdaleka nejlepší výsledky. Pokud máte v tabulce T2 data a tabulka T1 je jen nějaký slovník přiřazující popis ke kódům, je toto kupodivu nejrychlejší řešení.
Generalizaci jsi to zabil, kdyz uz hlasas, mel by sis vybrat co a nepopirat same sebe. Neni pravda, ze by subquery byly vzdy rychlejsi, zalezi na optimizeru jak bude vysledny dotaz v pripade subquery interpretovat, muze se totiz lehce stat, ze to prevede na inner join...
Tudiz bych se s tim "tomu nepomuze ani svecena voda" mirnil;-)
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.
Spíše jsem jako "řešení" v takovém případě viděl přidání dalšího indexu na T2.B. Takže tam jsou potom indexy T1.A, T2.A B, T2.B. Což potom vede k nárůstu diskových nároků (zbytečně se 3x kopírují data sloupce B) a také zpomalení dalších operací. Málokoho napadne tam dát podmínku (vlastně duplicitní) ještě na T2.B (a o tomto i tak kniha je, místo dalšího indexu se zamyslet nad existujícími predikáty).
Kdepak, to neudělá vůbec nic. Doporučuji vyzkoušet, ověřit. Pokud v nějaké databázi tato "řešení" u tohoto dotazu skutečně udělají nějaký rozdíl, tak to chce vyměnit databázi.
Mimochodem: já jsem tento dotaz skutečně ověřil, na reálné db2 databázi. PK na T2 se samozřejmě použije.
Upřímně řečeno si to nemohu vyzkoušet, protože výše uvedný problém (neúplný dotaz na t1 a t2 se složeným klíčem) Psql vyřešil způsobem, který už tu uvedl Pavel Stěhule. Prostě si tam doplní ten "chybějící" predikát a jede se podle složeného indexu.
Ovšem jsem si jistý, že ono řešení "doplň index nad t2.b" jsem v praxi již několikrát viděl, ale nad db, kterou tu nemám nainstalovanou.
Vase vypraveni je vyborna ukazka, jak nesmyslna vlastne ta cela SQL technologie je. Jiste, rozsirilo se to a neni pred tim uniku, ale kdyz uz se mame zamyslet, tak proc ne hned nad tim, kolik hruzy uz ta cela sql na lidstvo uvalila :-)
Jiste je krasne, ze se zivite tim, ze ty nesmysly, ktere pouzivanim sql vznikaji castecne korigujete. Ale predstava autora knihy a i autora recenze, ze se ja, aplikacni vyvojar, budu pri vsi me praci jeste zabyvat optimalizaci dotazuu je opravdu smesna. Kdo chce koncovemu zakaznikovi predat kvalitni dilo, ten ma jiz plne bryle te zakaznicke problematiky a jednoduse potrebuje nastroj (black-box), ktery za nej 'uschovu' dat prevezme.
V praxi to nakonec vypada tak, ze na puli cesty zustanou smysluplne pozadavky zakaznika a misto toho se cele tymy 'databazovych' odborniku snazi privest reseni postavene na sql-technologii k jakz takz rozumnemu provozu.
> predstava autora knihy a i autora recenze, ze se ja, aplikacni vyvojar, budu pri vsi me praci jeste zabyvat optimalizaci dotazuu je opravdu smesna
No a kdo jiný by se tím měl zabývat? To se pak nemusíte zabývat třeba ani optimalizací kódu a algoritmů, i ten jazyk, který aplikační programátor používá, je jenom nástroj...
Ale čemu se vlastně divím, optimalizace hardwarem je stále běžnější.
to s temi algoritmy je spatny priklad. Ja mam svou praci rozvrzenou a algoritmy a funkce a podsystemy tvori jeden komplex, ktery je jednou naprogramovan a odzkousen. Je _nezavisly_ na poctu dat a jejich vzajemnych vztazich. Kdybych se mel u kazdeho zakaznickeho projektu zabyvat temito zaklady, tak nebudu nikdy hotov.
Přijde na to z jaké strany se na to díváte. Mohu to vidět taky tak, jak je to úžasná technologie, která ač to používají vývojáři bez hlubších znalostí a proškolení, tak zvládá to co zvládá.
Praxe nebrzdí SQL a SQL databáze - ty jsou svými možnostmi několik let před vývojáři - možná i celou dekádu. Alespoň u čeho jsem byl, tak projekty ztroskotaly na pokusech o naroubování zákaznických požadavků do systémů, které daným požadavkům vůbec nevyhovovaly, leč které byly prodány a u kterých obchodník nasliboval modré z nebe. Takže tu máme systémy, které se kolikrát používají (nebo je snaha používat) k něčemu, k čemu nebyly určeny. A do toho ještě některé z těchto systémů jsou blbě naprogramovány - případně blbě portovány. SQL v tom hraje zanedbatelnou úlohu. Je to jenom jeden z dalších chybně používaných subsystémů - jelikož ale bývá tím posledním v řadě, tak se na něj svede vše, bo na něco, někoho se to svést musí. Nicméně, pokud by tam nebyla SQL relační databáze, a byla tam jiná db technologie, tak by to dopadlo zrovna tak.
no asi se neshodneme, ale ja si pamatuji, jak jste nekdy pred 10 lety v nejake diskuzi rikal, ze staci skoleni a kazdy se to sql muze naucit. No a ubehlo 10 let a je tu zase recenze knizky, ktery se zabyva tim samym jako tenkrat, totiz jak to udelat, aby ty systemy uspokojive fungovaly.
A skoleni nenabizite jen Vy. Delaji to po celem svete a porad stejny obrazek. I nadale, jak jsme se dovedeli dole, delame 'my prasata' ty registry vozidel chybne. Ze by to prece jen lezelo na te technologii?
Pořád si myslím, že SQL je možné se naučit. Základy SQL - práce s relacemi - 1 den, čtení prováděcích plánů - optimalizace - další den. SQL není složité. Ty dva dny tomu ale hromada vývojářů nikdy nedala! Bastlí to metodou COPY/PASTE co kde najdou na webu. SQL je technologie - není to umělá inteligence (zatím).
Vy si asi myslite, ze kazdemu vyvojari je 30 let, a SQL se mel naucit pred 10 lety a nyni ho musi umet. Asi Vas to prekvapi, ale v kazde dobe existuji jak zkuseni, tak nezkuseni programatori.
Neprekvapuje Vas pak tedy i fakt, ze se ve skolach stale vyucuje cesky jazyk? Predpokladam, ze jste rozhorcen nad tim jak je ten cesky jazyk spatne navrzen, kdyz ho nestacilo ucit za premyslovcu..
A ted vazne: z meho hlediska jsou nejvetsim problemem programatori, kteri znaji perfektne jednu nebo dve technologie a odmitaji se ucit jakekoliv dalsi s odkazem na to, ze by mely fungovat "out of the box" a pokud je s nimi problem, tak za to muze technologie a nikoliv oni. Zkuste si predstavit sebe v dobe, kdy jste Vas "pracovni" jazyk (tipuji Java/C++) neznal. Take jste si stezoval, ze po vas nekdo chce abyste znal detaily toho jazyka, jak se v nem pracuje, jeho knihovny atd?
ten priklad s tim jazykem je problematicky, jako nakonec u vsech prikladu. Ale to bychom se nakonec bavili o tom jak vhodna ta analogie je.
SQL byla pred 15 lety v zacatcich (co se sirsiho rozsireni tyce) a tehdy bych chapal, ze neexistovali odbornici. Ale od te doby probehla mnozstvi skoleni, na vsech skolach od stredni nahoru se to vyucuje, kazda databaze to ma ve jmene atd.
A jak pise pan Stehule, za 2 dny je mozno se to naucit. Tomu verim a vim, ze po tech dvou dnech ti absolventi take ulohy resi. Ten problem je, ze za 14 uz nevedi nic - protoze to _neustale nepouzivaji_. Pan Stehule a ti ostatni, kteri resi podobnou problematiku denne, tem to prijde snadne, ale tak to neni. relacni algebra a vubec logicke mysleni v oblasti mnozin je nam lidem vzdalene a zdaleka ne prirozene. Zjistilo se to take nakonec v evropskem skolstvi, kdyz se v polovine 60 tych let zkouselo zavest mnozinovy pocet do zakladnich skol. Velice brzy s tim skoncili.
Vase reseni a i tech ostatnich je v tom, ze se _programatori_ nauci to SQL (dalsi technologii). Pan Stehule zcela spravne pripomina, ze ani ty dva dny nejsou lide ochotni venovat a radeji pouzivaji copy/paste a jini diskuteri hovori o lenosti programatoru. Kdyby se lide snazili, tak by recenzovane knihy nebyly potreba.
Vite, ja mam s takovou argumentaci problem. I komunismus (rika se) by fungoval, jen kdyby lide chteli. Ale technologie, ktera odvisi od dobre vule uzivatelu je podle me chybna.
Ale takhle to v tomhle světě funguje. Vy jste špeditérská firma a pro zákazníka se snažíte dostat zboží z místa A na místo B. Bohužel se budete muset naučit řídit auto i dělat údržbu. Budete muset nastudovat legislativu a budete muset pokaždé dávat pozor při řízení auta na ulici. Bylo by fajn, kdyby se auto dalo koupit jako black box, kterému řeknete odkud kam a ono se postará o zbytek.
Řešením je najmout si na to někoho jiného. Ale vyberte si někoho, kdo umí řídit auto. A jeho poznámku "na té silnici je most, pod kterým nic vyššího než 2.8m neprojede" berte jak daný fakt a nezkoušejte s ním smlouvat nebo mu nařizovat, ať ten most zruší. Není to jeho most.
A teď zpátky k SQL. Je silné, je rychlé, je efektivní. Dělá přesně to co má a je v tom velmi dobré. Problém nastává jen ve chvíli, kdy ho používá někdo, kdo nemá ani tuchy o tom jak to použít, nebo se to použije na něco, na co to není. Osobně jsem už dvakrát použití SQL lidem vymlouval. Důraz kladu na QUERY. Opravdu chcete použít databázi na to, aby jste se na data dotazovali? Ne? Že jen chcete perzistentní data? Tak to jděte jinam, na to vám SQL databáze nebude fungovat nijak zvlášť dobře.
ani Vas priklad neni vhodny, ale ja ho poupravim. Jsem spediter a musim prepravovat zbozi autem. Ale ta auta nemaji volant, nybrz ridic udeluje autu prikazy ustne. A auto si ten slovni prikaz rozparzruje, udela si provadeci plan a zacne servomotrkama natacet kola a tak. Ale ty prikazy musi ridic zadavat spravne a kdyz neco rekne blbe, tak se muze stat, ze auto jede doleva misto doprava.
No a ted se to nastavi tak, ze existuji jen takova auta, ve skolach a na skolenich se lide uci jak ta auta 'ridit' a vubec si nedovedou predstavit, ze se drive tahalo za volant. Ale pres ta vsechna skoleni je porad mnozstvi lidi, ketri davaji tem autum spatne prikazy , auta jezdi pomalu a jinym smerem. No a tak to je cela desetileti a obcas se objevi knizka, ve ktere stoji, jak davat tem autum ty spravne prikazy. Jeji recenzi jsme si dnes precetli.
ja sam pouzivam jine nez SQL databaze a samozrejme ze je pouzivaji i jini. Fakt ovsem je (a dole to nekdo take napsal), z se dnes pouzivaji SQL databaze na kazdou volovinu a jako vyvojar jsem 'nucen' z ruznych duvodu je i v ruznych resenich nabizet (tedy alespon na oko). Ty duvody jsou z 90% ciste politicke, jen z 10% prinasi _SQL standard_ vyhody. (pracuji v oblasti software pro mensi firmy).
ale to je přece normální. Zůstanu u aut - někdo to má v krvi a jen tak pro zábavu najezdí tisíce km a baví ho to a nevidí v tom nic obtížného, někdo to v krvi nemá, ale díky okolnostem je dotlačený k tomu, že najezdí taky tisíce km, a vyjezdí se, a někdo to nemá v krvi a okolnosti ho nedotlačí, a pak jakákoliv jízda je pro něj utrpením. Zatím auta dělají, to co jim řeknete - SQL databáze dělají totéž - i když s tím nesouhlasíte - není to žádná magie.
Pokud neznas SQL tak se neser do delani appek ktery to pouzivaj ... jak jednoduchy. Takovy prasata nakopat do rite. Zcela osobne sem zrychlil firemni ERP o stovky procent ... prave proto, ze ti dobitci co to vyrabej zjevne netusej, co je to index a k cemu je to dobry ... nemluve o tom, ze naprosto klido joinujou tabulky pres textovy pole ...
Zjevne podobny prase jako ty napsalo registr vozidel, ze?
> Do tabulky T2 se to prostě celým indexem nekoukne ani za zlaté prase.
Je fajn, ze sa SQL tlaci medzi vysokourovnove deklarativne jazyky, ostava uz len pisat sql parsery, tak aby platilo to, co sa v matematike uci na zakladnej skole niekde v druhej triede. IF a = b AND b = c THEN a = c. Bohuzial sa tu na roote najdu experti, co si na takto odflaknutych databazovych implementaciach postavili business model. Obdobne ako antivirus industry profituje z neochoty MS fixovat bugy.
PG naprosto bez problémů:
postgres=# explain analyze select * from t1, t2 where t1.a = t2.a and t1.a = 34381 and t2.b = 100; QUERY PLAN -------------------------------------------------------------------------------------------------------------------------- Nested Loop (cost=0.85..16.90 rows=1 width=16) (actual time=0.066..0.071 rows=1 loops=1) -> Index Scan using t1_a_idx on t1 (cost=0.42..8.44 rows=1 width=8) (actual time=0.040..0.041 rows=1 loops=1) Index Cond: (a = 34381) -> Index Only Scan using t2_a_b_idx on t2 (cost=0.42..8.45 rows=1 width=8) (actual time=0.020..0.022 rows=1 loops=1) Index Cond: ((a = 34381) AND (b = 100)) Heap Fetches: 1 Total runtime: 0.164 ms (7 rows)
A sakra, nestihl jsem to... takže doplním že DB2 samozřejmě dělá totéž. Klidně sem hodím výstup db2expln, ale je toho hodně.
Takže jestli se nějaká databáze chová jak píše Karel, tak je řešení ještě jednodušší než nám navrhnul: vyměnit ji za něco normálního funkčního.
Jsem ale (občas) optimista a předpokládám že se prostě jedná o špatný příklad, vytvořený na místě z hlavy. Klasika.
Není problém napsat parser - a určitě by by bylo možné vložit algebraický modul, který by dokázal převést výraz sales_day + 1 = CURRENT_DATE na sales_day = CURRENT_DATE - 1, jenomže potom už byste se nedostal k časům kolem 1ms pro vytvoření plánu, a dejme tomu kompletní dotaz do 10ms. Takže tvůrci db jaksi předpokládají minimální inteligenci a znalosti u programátorů.
A nebyla by cesta udělat něco takového a aktivovat to např. u uložených procedur, kde se plány cachují?
Nicméně v podstatě souhlasím s tím, že "blbci" se nikdy nedá vyjít dostatečně vstříc a že stejskání "vývojářů", že se musí naučit to supertěžké PHP, takže po nich nikdo nemůže chtít, aby se ještě naučili základy SQL, jsou poněkud trapné...
Možné to je, ale to by výrazně zvýšilo množství kódu, který je třeba udržovat (s čím souvisí větší množství chyb), přičemž to jen pramálo souvisí s hlavním důvodem existence ACID relačních databází - poskytovat konzistentní pohledy na persistentně uložená data - takže není moc velká motivace to dělat.
Když to zjednoduším - stačí dodržovat jednoduché pravidlo zápisu predikátů
sloupec = c, případně sloupec BETWEEN a AND b a nemůžete nic pokazit, ale jakmile napíšete fce(x) = konstanta, nebo fce(x) = fce(y), kdy fce může být i výraz, tak to je problém (pokud nevíte přesně, co děláte). To bohatě stačí.
??? To je nejaka divna logika. Bavime sa o asymptotickych zlozitosti (Big-O-Notation) alebo o nejakych 10ms milisekundach co nehraju absolutne ziadnu rolu, pri predkompilovanych dotazoch (prepared statement) ulozenych v cache pamati?!?
Vasu odpoved zaradim niekam k vyhlaseniu istej firmy z roku 2006 "Bolo by mozne vylepsit parsovanie javascriptu ale to by ste sa nedostal k response casom 1ms, takze nic robit nebudeme".
Ale určitě, jednou až bude vše naprogramované, tak dojde i na optimalizace výrazů a integraci algebraických operací - a bude to marketingový trhák. Aktuálně ale žádná databáze (pokud vím) takovou optimalizaci nenabízí - kdysi v dávné historii nebylo dost paměti na kód, pak se nedostávalo CPU, dnes, kdy je obojího dostatek si myslím, že se nikomu nechce sahat do odladěného kódu jelikož trh je saturovaný a i výrazná změna kódu by negarantovala zisk - vývoj se z relačních OLTP SQL databází přesouvá do OLAP SQL databází, kde trh ještě generuje peníze a je možnost si rozebrat trh. Je možné, že budoucí OLAP databáze budou mít architekturou blíž k Prologu a podobným strojům a navíc charakter zátěže u OLAP databáze poskytuje dost času pro tyto optimalizace (navíc bez zátěže +/- 25 let starého kódu).
PREPARED STATEMENTs nejsou univerzální řešení. Velké množství dotazů se provede jenom jednou a pak Vám straší v cache, údržba velké cache má velkou režii a navíc plány mohou zastarávat, takže je potřeba jednou za čas je rebuildnout.
Koupil jsem ji přímo na autorově webu platba přes Pay-pal, do týdne doma. :)
http://sql-performance-explained.com/
No mne naskakuje husia koža aj keď vidím alternatívu b (ktorá je uvádzaná ako dobrá). Je možno lepšia ako a z performance hľadiska, ale pre mňa dobrá je maximálne ako workaround.
Predsa SQL interpret musí vedieť implicitne skonvertovať string vo formáte 'YYYY-MM-DD' (poprípade iný vopred daný formát) na dátum. Konverzie dátumov na string a naopak sa má predsa robiť len na UI vrstve.
Milujem keď čítam zdrojový kód a vidím že developeri hore dole na applikačnej a SQL vrstve konvertujú dátumy na string a naopak.
V příkladu sale_date = to_date('1970-01-01', 'YYYY-MM-DD') se jedná o explicitní konverzi ze stringu na date. Pokud napíši sale_date = '1970-01-01' tak dojde k téměř k témuž - k implicitní konverzi stringu na date. Použití explicitní konverze patří mezi best practice (minimálně na Oracle), kdy se snižuje závislost chování aplikace na konfiguraci databáze - nejde ani o výkon, ale o blbuvzdornější aplikaci - co vím, tak Oracle konverzi zvládne, bez problémů - předchází se tím ale nastartování UI, kdy se databáze snaží rozpoznat formát.
Mno ... nevim jak ktera databaze, ale minimalne nektery ti v pripade varianty A budou provadet konverzi VSECH zaznamu v tabulce na char, aby je slo porovnat s charem, kdezto v pripade druhym, se konverti jednou pred zahajenim dotazu, kterej je o porovnani s konstantou ... coz muze byt i radove rychlejsi.
Jestli pak budes provadet explicitni nebo implicitni konverzi ... to uz je jen otazka "sychr je sychr", protoze formaty datumu ... to je v databazich kapitola sama pro sebe (stejne jako desetinna tecka vs carka ...).
Zcela zjevne si nikdy nic zasadniho neresil, protoze jinak by ses nad takovou drobnosti vubec nepodivoval. Ja tu mam trebas M$ SQL a to, v jakym formatu datum zkousne zalezi i na fazi Mesice ... (ja mam EN widle, kolega CZ ... a na problem je zadelano, protoze kdyz mu ja poslu query s implicitni konverzi, on ho proste nespusti a musi si ho predelat).
Před více než 10 roky jsem na s MS SQL zažil drsné chvíle, kdy server měnil implicitní formát v závislosti, jestli byl na serveru někdo přihlášený nebo ne (přepínal češtinu a angličtinu). Ve chvíli, kdy jsem se tam přihlásil, abych oddebugoval jednu chybu mi aplikační server spadnul na chyby formátů. Takže já osobně tuhle best practicy respektuji.
Len tak naokraj som chcel, že v MSSQL by vás ani CONVERT(DATETIME, 'YYYY-MM-DD') vo všetkých jazykoch nezachránil. CONVERT(DATETIME, 'YYYYMMDD') už áno. Je to relatívne bežný omyl.
Chápem že situácia je taká aká je a kvôli spätnej kompatibilite sa to tak ľahko nezmení. Len sa mi zdá trochu choré že server musí ešte riešiť aj konverziu dátumov podľa nastaveného jazyka a nie proste striktne vyžaduje len jediný správny formát. Zobrazenie a čítanie dátumov v používateľom požadovanom formáte by podľa mojej skromnej mienky malo byť záležitosťou UI.
To souhlas, ale proste je to tak jak to je, ze primo SQLko umi vracet datumy v ruznych formatech na prani ... a uplne stejne se chovaji desetinna cisla, kde z toho podle nastaveni vylezou tecky nebo carky. A to znam i aplikaci, kde se pri komunikaci pres XML vyplnuje zhruba nasledovne:
[OBJEDNAVKA]
[POLOZKA zbozi="sud" baleni="3,5"]4.7[/POLOZKA]
[/OBJEDNAVKA]
Proste nejakou hlavu vymazanou by bylo treba strcit do 1/2coulovy vodovodni trubky ... zjevne by se tam vpohode vesla.
Ja tu neriešim variantu A, mne sa len nepáči varianta B a ani to nie s ohľadom na performance, ale kvalitu kódu. Ja som proste zástanca jednoduchosti a nepáči sa mi keď niekto rieši niečo na vrstvách na ktoré to nepatrí.
No trochu sa ma dotklo keď si ma obvinil na základe tvojich dojmov že som nič poriadne neriešil :). Ja som veru nikoho konkrétneho neurážal. Ale keď vidím mnohých diskutujúch ktorým etika na fórach nič nehovorí, tak sa nad tým len pousmejem.
Keby si mi radšej napísal ako v tvojich zásadných riešeniach postavených na M$SQL postupuješ keď nevieš aký je nastavený jazyk a aká je fáza mesiaca. Pretože ja som na podobný problém ešte nenarazil. Asi som príliš zásadový dátum vždy píšem ako YYYYMMDD alebo YYYY-MM-DDTHH:MM:SS (poprípade YYYY-MM-DD ale to len keď sa hrám v konzole a chcem aby to pekne vyzeralo, každopádne ako generovaný string z DB adaptéra by som to pre MSSQL nepoužil). Počul si už o ISO 8601 o ktorom už počuli aj súdruhovia v M$?
Pouzivat muzes format jaky chces, potiz je v tom, ze ty jednoduse predem nevis, jak se rozhodne to M$ SQL ze ma/nema nastavenej jazyk/konverze. Pokud mas aplikaci + server naprosto ve svy moci, tak se sice da spolejhat na to, ze se to bude chovat porad stejne (dokud to neopatchujes), ale k databazi/serveru se vetsinou taky pripojujou nejaci klienti ... a u tech proste to, jak maji nastavenej jazyk neovlivnis. Navic prave v pripade widli je velmi zasadni rozdil, jestli jde o widle anglicke s ceskou lokalizaci nebo widle ceske ... a to na vsech urovnich (jak srv tak klient).
A potom konverzi zajistuju tam, kde uz to mam ve sve moci - tedy klido na urovni SQL. Totiz ona bezpecnost/konzistence dat/... je o asi tak rad dulezitejsi, nez nejaka milisekunda.
BTW: Spousta "webaru" pouzivajicich MySQL vubec netusi, jak (spravne) tu databazi pripojit, a pak se divej, ze maj potize s diakritikou, s hledanim ... a datumy, protoze vubec netusej, ze jsou 3 mista, kde to musi nastavit - a jedno z nich je trebas vlastni konexe do databaze, kde se prave spolejhaj na nejakou implicitni hodnotu ... o ktere vubec nevi ze existuje.
(pro zajimavost, v pripade webu je treba znat nataveni databaze, nastaveni konexe a pak jeste poslat spravne hlavicky - jinak to nebude fungovat)
Pokud vim, jeho predstava je, ze to ma vypadat takhle:
SELECT
FROM sales
WHERE sale_date = '19700101';
Coz bude sranda, az tam napisu '19700511' a pak se bude resit, jestli je to 11.5. nebo 5.11. ... nebot oboji je jiste mozne (a i ten vice imbecilni zapis - tedy YYYYDDMM sem uz videl - pouzivaj ho britove, podobne jako palce a stopy ...).
Pokud tam je ta konverze, tak je zcela jasne, co tim pisatel minil a tudiz netreba resit, jak je zrovna nastaveny prostredi.
No myslel som si že to priamo vyplýva z toho čo som napísal, ale to môže povedať o sebe každý. Takže sa ospravedlňujem a skúsim ešte raz:
Neodsudzujem autora že robí CONVERT, ja to ale nepovažujem za ideálne riešenie, ale ako nutné zlo (workaround), a úplne chápem že na niektorých serveroch sa to proste robiť musí. Kebyže Convert nebol potrebný, nikdy by developer nebol omylom napísal niečo ako Variant A (iba ak naschvál).
V ideálnom svete by každý SQL server ktorý vie že sale_date je typu date/datetime pochopil
SELECT FROM sales
WHERE sale_date = 19700101
ale nie som ortodoxný. Celkom by mi stačilo aby si každý výrobca SQL servera zvolil svoj formát, ktorý vie za každých okolností implicitne rozparsovať
(napr. '19700101', '1970-01-01')
SQL bylo navrženo pro ruční zadávání, takže výrobci předpokládali, že uživatelé budou chtít zadávat a číst datumové typy dle svých národních zvyklostí - a s radostí jim to umožnili, a uživatelé to začali chtít. Navíc, v běžných programovacích jazycích chyběla jakákoliv podpora pro typ date, pro regulární výrazy, .. takže parsování stringů a operace s datumy na straně klienta byly dost obtížné, a bylo příjemné, když to db udělala za vás. Dost pozdě jim došlo, že to nebyl dobrý nápad, nicméně z důvodů zpětné kompatibility to už nešlo změnit. Když se podíváte do kódu Postgresu pro typ date, tak objevíte dost komplikovaný kód, kterého by se všichni rádi zbavili a podporovali jenom ANSI formát - 'YYYY-MM-DD', ale to nejde.
Jinak způsob zápisu datumu jako celého čísla není šikovný. Totiž hrozí možná záměna s integrem - jednak hrozí riziko chyb typu
WHERE sales_date = 1970-01-01
což je samosebou něco jiného, než programátor očekával - a třeba pg nedovoluje implicitní konverzi mezi date a int.
Aha. Jedna se tedy o konflikt mezi Vasi predstavou "idealniho sveta" a realitou.
To je opravdu nebezpecny pristup. Toto neni idealni svet, kazdy SQL server je trosku jiny a snaha psat reseni pro "idealni svet" nutne skonci spatne. A prestoze ja sam si casto preji, aby ruzne technologie pracovaly trosku "lepe" (rozumejte: tak jak JA si myslim ze by to bylo lepe), tyto uvahy vedou pouze k frustraci a stresu.
Je urcite dobre vedet jak by slo neco udelat lepe (a pak to tak udelat, pokud clovek dostane prilezitost), ale kritizovat SPRAVNE a FUNKCNI reseni, protoze by v "idealnim svete" mohlo byt jine, je velmi spatny pristup.
Implicitní konverzi je obecně lepší se vyhnout. Navíc třeba konkrétne u Oracle nevíte co vlastně bude konvertovat.
Dotaz
select * from tabulka where sloupcec_typu_string=1;
proběhne tak, že se pokusí zkonverovat hodnoty soupečku na číslo (a přitom samozřejmě většinou spadne)
Uvedeny priklad a konverzia to_date('1970-01-01', 'YYYY-MM-DD') je uplne spravna a presne takto sa to ma robit. Pretoze neexistuje, aby sa to ponechalo na implicitnu konverziu. Naopak, komukolvek, kto ponechava konverziu na DATE na system a robi implicitnu konverziu, by som lamal ruky. Jedine co by som vylepsil je na to_date('19700101', 'YYYYMMDD') .
Ono by možná pro zrychlení či odstranění některých problémů úplně stačilo použít něco jiného než relační databázi (dále jen RD).
Je ironií, že autor píše o fixaci na jednu technologii, ale přitom se sám fixuje na RD se SQL. RD se používají na každou pičovinu, přičemž většina reálných dat nemá vůbec povahu relací, takže nutně přichází mapování (obvykle na objektový model), ale to něco stojí. A zde pochopitelně přichází kámen úrazu a všichni se velice diví, proč je to pomalé a v potu tváře hledají nejoptimalizovanější maxiselecty, které budou danému db serveru dost dobré.
Nemám nic proti používání věcí, které fungují, ale relační databáze přece nejsou jedinou věcí, která funguje, a pro seznam hovorů a SMS v telefonu jsou předimenzovaným řešením. Problém je v onom nepěkně pojmenovaném procesu „ohýbání“ - ono když se něco moc ohýbá, většinou to pak stojí za hovno (osobní zkušenosti).
V mém seznamu kontaktů mám ke kontaktu uložené jméno a příjmení, u některých pak společnost, narozeniny, výročí, různé e-maily (s rozlišením, který je který), různé telefony (opět s rozlišením), adresy pro instant messaging… A když se objeví nový IM protokol, nová sociální síť nebo jen další využití telefonního čísla, chci si to do kontaktů přidat. Relační databáze se k tomu dá ohnout, ale nejspíš to skončí tak, že si budu moci u telefonu vybrat, zda je to mobil nebo telefon do zaměstnání nebo domů, protože udělat to obecně by s relační databází bylo moc práce.
Vaši argumentaci beru jen napůl - v relační db pro novou sociální síť s jiným formátem (a jinou sémantikou) přidám další relaci - a je to bez jakhokoliv znásilňování - a pokud mám dobře napsanou aplikaci (nebo používám pohledy a procedury), tak taková změna může být i relativně lokální v aplikaci.
Jinak souhlasím, že v document db udělám podobnou úpravu ještě jednodušeji. U relačních databází je důležité mít na začátku dobrý návrh a pak už ho moc neměnit - což pak může mít pozitivní vliv na kvalitu dat (bo jsou stabilní a udržují jakousi štábní kulturu) nebo naopak negativní - když intenzivně potřebujete měnit schéma.
Výhoda relačních SQL db jsou:
* Navrženo pro hromadné operace
* Navrženo pro ad-hoc dotazy - SQL, rychlé operace i bez indexů
* Navrženo pro dlouhodobě udržovaná data (vynucuje si konzistenci)
* Dobrá aplikační podpora (reporty, spreadsheety)
* ACID
Pokud ani jeden z těchto bodů nevyužijete (případně jde proti Vašim požadavkům např. ACID), tak pak pro Vás SQL databáze není ta pravá ořechová, a použijete jinou. Není důvod se tlačit za každou cenu do SQL relační db - před 10 roky tu moc velký výběr nebyl, ale už cca posledních 4, 5 let je relativně široká nabídka db (i O.S. db).
ja budu jedine rad, kdyz se budu vice setkavat s oop db misto desivymi orm systemy, kdyz budou fy pouzivat sloupcove nebo proudove db, pripadne inteligente cache. svet bude barevnejsi :-) na druhou stranu relacni db maji k realite stejne daleko jako oop db nebo sitove db, pokazde pracujete s urcitym modelem, ktery ma svoje vyhody a nevyhody a ktery vyzaduje urcite ohybani a zjednoduseni reality.
No, tak důvodem ke vzniku OOP bylo právě připodobnění k realitě, takže je na tom v modelování reality velice dobře, ale to je můj osobní názor. Ale jestliže máte v paměti objektový model (tedy graf) a chcete ho uložit, je asi hovadinou zkoušet ho rozstříhávat na (principiálně nekompatibilní) relace a potom ho zase pracně z relací skládat (bez ohledu na použitelnost dnešních objektových DB), když je možné jej uložit zase jako graf. To se snad shodneme. A kdo někdy v aplikaci ORM používal, ví, co je to za peklo a balast navíc představující nemalou část aplikace.
Relační databáze (relační model) velice efektivně (a šetrně ke zdrojům) dokáže provádět hromadné operace nad velkým množstvím dat. Což byl, podle mne, jeden z důvodů, proč se tyto databáze v 80 a 90 letech tak rychle rozšířily a prakticky zneviditelnily OOP db (a samozřejmě svůj vliv měl i marketing a peníze majoritních dodavatelů SQL serverů).
Aktuálně je pro většinu projektů zdrojí (paměť, CPU, Disc) dost, a tudíž jeden z důvodů (šetrnost využívaní zdrojů) pro relační databáze mizí. I když jak jsme svědky, dodavatelé dokáží vyrobit systémy, které nezvládnou 1000 uživatelů.
Myslím si, že RD tady budou stále - s OOP db nejsou vzájemně zastupitelné.
U objektových databázi bude asi zakopaný pes ve složitosti návrhu. V relační databázi začínám na úrovni jednoduchých tabulek, které se propojí relativně přímočarými vazbami. Vytvořit abstrahovaný model pomocí objektů vyžaduje mnohem víc představivosti. A každá změna návrhu je pak u objektů výrazně složitější. A čas jsou peníze.
RDB pracuje rychle s relacemi, které jsou uložené v jedné či pár tabulkách, v okamžiku, kdy je relace sestavena z mnoha tabulek (typická situace u členitých doménových modelů), jde výkon vlivem spojování tabulek do řiti.
RDB jsou rozšířené, protože začaly nejméně o 10 let dříve než ODB a protože IT má velkou setrvačnost, takže jejich vytlačení do jejich oblasti užití bude nějakou dobu trvat.
Zastupitelné jsou (vizte dnešní stav), ale dře to.
Ze svoje praxi vidim problem nekde jinde. Management se zepta "Ochrani ta vec nase data stejne dobre jako Oracle?" a tim diskuze skonci. ODB jsou tu od toho aby zjednodusily praci programatorum - opravdovy business je tam kde jsou data cenejsi nez lidka prace.
PS: Spojovani mnoha tabulek taky neni problem, dnesni optimalizatory dokazi opravdu hodne.
V puli 90 let bylo kolem oop neskutecne halo, a saturace sql databazemi nebyla tak velka, tudiz byl prostor pro alternativy - OOP bylo vsude, i na systemove urovni, napr remote object, byly i pokusy o OOP DB, napr. GEM ale nikdy se nijak zvlast nerozsirily (patrne kvuli pametivym narokum) ackoliv snaha byla, OOP bylo cool a uz tehdy byly relacni db drobet omsela technologie. Tudiz si nemyslim, ze by dominance sql db byla jen 10 let. naskokem,