网站备案 注册用户,重庆绝美的十大冷门景点,wordpress虚拟,阿里接外包吗网站开发背景EntityFramework Core有许多新的特性#xff0c;其中一个重要特性便是批量操作。批量操作意味着不需要为每次Insert/Update/Delete操作发送单独的命令#xff0c;而是在一次SQL请求中发送批量组合指令。EFCore批量操作实践批处理是期待已久的功能#xff0c;社区多次提出… 背景EntityFramework Core有许多新的特性其中一个重要特性便是批量操作。批量操作意味着不需要为每次Insert/Update/Delete操作发送单独的命令而是在一次SQL请求中发送批量组合指令。EFCore批量操作实践批处理是期待已久的功能社区多次提出要求。现在EFCore支持开箱即用确实很棒可以提高应用程序的性能和速度。1对比实践以常见的批量插入为例使用SQL Server Profiler观察产生并执行的SQL语句。// category表添加3条记录并执行保存using (var c new SampleDBContext()){ c.Categories.Add(new Category() { CategoryID 1, CategoryName Clothing }); c.Categories.Add(new Category() { CategoryID 2, CategoryName Footwear }); c.Categories.Add(new Category() { CategoryID 3, CategoryName Accessories }); c.SaveChanges();}当执行SaveChanges(), 从SQL Profiler追溯到的SQLexec sp_executesql NSET NOCOUNT ON;INSERT INTO [Categories] ([CategoryID], [CategoryName])VALUES (p0, p1),(p2, p3),(p4, p5);,Np0 int,p1 nvarchar(4000),p2 int,p3 nvarchar(4000),p4 int,p5 nvarchar(4000),p01,p1NClothing,p22,p3NFootwear,p43,p5NAccessories如你所见批量插入没有产生3个独立的语句而是被组合为一个传参存储过程脚本用列值作为参数如果使用EF6执行相同的代码则在SQL Server Profiler中将看到3个独立的插入语句 。下面是EFCore、EF6批量插入的对比截图① 就性能和速度而言EFCore批量插入更具优势② 若数据库是针对云部署EF6运行这些查询还将产生额外的流量成本经过验证EFCore批量更新、批量删除功能EFCore均发出了使用sp_executesql存储过程批量参数构建的SQL脚本。2深入分析起关键作用的存储过程sp_executesql可以多次执行的语句或批处理 可带参- Syntax for SQL Server, Azure SQL Database, Azure SQL Data Warehouse, Parallel Data Warehouse sp_executesql [ stmt ] statement [ { , [ params ] Nparameter_name data_type [ OUT | OUTPUT ][ ,...n ] } { , [ param1 ] value1 [ ,...n ] } ]注意官方限制The amount of data that can be passed by using this method is limited by the number of parameters allowed. SQL Server procedures can have, at most, 2100 parameters. Server-side logic is required to assemble these individual values into a table variable or a temporary table for processing. // SQL存储过程最多可使用2100个参数3豁然开朗SqlServer sp_executesql存储过程最多支持2100个批量操作形成的列值参数所以遇到很大数量的批量操作EFCore SqlProvider会帮我们将批量操作分块传输这也是我们在实际大批量使用时看到分块发送的原因。EFCore开放了【配置关系型数据库批量操作大小】protected override void OnConfiguring(DbContextOptionsBuilder optionbuilder){ string sConnString Serverlocalhost;DatabaseEFSampleDB;Trusted_Connectiontrue;; optionbuilder.UseSqlServer(sConnString , b b.MaxBatchSize(1)); // 批量操作的SQL语句数量也可设定为1禁用批量插入}总结① EFCore 相比EF6已经支持批量操作能有效提高应用程序的性能② EFCore的批量操作能力由对应的DataBaseProvider支撑Provider实现过程跟背后的存储载体密切相关关注SQL存储过程sp_executesql官方明文显示批量操作的列值参数最多2100个这个关键因素决定了在大批量操作的时候 依旧会被分块传输。③ 另外一个批量操作的方法这里也点一下构造Rawsql 【EFCore也支持Rawsql】 sqlite不支持存储过程为批量插入提高性能可采用此方案var insertStr new StringBuilder();insertStr.AppendLine(insert into ProfileUsageCounters (profileid,datetime,quota,usage,natureusage) values);var txt insertStr.AppendLine(string.Join(,, usgaeEntities.ToList().Select(x { return $({x.ProfileId},{x.DateTime},{x.Quota},{x.Usage},{x.NatureUsage});}).ToArray()));await _context.Database.ExecuteSqlCommandAsync(txt.ToString()); https://github.com/aspnet/EntityFrameworkCore/issues/6604 https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/table-valued-parameters?redirectedfromMSDN