...
Proč si myslím, že to nejde: dotaz, aby byl jasné "co chci" se určitě dá sestavit jednoduše. SQL či přes ORM - to jsou jen dva způsoby, jak sdělit svoje přání o tom, jaká data chci naservírovat. (query-language)
Stroj musí úlohu provést. To dokáže vždy - i na tom se (asi) shodneme. Nám jde o to, aby to dělal efektivně.
Výkon není závislý na tom, jak dobře napíšu dotaz.
Výkon je závislý na tom, jak dobře napíšu dotaz pro daný způsob, jakým jsou data uložena (zindexována apod.).
Těch způsobů, jak uložit a zindexovat data a jak sestavit plán pro vykonání dotazu, je nepřeberné množství. I kdybychom uvažovali o prostém sekvenčním čtení, musí se engine rozhodnout, v jakém pořadí načte entity, aby bylo filtrování kritérií efektivní. Jakmile se objeví možnost užití indexů a přidají se vnořené smyčky, roste závratně množství možností, jak to hardware zpracuje. Z těchto možností potřebujeme co nejdřív eliminovat ty, ke kterým máme dostatek informací, že efektivní být nemůžou a u zbylých odhadnout, jak by takový postup trval, kolik paměti by vyžádal apod. (query-plan)
Nic z toho nedělá člověk. Tudíž to není pro téma ORM relevantní.
Abych poskytl nějaký materiál:
1/ Mám nějakou tabulku. V těch je několik sloupců, část z nich jsou cizí klíče, tedy automaticky indexovaný. Pak tam tedy mám pár sloupců, podle kterých budu nebo nebudu vyhledávat a tudíž je třeba se rozhodnout zda bude vhodné tam dát index.
2/ Mám zájem o nějaká data přes několik tabulek. Ty tabulky mohu pojoinovat různým způsobem. Těch způsobů není strašně moc, jsou dva nebo tři.
Toliko výchozí podmínka. Jak to vidím já:
1. řešení: ORM může sledovat cenu jednotlivých dotazů a vytvářet si statistiku a podle toho se rozhodnout, že zde je třeba dát index. (lehká variace na JIT) S tímto řešením mám velice dobré zkušenosti. Zvláště u skládání dotazů přes joiny.
2. řešení: Řekne se, že chci použít konkrétní strategii vytváření dotazu. U definování indexů by to asi šlo taky, ale už je to trochu divný, a nechal bych to na prvním řešení.
3. řešení: Je to tak velká exotika, že tam napíšu ruční SQL. Není se za co stydět.
Shrnuto, stroj vždycky ví nejlíp, jak poskládat dotaz. Má ty samé informace jako člověk, a dřív a rychleji. Takže dokáže lépe reagovat.
Vytváří se neoptimální plán? Může zkusit jiný. Stroj ví, proč je ten plán neoptimální, ví, který je vhodný pro jakou situaci. Ví, zda nad tím sloupcem jsou indexy. Ví kolik tam těch dat je. Ví, jak často se zapisuje nebo jak čte.
Stroj ví, jak jsou data a dotazy používány, lépe než člověk, a dokáže se jim lépe a ryhleji přizpůsobit, lépe zvolit řešení.
No a v konečném důsledku, nikdo tu nepropaguje, že v tom 0.001% případů tam do toho tomu ORMku nemohu hrábnout.
Jediné, co stroj nedokáže je rozhodnout - "to, že toto trvá tři minuty je v pořádku, protože já chci aby si ředitel počkal, chci ho totiž naštvat".