Soci (Soczó Zsolt) szakmai blogja

2014.04.18.

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:
[source language=”text”]
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
[/source]

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.

5 Comments

  1. 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.

    Comment by Antal István — 2014.04.18. @ 09:24

  2. 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.

    Comment by Soczó Zsolt — 2014.04.18. @ 09:32

  3. 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.

    Comment by Simon József — 2014.04.18. @ 14:09

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

    Comment by Soczó Zsolt — 2014.04.18. @ 14:11

  5. 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.

    Comment by hrongyorgy — 2014.04.21. @ 07:37

RSS feed for comments on this post.

Sorry, the comment form is closed at this time.

Powered by WordPress