SlideShare una empresa de Scribd logo
1 de 26
Descargar para leer sin conexión
SOLIDQ SUMMIT MADRID 2017
#SQSummit17
Enrique Catalá | Mentor | ecatala@solidq.com | @enriquecatala
Guillermo Perez | DEV | gperez@solidq.com |
Capas de acceso a datos .NET escalables de
verdad: el batido perfecto para el rendimiento
de tus bases de datos
SOLIDQ SUMMIT MADRID 2017
Tipología de
acceso
Por conjuntos Por cursores
Patrones de
bajo nivel
Dinámico
Adhoc
Parametrizable
Estático
Stored
procedures
Arquitecturas
Modelo
conectividad
Conectada
Desconectada
Modelo de
desarrollo
Manual
ORM
SOLIDQ SUMMIT MADRID 2017
Fundamentos
• Tiempo de desarrollo
• Diferencia de roles
• Desarrollador vs. DBA
• Independencia de la
aplicación
• Uso de modelo de
datos
• Abstracción de servidor
de base de datos
Másmotivos
• Rechazo a T-SQL
• Manejo de cadenas
para acceso a datos
• Errores en tiempo de
ejecución vs.
Compilación
• Uso de lenguajes más
familiares
• Es más “cool”
SOLIDQ SUMMIT MADRID 2017
SOLIDQ SUMMIT MADRID 2017
Librería Método ¿Qué hace?
Query.PlanCompiler
.PlanCompiler
Compile(cqt.DbCommandTree ctree,
…….)
Compila query hacia SQL Server. Coste
de compilación. Aquí generalmente es
donde debemos poner esfuerzos en
optimizar linq
Objects.Elinq.Compi
ledELinqQueryState
GetExecutionPlan(MergeOption?
forMergeOption)
Obtener plan de ejecución ya
compilado previamente
Objects.Elinq.ELinq
QueryState
GetExecutionPlan(MergeOption?
forMergeOption)
Obtener plan de ejecución todavía no
compilado
Objects.ObjectQuer
y<T>
GetResults(MergeOption?
forMergeOption)
Obtiene datos. Incluye datos
GetExecutionPlan, Compile y el coste de
materializar incluido. Es el coste total
SOLIDQ SUMMIT MADRID 2017
List<T>
O(n)
Dictionary<T,U>
O(1)
SOLIDQ SUMMIT MADRID 2017
Generalmente es preferible hacer menos operaciones a la
BBDD con mas conjuntos de filas
SOLIDQ SUMMIT MADRID 2017
SOLIDQ SUMMIT MADRID 2017
SOLIDQ SUMMIT MADRID 2017
public class MyDbContext : DbContext
{
//...
public DbSet<Product> Products
{
get; set;
}
}
var product = _dbContext.Products.Find(4);
var product2 = _dbContext.Products
.AsNoTracking()
.Where(p => p.Id == 4)
.FirstOrDefault();Implementación Dapper y EF Core
SOLIDQ SUMMIT MADRID 2017
using(var _dapper = new SqlConnection(config.ConnectionString))
{
_dapper.Open();
var product = _dapper.Query<Product>(@"
SELECT
Id,Name,Col1,Col2
FROM [dbo].[Products]
WHERE Id = @ProductId",
new
{
ProductId = 4
}).FirstOrDefault();
}
Implementación Dapper y EF Core
SOLIDQ SUMMIT MADRID 2017
var order = _dbContext.Orders
.AsNoTracking()
.Include(o => o.Details)
.ThenInclude(d => d.Product)
.Include(o => o.Customer)
.Where(o => o.Id == 4);
Implementación Dapper y EF Core
Hierarchy Load
SOLIDQ SUMMIT MADRID 2017
var orders = _dapper.Query<Order, Customer, Order>(
"/* Order join with customer */“
,(order, customer) => {
order.Customer = customer;
return order;
}
, queryParam
);
var details = _dapper.Query<OrderDetail, Product,OrderDetail>(
"/* detail join with product */“
, (detail, product) => {
detail.Product = product;
return detail;
}
, queryParam
, splitOn: "OrderId,Id“
);
foreach (var order in orders)
{
order.Details = detailResult
.Where(d => d.OrderId == order.Id)
.ToList();
}
Implementación Dapper y EF Core
Hierarchy Load
SOLIDQ SUMMIT MADRID 2017
var orders = _dapper.Query<Order, Customer, Order>(
"/* Order join with customer */“
,(order, customer) => {
order.Customer = customer;
return order;
}
, queryParam
);
var details = _dapper.Query<OrderDetail, Product,OrderDetail>(
"/* detail join with product */“
, (detail, product) => {
detail.Product = product;
return detail;
}
, queryParam
, splitOn: "OrderId,Id“
);
//Potencialmente peligroso sin un "lock“. Si ponemos un lock, lo
hacemos monothread
Parallel.ForEach(orders, (order) =>
{
order.Details = detailResult
.Where(d => d.OrderId == order.Id)
.ToList();
});
Implementación Dapper y EF Core
Hierarchy Load
SOLIDQ SUMMIT MADRID 2017
var ordersList = _dapper.Query<Order, Customer, Order>(
/*
...
*/
);
var orders = new ConcurrentDictionary<int, Order>(
ordersList.ToDictionary(o => o.Id, o => o)
);
var detailsList = _dapper.Query<OrderDetail, Product,OrderDetail>(
/*
...
*/
);
var details = new ConcurrentDictionary<int,
IEnumerable<OrderDetail>>(
detailResult
.GroupBy(d => d.OrderId)
.ToDictionary(
d => d.FirstOrDefault().OrderId,
d => d.AsEnumerable()
)
);
Parallel.ForEach(orders, (o) => {
if (details.ContainsKey(o.Key))
o.Value.Details = details[o.Key].ToList();
}
);
Implementación Dapper y EF Core
Hierarchy Load
SOLIDQ SUMMIT MADRID 2017
SOLIDQ SUMMIT MADRID 2017
SOLIDQ SUMMIT MADRID 2017
• Evita dependencia entre clases con el uso de
Interfaces
Arquitectura de
aplicación
• Evita procesados fila a fila
Capas de acceso a
datos
• La estructura de datos importa, no es todo BBDD
Complejidad
algorítmica
• Ya no estamos en los 90. Hasta tu móvil tiene 8
núcleos ☺
Consideraciones de
concurrencia
• Elige con criterio y úsalo bienORMs
SOLIDQ SUMMIT
MADRID 2017
GRACIAS!

