Could you hire me? Contact me if you like what I’ve done in this article and think I can create value for your company with my skills.

April 18, 2014 / by Zsolt Soczó

Az ORM batching perf vonzata

Az egyik ügyfelemnél letöltenek pár száz sort memóriába Entity Frameworkkel. Ott C# kóddal mindenféle komplex módon kitalálják, melyik entitást hogyan kell módosítani, majd a módosítások eredményét az EF betolja adatbázisba. Bár a szerveren nem volt nagy terhelés, mégis volt amikor 1000 fölött volt a batch request/second.

Miért? Mert az EF nem tudja összenyalábolni a módosításokat, hanem egyesével küldi be őket. Azaz, ha 300 sor módosult, akkor 300 update fog bemenni, ennyi roundtrip lesz. Ez annyira gáz, hogy egyszerűen nem értem az MS-t, miért nincs még batching a 6-os EF-ben.

Mutatok egy példát, mekkora hatása van ennek. Az NHibernate bármennyire is elhanyagolt manapság, de ő szépen tud batchelni.
A következő példában letöltök 20000 sort, módosítom mindet, majd visszamentem a módosításokkal. EF-fel ez 11mp.
NHibernate-tel meg tudom mondani, hány utasítást küldjön be egyszerre. Ettől függően az alábbi számok jönnek ki:

NHib test - BatchSize: 1000000, Duration: 00:00:00.9390957
NHib test - BatchSize: 100000, Duration: 00:00:00.8363326
NHib test - BatchSize: 10000, Duration: 00:00:00.8463299
NHib test - BatchSize: 1000, Duration: 00:00:01.0654756
NHib test - BatchSize: 100, Duration: 00:00:01.3361271
NHib test - BatchSize: 10, Duration: 00:00:02.4312424
NHib test - BatchSize: 1, Duration: 00:00:10.4669159

Elég nagy batch méretnél a 10 mp lemegy 1mp alá!
EF-nél 11, és kész. Cáfoljon meg valaki, hogy rosszul tudom, és az EF is tudja ezt.

Could you hire me? Contact me if you like what I’ve done in this article and think I can create value for your company with my skills.

LEAVE A COMMENT

5 COMMENTS

  • Antal István April 18, 2014

    Te Soci, 20 ezer sornál mi értelme az 1 millás meg a 100 ezres batch size-nak?
    Amúgy az EF szokásos MS sztori. Ígéretek vannak, fejlődés van, csak pont nem a legfontosabbak…..

    EF6-ban is ösztövér módon van kezelve a multiple result set tárolt eljárásnál, pedig a 4.0 óta az egyik legtöbbet igényelt feature.

    És ez a batch-es dolog is…. pedig szeretem az EF-et.

    NHib akkor parkolópálya? Épp akartam ismerkedni vele.

  • Soczó Zsolt April 18, 2014

    Nagyobb batch size mint a sorok száma: nyilván nincs értelme, csak benne maradt a kódban.
    Az Nhib nem parkolópálya, csak szomorú, hogy nem fejleszti senki igazán. Ez a baj az open source projektekkel, igazából ezek sokszor csak egy valaki által fejlesztettek, hisz kinek van ideje-ereje ingyen dolgozni? Ha az az egy valaki leáll vele, akkor beáll minden.

  • Simon József April 18, 2014

    Ez így van sajnos. Erre (meg sok egyéb másra) van egy jó kis EF kiegészítés: Entity Framework Extended Library (https://github.com/loresoft/EntityFramework.Extended)
    Még nem használtam gyakorlatban de jónak tűnik.

  • Soczó Zsolt April 18, 2014

    Sajnos az mást tud, ami nekem kellene, hogy a SaveChanges() belülről batcheljen.

  • hrongyorgy April 21, 2014

    Az EF nincs ezzel egyedul, alapbol a Rails ActiveRecord-ja sem ismeri a batchelest. Raadasul az iterator is butan van megvalositva, teljes betoltessel, holott ugyanabban az osztalyban elerheto a normalisan, objektumonkent iteralo fuggveny is – csak annak tok mas a neve, elsore nem trivialis, hogy nem a normal iteratort kell hasznalni.

    Nem mindenki tud ORM eszkozt tervezni, sajnos. Az a keves meg, aki tud, tul elfoglalt ahhoz, hogy ingyen dolgozzon.

    Btw, spammer az oldalon felettem.