Tak konecne jsem si to v klidu precetl. Dekuji za clanek.
Priznam se, ze rekurze jsem preskocil.
Window funkce i lateral join se mi velmi libi. Otazka je, jak moc to je podporovano i v jinych serverech. Z tech vetsich me zajima MSSQL a Oracle. Z tech mensich Firebird a MySQL.
A pak kacirsky dotaz: Pokud resim podobny problem a neovladam SQL na takove urovni (proste jsem ja nebo server 100 let za opicema), nedosahnu podobne vykonnosti, kdyz si napisu nejakou stored proceduru/funkci, ktera proleze okresy a ke kazdemu ty tri nejvetsi obce proste najde, cele to slepi dohromady a vrati? Bude to tedy na vic radku kodu, ale o tolik horsi by to byt nemuselo. Cas bych tipoval nekde mezi window funkci a lateral joinem. A hlavne to dokazu na temer jakekoliv verzi temer jakehokoliv serveru.
(Jeste varianta kacirskeho reseni: Nedelat pro kazdy okres samostatny select na 3 nejvetsi obce, ale proste obce seradit podle okresu a velikosti, sekvence je projit a brat pouze prvni tri z kazdeho okresu.)
Všechny komerční servery už mají window funkce, LATERAL má určitě Oracle. Tuším, že podpora window funkcí už je i v trojkovém Firebirdu.
Jinak samozřejmě, že v uložených procedurách, pokud je jazyk dostatečně, silný uděláte cokoliv. Pro pár tisíc řádků se to v rychlosti vůbec nepozná. Na druhou stranu, uložená procedura je konečná pro optimalizátor, který nebude tušit jestli výsledkem je jeden nebo 100000 řádků.
A do třetice. Vaše navrhované řešení je ekvivalent window funkce. Cčková nativní implementace ale bude rychlejší než iterace po řádku v uložených procedurách. Samozřejmě, že je vždy otázkou o kolik, a jak je to pro dané použití významné. Pokud na 10K řádcích ušetřím 100ms, a vždy budu mít max 10K řádků, tak to asi můžu udělat skrz uložené procedury a dál neřešit.
Na druhou stranu vždy je dobré mít znalosti SQL - uložené procedury by měly fungovat jako lepidlo efektivních SQL příkazů - nikoliv suplovat neznalosti vývojáře.