Más contenido relacionado

La actualidad más candente

La actualidad más candente (14)

Como hacer tuning a capas de acceso a datos en .NET (dotNetConference2016)
Como hacer tuning a capas de acceso a datos en .NET (dotNetConference2016)Como hacer tuning a capas de acceso a datos en .NET (dotNetConference2016)
Como hacer tuning a capas de acceso a datos en .NET (dotNetConference2016)
 
A todo gas: inyectando nitrógeno para incrementar la velocidad de las queries...
A todo gas: inyectando nitrógeno para incrementar la velocidad de las queries...A todo gas: inyectando nitrógeno para incrementar la velocidad de las queries...
A todo gas: inyectando nitrógeno para incrementar la velocidad de las queries...
 
Tecnologíahtml5
Tecnologíahtml5Tecnologíahtml5
Tecnologíahtml5
 
Aplicando R al análisis de rendimiento de un servidor - SolidQ Summit 2017
Aplicando R al análisis de rendimiento de un servidor -  SolidQ Summit 2017Aplicando R al análisis de rendimiento de un servidor -  SolidQ Summit 2017
Aplicando R al análisis de rendimiento de un servidor - SolidQ Summit 2017
 
¿Cómo sería AdventureWorks si lo diseñara SolidQ? - SolidQ Summit 2017
¿Cómo sería AdventureWorks si lo diseñara SolidQ? - SolidQ Summit 2017¿Cómo sería AdventureWorks si lo diseñara SolidQ? - SolidQ Summit 2017
¿Cómo sería AdventureWorks si lo diseñara SolidQ? - SolidQ Summit 2017
 
