entity framework: optimalizace a záludnosti

12
© 2015 Profinit. All rights reserved. Entity Framework: Optimalizace a záludnosti Tomáš Vichta 28.11.2011

Upload: profinit

Post on 16-Apr-2017

241 views

Category:

Software


0 download

TRANSCRIPT

Page 1: Entity Framework: Optimalizace a záludnosti

© 2015 Profinit. All rights reserved.

Entity Framework:Optimalizace a záludnosti

Tomáš Vichta 28.11.2011

Page 2: Entity Framework: Optimalizace a záludnosti

© 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

Page 3: Entity Framework: Optimalizace a záludnosti

© 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í

Page 4: Entity Framework: Optimalizace a záludnosti

© 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

Page 5: Entity Framework: Optimalizace a záludnosti

© 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

Page 6: Entity Framework: Optimalizace a záludnosti

© 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)

Page 7: Entity Framework: Optimalizace a záludnosti

© 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

Page 8: Entity Framework: Optimalizace a záludnosti

© 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

Page 9: Entity Framework: Optimalizace a záludnosti

© 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)

Page 10: Entity Framework: Optimalizace a záludnosti

© 2015 Profinit. All rights reserved.

Diskuze

Page 11: Entity Framework: Optimalizace a záludnosti

© 2015 Profinit. All rights reserved.

Díky za pozornost• 1

Page 12: Entity Framework: Optimalizace a záludnosti

© 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!