entity framework: optimalizace a záludnosti
TRANSCRIPT
© 2015 Profinit. All rights reserved.
Entity Framework:Optimalizace a záludnosti
Tomáš Vichta 28.11.2011
© 2015 Profinit. All rights reserved.
2
Představení
Zajímavé projekty– Platební brána PaySec– Poplatky a reporting pro obchody s cennými papíry– Personalizace elektronických cestovních pasů– Integrační platforma pro účetní systém– Párování bankovních výpisů– Generování platebních příkazů
Tomáš Vichta
Nezávislý konzultant, spolupracovník Profinit s.r.o.
Specializace– Technická analýza a design– Vývoj .NET, MS SQL, Oracle
© 2015 Profinit. All rights reserved.
3
Entity Framework: Optimalizace a záludnostio Zpracování dotazu
o Futures
o Hromadné zpracování
o Paralelní zpracování
© 2015 Profinit. All rights reserved.
4
Zpracování dotazu
o První metoda, která nevrací IQueryable, vygeneruje dotaz do DB– Např. ToArray(), ToList()
o Where(Func<TEntity, bool> predicate)– Filtrovací podmínku provede až klient (.NET)– Tzn. vede typicky na select celé tabulky
o Je potřeba použít Expression<Func<TEntity, bool>>– EF musí umět serializovat do SQL– Pokud neumí, exception až v runtime
© 2015 Profinit. All rights reserved.
5
Zpracování dotazu
.NET Database
User code
EF internals
Network communication
Query compilation & planning
Execution (disk operations, ...)
Network communicationEF internals
User code
© 2015 Profinit. All rights reserved.
6
Futures
o nuget balíček EntityFramework.Extended
o Pošle více EF dotazů do DB najednou, jedním SQL dotazem
o Úspora času na roundtripu– síťová komunikace– interní zpracování v .NET komponentech (user code, internal EF code)– interní zpracování v DB serveru
o Má smysl řešit– při velkých požadavcích na výkon a očekávanému velkému zatížení aplikace– pokud lze zřetězit více (nezávislých) dotazů za sebou– a nebo místo toho kód zabalit např. do stored procedure, která toho může uvnitř udělat
více, a také může vrátit více resultsetů zpět do EF (podporuje např. MS SQL)
© 2015 Profinit. All rights reserved.
7
Hromadné zpracováníUPDATE, DELETEo Potřeba řešit při insert/update/delete řádově stovek a více entit najednou
o EF obecně není dělaný na hromadné operace
o Možnosti– Vypnout DbContext.Configuration. AutoDetectChangesEnabled a
ProxyCreationEnabled, ValidateOnSaveEnabled• V EF6 málo významný vliv na výkon• Nefunguje ChangeTracking, do DB jde také sada samostatných per-entity příkazů
– Dávkové UPDATE/DELETE operace pomocí EntityFramework.Extended• Obalí EF dotaz UPDATE/DELETE klauzulí• Méně efektivní, než ručně napsaný UPDATE/DELETE, ale mnohem výkonnější, než
samostatné příkazy pro jednotlivé entity• Nevýhoda – jde mimo ChangeTracking
– Ručně psaný UPDATE, DELETE• v .NET kódu• Nebo uložená procedura• Nejrychlejší• Opět přicházíme o ChangeTracking
© 2015 Profinit. All rights reserved.
8
Hromadné zpracováníBULK INSERTo SQL BULK INSERT
o Řádově rychlejší, než klasický INSERT
o Při špatném použití riziko insertu nekonzistentních dat!
o V .NET třída System.Data.SqlClient.SqlBulkCopy– Použití přímo této třídy by bylo nejefektivnější
o EF wrapper - např. nuget EntityFramework.BulkInsert– Jde o extrémní zneužití EF, ale funguje to…
o Nezapomínat na paměťové nároky
© 2015 Profinit. All rights reserved.
9
Paralelní zpracování
o EF context není thread safe
o Nelze paralelizovat na stejné DB session (DbContextu)– .NET lockováním DB dotazů si moc nepomůžete – DB operace je obvykle to, co trvá
nejdéle.
o Pozor na deadlocky, resource contention, atd.
o Nejjednodušší - paralelizovat co nejméně
o Nezapomínat - ASP.NET web – thread per request, tzn. implicitně paralelní prostředí! Obdobně desktop aplikace.
o Obvykle – samostatný DbContext pro každou paralelní větev (thread, task)
© 2015 Profinit. All rights reserved.
Diskuze
© 2015 Profinit. All rights reserved.
Díky za pozornost• 1
© 2015 Profinit. All rights reserved.
Profinit, s.r.o., Tychonova 2, 160 00 Praha 6, +420 224 316 016, www.profinit.eu
Společnost PROFINIT je členem nadnárodní skupiny New Frontier Group, která je leadrem v oblasti digitální transformace organizací a firem ve střední a východní Evropě. S více než 2000 zaměstnanci v 17 zemích patří mezi deset největších poskytovatelů ICT služeb v celém CEE regionu a řadí se ke špičce v oblasti vývoje software na zakázku, data managementu, datových skladů a business intelligence.
PROFINIT má řadu významných zákazníků z finančního a telekomunikačního sektoru, utilit a státní správy. Společnost se primárně zaměřuje na konzultační služby v oblasti digitální transformace, technologické služby a outsourcing. Podle údajů IDC (2012) patří PROFINIT mezi 5 největších firem v oblasti vývoje software na zakázku v České Republice a je držitelem řady dalších ocenění.
Shaping future, delivering results!