Implementar BI y no parar...¡todo es empezar!
Implementar BI y no parar...¡todo es empezar!Implementar BI y no parar...¡todo es empezar!
Implementar BI y no parar...¡todo es empezar!
 
Posadev 2018 - Distributing shirts data (ES)
Posadev 2018 - Distributing shirts data (ES)Posadev 2018 - Distributing shirts data (ES)
Posadev 2018 - Distributing shirts data (ES)
 
Big data, Hadoop, HDInsight
Big data, Hadoop, HDInsightBig data, Hadoop, HDInsight
Big data, Hadoop, HDInsight
 
Sql server ha muerto, larga vida a sql server
Sql server ha muerto, larga vida a sql serverSql server ha muerto, larga vida a sql server
Sql server ha muerto, larga vida a sql server
 
Introducción R - Primeros pasos
Introducción R - Primeros pasosIntroducción R - Primeros pasos
Introducción R - Primeros pasos
 
Afinando la Administración de SQL Server y Novedades de Administración 2016 -...
Afinando la Administración de SQL Server y Novedades de Administración 2016 -...Afinando la Administración de SQL Server y Novedades de Administración 2016 -...
Afinando la Administración de SQL Server y Novedades de Administración 2016 -...
 
Datawarehouse como servicio en Azure (sqldw)
Datawarehouse como servicio en Azure (sqldw)Datawarehouse como servicio en Azure (sqldw)
Datawarehouse como servicio en Azure (sqldw)
 
Operational Analytics, ¿amigo o enemigo de los ETLs y DQ clásicos? - SolidQ S...
Operational Analytics, ¿amigo o enemigo de los ETLs y DQ clásicos? - SolidQ S...Operational Analytics, ¿amigo o enemigo de los ETLs y DQ clásicos? - SolidQ S...
Operational Analytics, ¿amigo o enemigo de los ETLs y DQ clásicos? - SolidQ S...
 
Aplicaciones escalables en la nube: mentiras y verdades
Aplicaciones escalables en la nube: mentiras y verdadesAplicaciones escalables en la nube: mentiras y verdades
Aplicaciones escalables en la nube: mentiras y verdades
 

Similar a Capas de acceso a datos .NET escalables de verdad: el batido perfecto para el rendimiento de tus bases de datos

IntroduccióN A Sql Server 2005
IntroduccióN A Sql Server 2005IntroduccióN A Sql Server 2005
IntroduccióN A Sql Server 2005
oswchavez
 
Kumbia PHP Framework - Inicios, Presente y Futuro
Kumbia PHP Framework - Inicios, Presente y FuturoKumbia PHP Framework - Inicios, Presente y Futuro
Kumbia PHP Framework - Inicios, Presente y Futuro
Deivinson Tejeda
 
De symfony 2013 dr. jenkins y mr. hyde - slides
De symfony 2013   dr. jenkins y mr. hyde - slidesDe symfony 2013   dr. jenkins y mr. hyde - slides
De symfony 2013 dr. jenkins y mr. hyde - slides
Quique Torras
 
De symfony 2013 dr. jenkins y mr. hyde - slides-842359017
De symfony 2013   dr. jenkins y mr. hyde - slides-842359017De symfony 2013   dr. jenkins y mr. hyde - slides-842359017
De symfony 2013 dr. jenkins y mr. hyde - slides-842359017
Eduardo Gulias Davis
 

Similar a Capas de acceso a datos .NET escalables de verdad: el batido perfecto para el rendimiento de tus bases de datos (20)

Capas de acceso a datos .NET escalables de verdad: el batido perfecto para el...
Capas de acceso a datos .NET escalables de verdad: el batido perfecto para el...Capas de acceso a datos .NET escalables de verdad: el batido perfecto para el...
Capas de acceso a datos .NET escalables de verdad: el batido perfecto para el...
 
Todomir
TodomirTodomir
Todomir
 
ASP.NET MVC Core
ASP.NET MVC CoreASP.NET MVC Core
ASP.NET MVC Core
 
