Autor Zpráva
turtle
Profil *
Mám tabuľku, kde sú hlavičky objednávok: id objednávky, názov a kontaktné údaje zákazníka, dátum objednávky...

V druhej tabuľke sú položky objednávky s id objednávky, do krorej vstupujú. Skoro všetky objednávky majú viac ako jednu položku.

Ak mám vypísať všetky objednávky môžem to urobiť niekoľkými spôsobmi:

1. SELECT * FROM HLAVICKY, výsledok prechádzať v cykle a v každom cykle urobiť SELECT do položiek na základe id objednávky

2. Jeden SELECT * FROM HLAVIČKY, POLOŽKY WHERE hlavičky.idobjed = položky.idobjed

V druhom prípade to bude len jeden SELECT ale v každom riadku sa zbytočne zopakujú data z hlavičky.
V prvom prípade ušetrím na datach, ale zasa budem robiť veľa SELECTov.

Moja otázka:
je lepší jeden veľký select s redundantnými datami alebo veľa malých?
Alebo existuje iný efektívnejší spôsob?
DJ Miky
Profil
určitě velký SELECT, je to mnohem rychlejší než 100 malých SELECTů (můj názor)

BTW, ten jeden SELECT je lepší udělat pomocí JOINů (nevím proč, ale někde jsem to četl ;-))
Kajman_
Profil *
Obecné rozřešení asi neexistuje, někdy je lepší to, jindy ono, změřte si to.

Pro nerundatní údaje lze také použít dva selecty. Jeden na objednávky a jeden na všechny položky z těch určených objednávek. Když si to dobře seřadíte, tak můžete pak v aplikaci brát jednoduše občas z jednoho selectu a občas z druhého a tak pěkně poskládat výsledek. Ale těch redudnatních sloupečků bych se nebál.

Další možností je poskládání položek rovnou do jednoho sloupku díky group_concat, ale to je možné je občas.
ninja
Profil
Relacni databaze pouzivaji SQL syntaxi, ktera je strukturova, ne proceduralni (jako programovaci jazyky). Proto je samozrejme obecne lepsi jeden velky dotaz se spoustou JOINu a SUBSELECTu, nez spousta malych dotazu.

V urcitych pripadech muze byt rychlejsi pouzit nekolik dotazu, ale to spise ukazuje na spatne navrzenou databazi. Pouzijte prikaz EXPLAIN a zkontrolujte si indexi.
turtle
Profil *
ďakujem za odpovede. Použil som ten veľký SELECT.
mila
Profil
Proto je samozrejme obecne lepsi jeden velky dotaz se spoustou JOINu a SUBSELECTu, nez spousta malych dotazu.
Nebyl bych si tím zrovna dvakrát jistý. Hlavička objednávky může být i velmi rozsáhlá. Ta se pak posílá s každým řádkem (položkou objednávky), címž může řádově narůst množství přenesených dat.
(Je možné, že jsou nějak komprimovány, takže se to neprojeví. Jestli o tom někdo ví, rád se přiučím.)


Naopak procházení cyklem a dotaz pro každou hlavičku může zvýšit velmi režii, protože každý dotaz něco stojí.

Možná nejlepší bude kompromis - zeptat se na hlavičky a druhým dotazem na všechny položky.
V každém případě by to chtělo benchmark, prostě to zkusit. Jestli půde řádově o jednotky objednávek, tak je to asi jedno. Kdyby měl jít počet do tisíců, tak je toto rozhodnutí kritické.
Toto téma je uzamčeno. Odpověď nelze zaslat.

0