zoukankan      html  css  js  c++  java
  • 【测试记录】EF插入查询性能

    介绍

        背景什么就不提了,无外乎出现了大数据需要处理。简单的说就是我测试了EF正常的插入以及一个优化小方式而已,然后做了查询记录。其余没有什么,写这篇只是为了记录结果方便以后数据参考吧。

    代码介绍:

    首先是插入代码常规:

     EFHelp<TimeRecord> eFHelp = new EFHelp<TimeRecord>();
                for (int i = 0; i < 20000; i++)
                {
                    TimeRecord t = new TimeRecord();
                    t.id = Guid.NewGuid().ToString("N");
                    t.childId = Guid.NewGuid().ToString("N");
                    t.state = 0;
                    t.stateTime = DateTime.Now.AddDays(1).ToString("yyyy-MM-dd");
    
                    eFHelp.AddNo(t);
                }
                for (int i = 0; i < 30000; i++)
                {
                    TimeRecord t = new TimeRecord();
                    t.id = Guid.NewGuid().ToString("N");
                    t.childId = Guid.NewGuid().ToString("N");
                    t.state = 1;
                    t.stateTime = DateTime.Now.AddDays(2).ToString("yyyy-MM-dd");
    
                    eFHelp.AddNo(t);
                }
                eFHelp.SaveChange();

    然后是优化处理方法:

        public testEntities()
                : base("name=testEntities")
            {
                this.Configuration.AutoDetectChangesEnabled = false;
            }

    没有错就是增加一句话,这句话主要是取消EF的状态变化跟踪。想要了解更多的请自行百度这个东西。

    推荐这骗写的很好:https://www.cnblogs.com/hehexiaoxia/p/5707180.html

    多说一句我们都知道在6.0之后增加AddRang方法,我也大概测试了一些与这个方法差不多,我想也许AddRang方法里面就是封装了这个东西吧。

    查询方法:

     //查询
                EFHelp<TimeRecord> eFHelp = new EFHelp<TimeRecord>();
                var dataG = eFHelp.Entities.GroupBy(b => b.childId);
                //var dataG = eFHelp.Entities.Where(b => b.state == 1).GroupBy(b => b.childId).Select(s => se(s.ToList()));
                List<TimeRecord> listResult = new List<TimeRecord>();
                foreach (var item in dataG)
                {
                    Func<List<TimeRecord>, TimeRecord> fun = delegate (List<TimeRecord> listData)
                    {
                        TimeRecord timeResult = listData.Where(t => Convert.ToDateTime(t.stateTime) <= Convert.ToDateTime("2018-05-23")).OrderByDescending(b => b.stateTime).FirstOrDefault();
                        if (timeResult == null)
                        {
                            return null;
                        }
                        else
                        {
                            if (timeResult.state == 1)
                            {
                                return timeResult;
                            }
                            else
                            {
                                return null;
                            }
                        }
                    };
                    //TimeRecord time = se(item.ToList());
                    TimeRecord time = fun(item.ToList());
                    if (time != null)
                    {
                        listResult.Add(time);
                    }
                }
                listResult = listResult.OrderBy(b => b.id).Skip(0).Take(15).ToList();
                foreach (var item in listResult)
                {
                    Console.WriteLine("查询的id:" + item.stateTime + "查询的时间:" + item.stateTime);
                }

    因为我做了筛选,做一下实际场景。所有不是只取而是做了条件查询。

    结果数据:

    插入3万条,

    1万2018-05-20 0状态

    2万2018-05-21 1状态

    测试数据(次)

    数据量

    时间(毫秒=秒)

    插入3万(1)

    0

    402884=402.88

    查询15条数据(1)

    3万

    2766=2.76

    查询15条数据(2)

    3万

    2976=2.96

    查询15条数据(3)

    3万

    3250=3.25

    查询15条数据(4)

    3万

    3083=3.08

    查询15条数据(5)

    3万

    2966=2.69

    查询15条数据(6)

    3万

    3015=3.01

    修改其中一条数据改为2018-05-20后重新查询,为了防止时间都是一样的验证查询的准确性,在查询打印结果中我在第一条数据看到时间修改为2018-02-20的数据说明查询的准确,

    然后时间也在上面查询时间范围内,所有时间没有误差

    查询15条数据(1)

    3万

    2971=2.97

    查询15条数据(2)

    3万

    2652=2.65

    再次修改其中一条childId设置为重复,验证多次查询问题的准确性

    查询15条数据(1)

    3万

    2819=2.81

    查询15条数据(2)

    3万

    3370=3.37

    5万条测试,在3万基础上在录入2万条

    1万2018-05-22 0状态

    1万2018-05-23 1状态

    测试数据(次)

    数据量

    时间(毫秒=秒)

    插入2万(2)

    3万

    193700=193.7

    查询15条数据(1)

    5万

    3149=3.14

    查询15条数据(2)

    5万

    3526=3.52

    查询15条数据(3)

    5万

    2922-2.92

    查询15条数据(4)

    5万

    3688=3.68

    查询15条数据(5)

    5万

    3339=3.33

    查询15条数据(6)

    5万

    3024=3.02

    查询15条数据(7)

    5万

    2921=2.91

    查询15条数据(9)

    5万

    3156=3.15

    查询15条数据(10)

    5万

    3304=3.3

    查询15条数据(11)

    5万

    3588=3.58

     以上表格数据主要是查询数据。其中第一个是常规的插入数据为了与下面的做对比。

    最后使用了无状态(AutoDetectChangesEnabled)添加3万所用时间13689=13秒。5万:21410=21秒,21667,

    AddRang批量添加3万:13962=13秒,14034=14秒,5万21366=21秒

    最后我用10万数据查询:3448,3482,3379,3288

    然后是22万:7093,6074,5405,5976,5421,5442,5967

    27万数据:9200,6384,6987,6575,6305,

  • 相关阅读:
    leetcode——202.快乐数
    leetcode——136. 只出现一次的数字
    leetcode——74.搜索二维矩阵
    leetcode——240.搜索二维矩阵
    leetcode——414.第三大的数
    020 迭代器模式
    019 模板模式
    018 中介者模式
    017 命令模式
    016 责任链模式
  • 原文地址:https://www.cnblogs.com/yanbigfeg/p/9073084.html
Copyright © 2011-2022 走看看