ASP.NET MVC Core by Eduard Tomàs
ASP.NET MVC Core by Eduard TomàsASP.NET MVC Core by Eduard Tomàs
ASP.NET MVC Core by Eduard Tomàs
 
Presentación Ruby on Rails en Softare Freedom Day 09 Buenos Aires
Presentación Ruby on Rails en Softare Freedom Day 09 Buenos AiresPresentación Ruby on Rails en Softare Freedom Day 09 Buenos Aires
Presentación Ruby on Rails en Softare Freedom Day 09 Buenos Aires
 
Descubriendo Ruby on Rails (Desarrollo Agil de Aplicaciones Web)
Descubriendo Ruby on Rails (Desarrollo Agil de Aplicaciones Web)Descubriendo Ruby on Rails (Desarrollo Agil de Aplicaciones Web)
Descubriendo Ruby on Rails (Desarrollo Agil de Aplicaciones Web)
 
Descubriendo Ruby On Rails (Desarrollo Agil De Aplicaciones Web)
Descubriendo Ruby On Rails (Desarrollo Agil De Aplicaciones Web)Descubriendo Ruby On Rails (Desarrollo Agil De Aplicaciones Web)
Descubriendo Ruby On Rails (Desarrollo Agil De Aplicaciones Web)
 
Azurer Data Factory en la práctica - SolidQ Summit 2017
Azurer Data Factory en la práctica - SolidQ Summit 2017Azurer Data Factory en la práctica - SolidQ Summit 2017
Azurer Data Factory en la práctica - SolidQ Summit 2017
 
IntroduccióN A Sql Server 2005
IntroduccióN A Sql Server 2005IntroduccióN A Sql Server 2005
IntroduccióN A Sql Server 2005
 
CouchDB y el desarrollo de aplicaciones Android
CouchDB y el desarrollo de aplicaciones AndroidCouchDB y el desarrollo de aplicaciones Android
CouchDB y el desarrollo de aplicaciones Android
 
Drupal 7 a través Drupal Commerce
Drupal 7 a través Drupal CommerceDrupal 7 a través Drupal Commerce
Drupal 7 a través Drupal Commerce
 
SSIS a fondo: monitorización y ajustes del servicio en producción - SolidQ Su...
SSIS a fondo: monitorización y ajustes del servicio en producción - SolidQ Su...SSIS a fondo: monitorización y ajustes del servicio en producción - SolidQ Su...
SSIS a fondo: monitorización y ajustes del servicio en producción - SolidQ Su...
 
Cuando los desarrolladores conocieron SSAS, Business Intelligence y Big Data
Cuando los desarrolladores conocieron SSAS, Business Intelligence y Big DataCuando los desarrolladores conocieron SSAS, Business Intelligence y Big Data
Cuando los desarrolladores conocieron SSAS, Business Intelligence y Big Data
 
Entorno de datos Microsoft Cloud
Entorno de datos Microsoft CloudEntorno de datos Microsoft Cloud
Entorno de datos Microsoft Cloud
 
Gánale la partida a tu SQL Server, configuración ideal para que todo vaya bie...
Gánale la partida a tu SQL Server, configuración ideal para que todo vaya bie...Gánale la partida a tu SQL Server, configuración ideal para que todo vaya bie...
Gánale la partida a tu SQL Server, configuración ideal para que todo vaya bie...
 
Kumbia PHP Framework - Inicios, Presente y Futuro
Kumbia PHP Framework - Inicios, Presente y FuturoKumbia PHP Framework - Inicios, Presente y Futuro
Kumbia PHP Framework - Inicios, Presente y Futuro
 
Open platform - Conferencia Esri 2016
Open platform  - Conferencia Esri 2016Open platform  - Conferencia Esri 2016
Open platform - Conferencia Esri 2016
 
De symfony 2013 dr. jenkins y mr. hyde - slides
De symfony 2013   dr. jenkins y mr. hyde - slidesDe symfony 2013   dr. jenkins y mr. hyde - slides
De symfony 2013 dr. jenkins y mr. hyde - slides
 
