Autor | Zpráva | ||
---|---|---|---|
turtle Profil * |
#1 · Zasláno: 9. 7. 2006, 09:45:48
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 |
#2 · Zasláno: 9. 7. 2006, 09:50:45 · Upravil/a: DJ Miky
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 |
#4 · Zasláno: 9. 7. 2006, 12:40:50
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 * |
#5 · Zasláno: 10. 7. 2006, 11:57:19
ďakujem za odpovede. Použil som ten veľký SELECT.
|
||
mila Profil |
#6 · Zasláno: 10. 7. 2006, 14:47:22
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é. |
||
Časová prodleva: 18 let
|
Toto téma je uzamčeno. Odpověď nelze zaslat.
0