SQL dotaz bez opakování výsledků

j

Re:SQL dotaz bez opakování výsledků
« Odpověď #45 kdy: 02. 12. 2014, 16:29:19 »
Proste uplne normalne veci, za ktore moze optimalizacia zo strany seerveru, kde funkciu napr. diff musi aplikovat vzdy, kdezdto zakladne aritmeticke operacie nad "statickou" premmenou (aktualiny datum) si vie zoptimalizovat a pouzit index.

Nj, ty zas nechapes, ze ta fce je pomalejsi, i kdyz ji predhodis primo cisla, zeano. Vubec nemusis lizt do zadnych tabulek.

Jinak receno:
select floor(cast(getdate() - '2014-12-01' as float))
select datediff(dd,'2014-12-01', getdate())

Vrati oboje totez (neboli pocet dnu mezi nastavenym datem a soucasnym), ale v prvnim pripade je to nekolikanasobne rychlejsi. A to presto, ze to vizuelne vypada slozitejs.


apion

Re:SQL dotaz bez opakování výsledků
« Odpověď #46 kdy: 03. 12. 2014, 07:34:06 »
dobre rano,

zalezi na mnoha vecech jak bude optimalizator vyhodnocovat sql,
jsou oba sloupce indexovane jednim indexem?
- pokud ano, tak to bude bud fast full index nebo jen index scan (zalezi na strukture indexu)
- pokud ne tak se bude vzdy provadet full table scan, serazeni a vyber unikatnich zaznamu, zde zalezi na velikosti resultset a na konfiguraci db enginu

vhodnost struktury tabulky/tabulek (zda normalizovana ci denormalizovana) musi vedet autor podle pozadavku

pri popisovanem stavu by mel byt nejlepsi select distinct, pokud jde o "velkou" tabulku a casto pouzivany dotaz, pak by bylo vhodnejsi pouzit mview

apion

NooN

Re:SQL dotaz bez opakování výsledků
« Odpověď #47 kdy: 03. 12. 2014, 09:04:34 »
Proste uplne normalne veci, za ktore moze optimalizacia zo strany seerveru, kde funkciu napr. diff musi aplikovat vzdy, kdezdto zakladne aritmeticke operacie nad "statickou" premmenou (aktualiny datum) si vie zoptimalizovat a pouzit index.

Nj, ty zas nechapes, ze ta fce je pomalejsi, i kdyz ji predhodis primo cisla, zeano. Vubec nemusis lizt do zadnych tabulek.

Jinak receno:
select floor(cast(getdate() - '2014-12-01' as float))
select datediff(dd,'2014-12-01', getdate())

Vrati oboje totez (neboli pocet dnu mezi nastavenym datem a soucasnym), ale v prvnim pripade je to nekolikanasobne rychlejsi. A to presto, ze to vizuelne vypada slozitejs.
Stale je to o tom co som napisal.... floor, casting a odpocitanie si vie lahko zoptimalozovat pretoze su to trivialne funkcie. Kdezto datediff je jeden moloch ktory zalezi na roznych parametroch

Logik

  • *****
  • 1 049
    • Zobrazit profil
    • E-mail
Re:SQL dotaz bez opakování výsledků
« Odpověď #48 kdy: 03. 12. 2014, 13:21:58 »
j: Zjisti si něco o stable, volatilních a immutable funkcích, např. tady:
http://www.postgresql.org/docs/8.1/static/xfunc-volatility.html
Databáze, která takto funkce nerozlišuje, má všechny v kategorii volatile....
To je celé.

Volbou volatile či nevolatile funkce pak samozřejmě člověk může plán velmi ovlivnit včetně využití indexů - ale to patří mezi základní databázařskou latinu, to není žádná temná magie.