De symfony 2013 dr. jenkins y mr. hyde - slides-842359017
De symfony 2013   dr. jenkins y mr. hyde - slides-842359017De symfony 2013   dr. jenkins y mr. hyde - slides-842359017
De symfony 2013 dr. jenkins y mr. hyde - slides-842359017
 
Migrando Qlik a Power BI - SolidQ Summit 2017
Migrando Qlik a Power BI - SolidQ Summit 2017Migrando Qlik a Power BI - SolidQ Summit 2017
Migrando Qlik a Power BI - SolidQ Summit 2017
 

Más de Enrique Catala Bañuls

Más de Enrique Catala Bañuls (20)

Capas de acceso a datos .net escalables de verdad contra SQL Server
Capas de acceso a datos .net escalables de verdad contra SQL ServerCapas de acceso a datos .net escalables de verdad contra SQL Server
Capas de acceso a datos .net escalables de verdad contra SQL Server
 
Aplicando R al análisis de rendimiento de un servidor
Aplicando R al análisis de rendimiento de un servidorAplicando R al análisis de rendimiento de un servidor
Aplicando R al análisis de rendimiento de un servidor
 
Query store
Query storeQuery store
Query store
 
Planes de ejecucion 2016
Planes de ejecucion 2016Planes de ejecucion 2016
Planes de ejecucion 2016
 
Dawarehouse como servicio en azure (sqldw)
Dawarehouse como servicio en azure (sqldw)Dawarehouse como servicio en azure (sqldw)
Dawarehouse como servicio en azure (sqldw)
 
Query store
Query storeQuery store
Query store
 
Planes de ejecucion 2
Planes de ejecucion 2Planes de ejecucion 2
Planes de ejecucion 2
 
Planes de ejecucion 1
Planes de ejecucion 1Planes de ejecucion 1
Planes de ejecucion 1
 
Migración a sql server 2016
Migración a sql server 2016Migración a sql server 2016
Migración a sql server 2016
 
Datawarehouse como servicio en azure (sqldw)
Datawarehouse como servicio en azure (sqldw)Datawarehouse como servicio en azure (sqldw)
Datawarehouse como servicio en azure (sqldw)
 
Como leer planes de ejecución - edición 2015
Como leer planes de ejecución - edición 2015Como leer planes de ejecución - edición 2015
Como leer planes de ejecución - edición 2015
 
HERRAMIENTA CASE PARA MODELADO DE ALMACENES DE DATOS BASADA EN LENGUAJES ESPE...
HERRAMIENTA CASE PARA MODELADO DE ALMACENES DE DATOS BASADA EN LENGUAJES ESPE...HERRAMIENTA CASE PARA MODELADO DE ALMACENES DE DATOS BASADA EN LENGUAJES ESPE...
HERRAMIENTA CASE PARA MODELADO DE ALMACENES DE DATOS BASADA EN LENGUAJES ESPE...
 
SQLCLR: .NET en el core de sql server
SQLCLR: .NET en el core de sql serverSQLCLR: .NET en el core de sql server
SQLCLR: .NET en el core de sql server
 
Escenarios híbridos con sql server 2014
Escenarios híbridos con sql server 2014Escenarios híbridos con sql server 2014
Escenarios híbridos con sql server 2014
 
Planes de ejecución en sql server 2014
Planes de ejecución en sql server 2014Planes de ejecución en sql server 2014
Planes de ejecución en sql server 2014
 
Transacciones diferidas
Transacciones diferidasTransacciones diferidas
Transacciones diferidas
 
Escalabilidad horizontal y arquitecturas elásticas en Microsoft azure
Escalabilidad horizontal y arquitecturas elásticas en Microsoft azureEscalabilidad horizontal y arquitecturas elásticas en Microsoft azure
Escalabilidad horizontal y arquitecturas elásticas en Microsoft azure
 
Novedades de SQL Server 2014 en motor relacional
Novedades de SQL Server 2014 en motor relacionalNovedades de SQL Server 2014 en motor relacional
Novedades de SQL Server 2014 en motor relacional
 
