天天看點

【測試記錄】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) 402884=402.88
查詢15條資料(1) 3萬 2766=2.76
查詢15條資料(2) 2976=2.96
查詢15條資料(3) 3250=3.25
查詢15條資料(4) 3083=3.08
查詢15條資料(5) 2966=2.69
查詢15條資料(6) 3015=3.01

修改其中一條資料改為2018-05-20後重新查詢,為了防止時間都是一樣的驗證查詢的準确性,在查詢列印結果中我在第一條資料看到時間修改為2018-02-20的資料說明查詢的準确,

然後時間也在上面查詢時間範圍内,所有時間沒有誤差

2971=2.97
2652=2.65
再次修改其中一條childId設定為重複,驗證多次查詢問題的準确性
2819=2.81
3370=3.37

5萬條測試,在3萬基礎上在錄入2萬條

1萬2018-05-22 0狀态

1萬2018-05-23 1狀态

插入2萬(2) 193700=193.7
5萬 3149=3.14
3526=3.52
2922-2.92
3688=3.68
3339=3.33
3024=3.02
查詢15條資料(7) 2921=2.91
查詢15條資料(9) 3156=3.15
查詢15條資料(10) 3304=3.3
查詢15條資料(11) 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,

作者:

YanBigFeg

——

顔秉鋒

出處:

http://www.cnblogs.com/yanbigfeg

本文版權歸作者和部落格園共有,歡迎轉載,轉載請标明出處。如果您覺得本篇博文對您有所收獲,覺得小弟還算用心,請點選右下角的 [推薦],謝謝!

繼續閱讀