Volgens mij begrijp je er weinig van.
Met een klein beetje SQL-ervaring en een snufje boerenverstand, haal je ORM links en rechts in.
Trust me, dat lijkt me uitgesloten. Wat jij in deze thread loopt te roepen is niet echt veel meer dan wat luid gebral zonder feiten. Wat je aanhaalt is het SELECT N+1 probleem. Maar dat is niet een resultaat van het gebruik van een O/R mapper, maar van het slecht gebruiken van functionaliteit, en je kunt SELECT N+1 bv ook krijgen bij een functionele DAL met procs.
Grappig voor een prototype of een toepassing die weinig performance eisen stelt, een drama wanneer je meer nodig hebt. Gelukkig staan de meeste ORM-tools wel toe dat je eigen SQL schrijft, maar wat is dan nog de toegevoegde waarde van de ORM? Simpele SQL kun je zelf wel schrijven en lastige SQL is te moeilijk voor ORM en moet je dus ook zelf schrijven... Er zijn zelfs leveranciers die hier geld voor durven te vragen.
*maakt kromme tenen weer recht*
Je hoeft helemaal niet je eigen SQL te schrijven om goede performance uit een O/R mapper te halen, je moet alleen de features goed gebruiken. Het SELECT N+1 probleem is de grootste, en ook de makkelijkste om te rekening mee te houden. Je wint bv veel performance door eager loading queries die met een betere O/R mapper ook nog voorzien kunnen worden van filters etc., daar kan jouw hand-geschreven SQL niet tegenop, want die queries zijn per subgraph elke keer totaal anders, plus moet je dan zelf de graph-merging schrijven buiten de SQL om. Oh wacht, jij wilt dat natuurlijk gaan doen met joins, want je denkt slim te zijn.
cariolive23 schreef op maandag 13 september 2010 @ 18:48:
En dan vliegen de LEFT JOIN's je weer om de oren, ook wanneer ze niet nodig zijn. PostgreSQL heeft met versie 9.0 (die volgende week wordt vrijgegeven) een mechanisme gemaakt om dit soort kansloze JOIN's te optimaliseren en gewoon te negeren wanneer dat kan. En dat werkt goed kan ik je vertellen. Toch jammer dat zoiets nodig is om foute SQL weg te werken.
Optimalizaties van queries heeft niets te maken met het niet uitvoeren van bepaalde outer joins, maar allezins met het bv sorteren van joins (4 inner joins zijn sneller als je eerst de kleinste sets joint). De optimizer van PostgreSql liep echt mijlen achter bij bv Sql server en minder op Oracle, dus dat ze dat hebben verbeterd is prima, maar ik snap niet echt wat dat te maken heeft met het topic.
Een ander pijnpunt zijn cascading deletes die de ORM graag wil uitvoeren, terwijl de database dit veel sneller kan. Of bv. een 100.000 records verwijderen op basis van het id, die één voor één met een eigen query worden verwijderd of met één groot IN() statement grandioos gaan mislukken (technisch mislukt, de IN wordt te groot). Gewoon een temp table met de id's dan even join-en, dat is niet iets wat de ORM kan bedenken.
Zucht...
Iedere zelfrespecterende O/R mapper heeft bulk query support, zodat je typed queries kunt uitvoeren in je code die in 1 statement worden uitgevoerd, bv DELETE FROM Foo WHERE X=@p. Cascading deletes zijn dingen die niet altijd kunnen en ook eigenlijk onwenselijk zijn in veel gevallen. Bv in multi-path graphs in je model kunnen cascading deletes al niet, en eigenlijk moet je ze ook zelf uitvoeren ipv dat door de DB laten doen (want niet altijd lukt het).
Ik weet niet naar werke crap O/R mappers jij hebt zitten kijken, maar ik zit al jaren in die tak van sport en de O/R mappers die tegenwoordig nog over zijn op volwassen platforms zijn echt niet zo brak als jij schetst (integendeel).
Geavanceerde mogelijkheden zoals windowing functions of recursieve queries, daar hoef je het al helemaal niet over te hebben.
ah, recursieve queries... En jij had het over performance? Wanneer heb je die nodig, meneer de wizard? Wanneer je een tree wilt ophalen? Maar kun je die niet veel beter anders opslaan zodat je met een normale, non-recursive query de tree kunt ophalen, waardoor CUD sneller is en simpeler?
Windowing functions zijn idd lastig, maar niet onmogelijk. Verder zijn ze veelal alleen in kleine secties van de applicatie in gebruik, waardoor je bv een deel van de query met handmatige SQL schrijft (bv door een mapping te definieren in de O/R mapper waardoor je typed queries kunt blijven schrijven en toch gebruik kunt maken van de DB functionaliteit)
Performance en ORM, geen goed koppel.
Tja, wij hebben bv veel gebruikers met inmense databases (vele miljoenen rows in honderden, soms duizenden tables) en die zijn heel tevreden over de performance. Je moet nl. weten hoe je de tool gebruikt. Jij met je handgeschreven SQL mag dan wel denken dat je snelle code kunt schrijven maar je zit aan de verkeerde kant van het hek: wat jij schrijft is een fixed api, maar de SQL die on-the-fly gegenereerd wordt is juist aangepast aan de data. Bv eager loading queries voor child nodes die zichzelf tweakt op basis van de parent set grootte. Of update queries die alleen de velden updaten die gewijzigd zijn. In hand-geschreven SQL moet je OF daar 1 query voor schrijven met COALESCE en nullable parameters, OF je moet altijd alle velden updaten. Dat is onvoordelig (data roundtripping) en je moet verder zorgen dat je geen update queries doet van rows die hetzelfde zijn, waardoor je timestamps onnodig wijzigen.
[
Voor 51% gewijzigd door
EfBe op 14-09-2010 09:13
]