Experiencias de migraciones a sql server 2012-2014
Experiencias de migraciones a sql server 2012-2014 Experiencias de migraciones a sql server 2012-2014
Experiencias de migraciones a sql server 2012-2014
 
Guias y recomendaciones para instalar y configurar clusters de sql server
Guias y recomendaciones para instalar y configurar clusters de sql serverGuias y recomendaciones para instalar y configurar clusters de sql server
Guias y recomendaciones para instalar y configurar clusters de sql server
 

Último

XNXX.pptxjsjssjsjsjjsjsjsjsjjsjejejejkdkdk
XNXX.pptxjsjssjsjsjjsjsjsjsjjsjejejejkdkdkXNXX.pptxjsjssjsjsjjsjsjsjsjjsjejejejkdkdk
XNXX.pptxjsjssjsjsjjsjsjsjsjjsjejejejkdkdk
JuanmanuelYapitamani
 
La Inteligencia Artificial -AnaliticayDatos-BeatrizGarcia-Abril2024-D.pdf
La Inteligencia Artificial -AnaliticayDatos-BeatrizGarcia-Abril2024-D.pdfLa Inteligencia Artificial -AnaliticayDatos-BeatrizGarcia-Abril2024-D.pdf
La Inteligencia Artificial -AnaliticayDatos-BeatrizGarcia-Abril2024-D.pdf
analiticaydatos
 
My loft y ciencia uso de My loft. Explica cómo usar My loft para la ucv.
My loft y ciencia uso de My loft. Explica cómo usar My loft para la ucv.My loft y ciencia uso de My loft. Explica cómo usar My loft para la ucv.
My loft y ciencia uso de My loft. Explica cómo usar My loft para la ucv.
FeliGamarra1
 

Último (15)

Seguridad y privacidad (1).pptx OdayYoah
Seguridad y privacidad (1).pptx OdayYoahSeguridad y privacidad (1).pptx OdayYoah
Seguridad y privacidad (1).pptx OdayYoah
 
Análisis comparativo del olivo en los mercados de Noruega, España y Perú
Análisis comparativo del olivo en los mercados de Noruega, España y PerúAnálisis comparativo del olivo en los mercados de Noruega, España y Perú
Análisis comparativo del olivo en los mercados de Noruega, España y Perú
 
CARTA DE ATENAS 1931 - Infografia Patrimonio
CARTA DE ATENAS 1931 - Infografia PatrimonioCARTA DE ATENAS 1931 - Infografia Patrimonio
CARTA DE ATENAS 1931 - Infografia Patrimonio
 
¿Qué es el texto científico? Presentación para la clase de comunicación escri...
¿Qué es el texto científico? Presentación para la clase de comunicación escri...¿Qué es el texto científico? Presentación para la clase de comunicación escri...
¿Qué es el texto científico? Presentación para la clase de comunicación escri...
 
La semiología se encarga de estudiar los síntomas
La semiología se encarga de estudiar los síntomasLa semiología se encarga de estudiar los síntomas
La semiología se encarga de estudiar los síntomas
 
XNXX.pptxjsjssjsjsjjsjsjsjsjjsjejejejkdkdk
XNXX.pptxjsjssjsjsjjsjsjsjsjjsjejejejkdkdkXNXX.pptxjsjssjsjsjjsjsjsjsjjsjejejejkdkdk
XNXX.pptxjsjssjsjsjjsjsjsjsjjsjejejejkdkdk
 
Posición global del PIB per cápita Israelí (1948-2024).pdf
Posición global  del PIB per cápita  Israelí  (1948-2024).pdfPosición global  del PIB per cápita  Israelí  (1948-2024).pdf
Posición global del PIB per cápita Israelí (1948-2024).pdf
 
Países con mayores líneas de trenes de alta velocidad (2021).pdf
Países con  mayores líneas de trenes de alta velocidad  (2021).pdfPaíses con  mayores líneas de trenes de alta velocidad  (2021).pdf
Países con mayores líneas de trenes de alta velocidad (2021).pdf
 
