zoukankan      html  css  js  c++  java
  • EF的性能优化插件Z.EntityFramework.Extensions

    转自https://www.cnblogs.com/yaopengfei/p/7751545.html

    一. 综述

      该模块主要介绍:EF的性能优化插件Z.EntityFramework.Extensions,该插件收费

    (一). 简介

    1. 相关网站:http://www.zzzprojects.com/

    2. 下载途径:通过Nuget直接下载或者去官网下载(要注意更新最新版本,可能会过期)

    3. 该程序集包括三个核心模块:Bulk SaveChanges、Bulk Operations、Batch Operations

    (二).Bulk SaveChanges 大批量保存

    1. 核心方法:BulkSaveChanges

    2. 该方法是在EF原有方法SaveChanges方法上的一个提升。

    3. 使用方法:增删改操作均使用EF自有的方式,最后事务性提交数据库,BulkSaveChanges代替SaveChanges

    4. 工作原理:与SaveChanges类似,但是减少了与数据库的往返次数,从而提高了性能

    5. 性能测试:以增加数据为例进行测试:

    1000条    5000条    10000条

    1.606s    6.542s      21.857s

    6. 可配置参数 (改变这两个参数对性能影响不大)

    ①.BatchSize 批量提交块的大小

    ②.AllowConcurrency 是否允许并发检查

    (三). Bulk Operations

    1. 核心方法:BulkInsert(增加)、BulkDelete(删除)、BulkUpdate(修改)、BulkMerge(合并)、BulkSynchronize(同步)

    其中:BulkMerge(合并)、BulkSynchronize(同步)不常用,这里不单独测试了。 (根据传入的类型可以直接找到对应的表进行操作)

    2. 工作原理:尽可能的减少与数据库的往返次数,

    3. 性能测试:BulkInsert性能进行测试:

      1000条    5000条    10000条    40000条

      1.432s    1.568s      1.554s    1.899s

    4. 性能测试:BulkDelete性能进行测试:

      1000条    5000条    10000条    40000条

      1.430s    1.542s       1.540s      2.597s

    5. 可配置参数 (改变这两个参数对性能影响不大)

    ①.BatchSize 批量提交块的大小

    ②.AllowConcurrency 是否允许并发检查

    (四). Batch Operations (批量进行统一操作)

    1. 核心方法:DeleteFromQuery、UpdateFromQuery

    2. 使用方法:

    ①. context.Customers.Where(x => x.ID == userId).DeleteFromQuery();

    ②. context.Customers.Where(x => x.ID == userId).UpdateFromQuery(x => new Customer {Actif = false});

    3. 性能测试: DeleteFromQuery的性能测试

      1000条    5000条    10000条    40000条

      0.1s      0.127s   0.156s         0.490s

    4. 性能测试: UpdateFromQuery的性能测试

      1000条    5000条    10000条    40000条

      0.120s    0.131s       0.172s      0.437s

    二. 代码实战

    1. 1.以增加数据为例,进行测试BulkSaveChanges(测试数据条数:1000,5000,10000)

    复制代码
     1  private static void NewMethod1(DbContext db, int count)
     2         {
     3             Console.WriteLine("-------------1. 提供BulkSaveChanges方法来替代EF本身的Savechanges------------------");
     4             Stopwatch watch = Stopwatch.StartNew();
     5             for (int i = 0; i < count; i++)
     6             {
     7                 TestTwo t = new TestTwo();
     8                 t.id = Guid.NewGuid().ToString("N");
     9                 t.t21 = "t1+" + i;
    10                 t.t22 = "t2+" + i;
    11                 db.Set<TestTwo>().Add(t);
    12             }
    13 
    14             db.BulkSaveChanges();
    15 
    16             //db.BulkSaveChanges(options =>
    17             //{
    18             //    options.BatchSize = 1000;
    19             //    options.AllowConcurrency = false;
    20             //});
    21             watch.Stop();
    22             Console.WriteLine("{0}条数据耗时:{1}", count, watch.ElapsedMilliseconds);
    23         }
    复制代码

    2. 以增加为例,测试BulkInsert方法(测试数据条数:1000,5000,1w,4w)

    复制代码
     1   private static void NewMethod2(DbContext db, int count)
     2         {
     3             Console.WriteLine("-------------1. 以增加为例,测试BulkInsert方法(测试数据条数:1000,5000,1w,4w)------------------");
     4             Stopwatch watch = Stopwatch.StartNew();
     5             List<TestTwo> list = new List<TestTwo>();
     6             for (int i = 0; i < count; i++)
     7             {
     8                 TestTwo t = new TestTwo();
     9                 t.id = Guid.NewGuid().ToString("N");
    10                 t.t21 = "t1+" + i;
    11                 t.t22 = "t2+" + i;
    12                 list.Add(t);
    13             }
    14 
    15             db.BulkInsert(list);
    16 
    17             //db.BulkInsert(list, p =>
    18             //{
    19             //    p.BatchSize = 100;
    20             //    p.AllowConcurrency = false;
    21             //});
    22             watch.Stop();
    23             Console.WriteLine("{0}条数据耗时:{1}", count, watch.ElapsedMilliseconds);
    24         }
    复制代码

    3. 以删除为例,测试BulkDelete方法(测试数据条数:1000,5000,1w,4w)

    复制代码
    1 private static void NewMethod3(DbContext db, int count)
    2         {
    3             Console.WriteLine("-------------2. 以删除为例,测试BulkDelete方法(测试数据条数:1000,5000,1w,4w)------------------");
    4             Stopwatch watch = Stopwatch.StartNew();
    5             List<TestTwo> list = db.Set<TestTwo>().Take(count).ToList();
    6             db.BulkDelete(list);
    7             watch.Stop();
    8             Console.WriteLine("{0}条数据耗时:{1}", count, watch.ElapsedMilliseconds);
    9         }
    复制代码

    4. DeleteFromQuery的性能测试(测试数据条数:1000,5000,1w,4w)

    复制代码
    1    private static void NewMethod4(DbContext db, int count)
    2         {
    3             Console.WriteLine("-------------1. DeleteFromQuery的性能测试(测试数据条数:1000,5000,1w,4w)------------------");
    4             Stopwatch watch = Stopwatch.StartNew();
    5             db.Set<TestTwo>().Where(u=>u.id!="fk").DeleteFromQuery();
    6 
    7             watch.Stop();
    8             Console.WriteLine("{0}条数据耗时:{1}", count, watch.ElapsedMilliseconds);
    9         }
    复制代码

    5. UpdateFromQuery的性能测试(测试数据条数:1000,5000,1w,4w)

    复制代码
     1 private static void NewMethod5(DbContext db, int count)
     2         {
     3             Console.WriteLine("-------------2. UpdateFromQuery的性能测试(测试数据条数:1000,5000,1w,4w)------------------");
     4             Stopwatch watch = Stopwatch.StartNew();
     5             db.Set<TestTwo>().Where(u => u.id != "fk").UpdateFromQuery(x => new TestTwo { 
     6                 t21="1",
     7                 t22="2"
     8             });
     9 
    10             watch.Stop();
    11             Console.WriteLine("{0}条数据耗时:{1}", count, watch.ElapsedMilliseconds);
    12         }
    复制代码
  • 相关阅读:
    谁主沉浮
    东野圭吾--嫌疑人X的献身读后感
    (三)Spring 依赖注入
    (二) Spring项目的搭建
    (一) Spring基础概述
    spring boot 运行jsp原理分析
    Java-01背包问题-动态规划-递归和非递归实现
    博客移至CSDN
    Navicat Premium 连接Oracle登入时候报ORA-12638: 身份证明检索失败的解决办法
    oracle 可以连接数据库,vs连不上. 报错提示:ORA-12154: TNS: 无法解析指定的连接标识符
  • 原文地址:https://www.cnblogs.com/KQNLL/p/10325725.html
Copyright © 2011-2022 走看看