Pobreza porcentual por etnia para el año (2024).pdf
Pobreza porcentual por etnia para el año (2024).pdfPobreza porcentual por etnia para el año (2024).pdf
Pobreza porcentual por etnia para el año (2024).pdf
 
Paisajismo Chino - Vegetacion y su historia
Paisajismo Chino - Vegetacion y su historiaPaisajismo Chino - Vegetacion y su historia
Paisajismo Chino - Vegetacion y su historia
 
La Inteligencia Artificial -AnaliticayDatos-BeatrizGarcia-Abril2024-D.pdf
La Inteligencia Artificial -AnaliticayDatos-BeatrizGarcia-Abril2024-D.pdfLa Inteligencia Artificial -AnaliticayDatos-BeatrizGarcia-Abril2024-D.pdf
La Inteligencia Artificial -AnaliticayDatos-BeatrizGarcia-Abril2024-D.pdf
 
Análisis integral de puesto de trabajo AFRO.pdf
Análisis integral de puesto de trabajo AFRO.pdfAnálisis integral de puesto de trabajo AFRO.pdf
Análisis integral de puesto de trabajo AFRO.pdf
 
Estudio Índice de Igualdad 2024 de Ipsos
Estudio Índice de Igualdad 2024 de IpsosEstudio Índice de Igualdad 2024 de Ipsos
Estudio Índice de Igualdad 2024 de Ipsos
 
My loft y ciencia uso de My loft. Explica cómo usar My loft para la ucv.
My loft y ciencia uso de My loft. Explica cómo usar My loft para la ucv.My loft y ciencia uso de My loft. Explica cómo usar My loft para la ucv.
My loft y ciencia uso de My loft. Explica cómo usar My loft para la ucv.
 
Guía rápida del uso del paquete estadístico Jamovi
Guía rápida del uso del paquete estadístico JamoviGuía rápida del uso del paquete estadístico Jamovi
Guía rápida del uso del paquete estadístico Jamovi
 

Capas de acceso a datos .NET escalables de verdad: el batido perfecto para el rendimiento de tus bases de datos

  • 1. SOLIDQ SUMMIT MADRID 2017 #SQSummit17 Enrique Catalá | Mentor | ecatala@solidq.com | @enriquecatala Guillermo Perez | DEV | gperez@solidq.com | Capas de acceso a datos .NET escalables de verdad: el batido perfecto para el rendimiento de tus bases de datos
  • 2. SOLIDQ SUMMIT MADRID 2017 Tipología de acceso Por conjuntos Por cursores Patrones de bajo nivel Dinámico Adhoc Parametrizable Estático Stored procedures Arquitecturas Modelo conectividad Conectada Desconectada Modelo de desarrollo Manual ORM
  • 3. SOLIDQ SUMMIT MADRID 2017 Fundamentos • Tiempo de desarrollo • Diferencia de roles • Desarrollador vs. DBA • Independencia de la aplicación • Uso de modelo de datos • Abstracción de servidor de base de datos Másmotivos • Rechazo a T-SQL • Manejo de cadenas para acceso a datos • Errores en tiempo de ejecución vs. Compilación • Uso de lenguajes más familiares • Es más “cool”
  • 5. SOLIDQ SUMMIT MADRID 2017 Librería Método ¿Qué hace? Query.PlanCompiler .PlanCompiler Compile(cqt.DbCommandTree ctree, …….) Compila query hacia SQL Server. Coste de compilación. Aquí generalmente es donde debemos poner esfuerzos en optimizar linq Objects.Elinq.Compi ledELinqQueryState GetExecutionPlan(MergeOption? forMergeOption) Obtener plan de ejecución ya compilado previamente Objects.Elinq.ELinq QueryState GetExecutionPlan(MergeOption? forMergeOption) Obtener plan de ejecución todavía no compilado Objects.ObjectQuer y<T> GetResults(MergeOption? forMergeOption) Obtiene datos. Incluye datos GetExecutionPlan, Compile y el coste de materializar incluido. Es el coste total
  • 6. SOLIDQ SUMMIT MADRID 2017 List<T> O(n) Dictionary<T,U> O(1)
  • 7. SOLIDQ SUMMIT MADRID 2017 Generalmente es preferible hacer menos operaciones a la BBDD con mas conjuntos de filas
  • 8.
  • 11.
  • 12. SOLIDQ SUMMIT MADRID 2017 public class MyDbContext : DbContext { //... public DbSet<Product> Products { get; set; } } var product = _dbContext.Products.Find(4); var product2 = _dbContext.Products .AsNoTracking() .Where(p => p.Id == 4) .FirstOrDefault();Implementación Dapper y EF Core
  • 13. SOLIDQ SUMMIT MADRID 2017 using(var _dapper = new SqlConnection(config.ConnectionString)) { _dapper.Open(); var product = _dapper.Query<Product>(@" SELECT Id,Name,Col1,Col2 FROM [dbo].[Products] WHERE Id = @ProductId", new { ProductId = 4 }).FirstOrDefault(); } Implementación Dapper y EF Core
  • 14.
  • 15. SOLIDQ SUMMIT MADRID 2017 var order = _dbContext.Orders .AsNoTracking() .Include(o => o.Details) .ThenInclude(d => d.Product) .Include(o => o.Customer) .Where(o => o.Id == 4); Implementación Dapper y EF Core Hierarchy Load
  • 16. SOLIDQ SUMMIT MADRID 2017 var orders = _dapper.Query<Order, Customer, Order>( "/* Order join with customer */“ ,(order, customer) => { order.Customer = customer; return order; } , queryParam ); var details = _dapper.Query<OrderDetail, Product,OrderDetail>( "/* detail join with product */“ , (detail, product) => { detail.Product = product; return detail; } , queryParam , splitOn: "OrderId,Id“ ); foreach (var order in orders) { order.Details = detailResult .Where(d => d.OrderId == order.Id) .ToList(); } Implementación Dapper y EF Core Hierarchy Load
  • 17.
  • 18. SOLIDQ SUMMIT MADRID 2017 var orders = _dapper.Query<Order, Customer, Order>( "/* Order join with customer */“ ,(order, customer) => { order.Customer = customer; return order; } , queryParam ); var details = _dapper.Query<OrderDetail, Product,OrderDetail>( "/* detail join with product */“ , (detail, product) => { detail.Product = product; return detail; } , queryParam , splitOn: "OrderId,Id“ ); //Potencialmente peligroso sin un "lock“. Si ponemos un lock, lo hacemos monothread Parallel.ForEach(orders, (order) => { order.Details = detailResult .Where(d => d.OrderId == order.Id) .ToList(); }); Implementación Dapper y EF Core Hierarchy Load
  • 19.
  • 20. SOLIDQ SUMMIT MADRID 2017 var ordersList = _dapper.Query<Order, Customer, Order>( /* ... */ ); var orders = new ConcurrentDictionary<int, Order>( ordersList.ToDictionary(o => o.Id, o => o) ); var detailsList = _dapper.Query<OrderDetail, Product,OrderDetail>( /* ... */ ); var details = new ConcurrentDictionary<int, IEnumerable<OrderDetail>>( detailResult .GroupBy(d => d.OrderId) .ToDictionary( d => d.FirstOrDefault().OrderId, d => d.AsEnumerable() ) ); Parallel.ForEach(orders, (o) => { if (details.ContainsKey(o.Key)) o.Value.Details = details[o.Key].ToList(); } ); Implementación Dapper y EF Core Hierarchy Load
  • 21.
  • 24.
  • 25. SOLIDQ SUMMIT MADRID 2017 • Evita dependencia entre clases con el uso de Interfaces Arquitectura de aplicación • Evita procesados fila a fila Capas de acceso a datos • La estructura de datos importa, no es todo BBDD Complejidad algorítmica • Ya no estamos en los 90. Hasta tu móvil tiene 8 núcleos ☺ Consideraciones de concurrencia • Elige con criterio y úsalo bienORMs