我有一個包含超過 20 萬條記錄的資料庫表和一個包含日期 ( NOT NULL) 的列。我正在努力做一個GroupBy日期,因為資料庫很大,查詢需要很長時間來處理(比如 1 分鐘左右)。
我的理論:
- 從該表中獲取所有記錄的串列
- 從該串列中找到結束日期和開始日期(基本上是最舊的日期和最新的日期)
- 然后說像 20 個日期來做
GroupBy這樣的查詢將在較短的記錄集中完成..
這是我必須獲取串列的模型:
registration.Select(c => new RegistrationViewModel()
{
DateReference = c.DateReference,
MinuteWorked = c.MinuteWorked,
});
- 這
DateReference是我必須使用的資料庫列...
我不太確定如何在不花太長時間的情況下回圈瀏覽我的串列以獲取日期的開始和結束。
關于如何做到這一點的任何想法?
編輯:
var registrationList = await context.Registration
.Where(c => c.Status == StatusRegistration.Active) // getting all active registrations
.ToRegistrationViewModel() // this is simply a select method
.OrderBy(d => d.DateReference.Date) // this takes long
.ToListAsync();
分組:
var grpList = registrationList.GroupBy(x => x.DateReference.Date).ToList();
var tempList = new List<List<RegistrationViewModel>>();
foreach (var item in grpList)
{
var selList = item.Select(c => new RegistrationViewModel()
{
RegistrationId = c.RegistrationId,
DateReference = c.DateReference,
MinuteWorked = c.MinuteWorked,
}).ToList();
tempList.Add(selList);
}
這是我的 SQL 表:

這是ToRegistrationViewModel()功能:
return registration.Select(c => new RegistrationViewModel()
{
RegistrationId = c.RegistrationId,
PeopleId = c.PeopleId,
DateReference = c.DateReference,
DateChange = c.DateChange,
UserRef = c.UserRef,
CommissionId = c.CommissionId,
ActivityId = c.ActivityId,
MinuteWorked = c.MinuteWorked,
Activity = new ActivityViewModel()
{
Code = c.Activity.Code,
Description = c.Activity.Description,
},
Commission = new CommissionViewModel()
{
Code = c.Commission.Code,
Description = c.Commission.Description
},
People = new PeopleViewModel()
{
UserId = c.People.UserId,
Code = c.People.Code,
Name = c.People.Name,
Surname = c.People.Surname,
Active = c.People.Active
}
});
uj5u.com熱心網友回復:
這里有多個潛在問題
缺乏索引
您的查詢使用 Status 和 DateReference,而且看起來都沒有索引。如果只有幾個活動狀態,則該列上的索引可能就足夠了,否則您需要日期上的索引來加速排序。您還可以考慮包含兩列的復合索引。適當的索引應該可以解決排序問題。
實作查詢
ToListAsync會觸發sql查詢的執行,使得后續的每一個操作都在客戶端運行。我也會高度懷疑ToRegistrationViewModel,我會嘗試將其更改為匿名型別,并且僅在查詢實作后才轉換為實際型別。在客戶端上運行諸如排序和分組之類的東西通常被認為是一個壞主意,但您需要考慮實際瓶頸在哪里,如果資料傳輸花費大部分時間,優化分組將無濟于事。
傳輸資料
無論如何,獲取大量行都會很慢。目標通常是在資料庫中進行盡可能多的過濾,這樣您就不需要獲取這么多行。如果您必須獲取大量記錄,您可能會使用Pagination,即將 OrderBy 與 Skip 和 Take 結合起來以獲取較小的資料塊。這不會總體上節省時間,但可以允許諸如進度和連續顯示資料之類的事情。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/510625.html
標籤:C#sql实体框架林克
上一篇:不包括周末的列值的LINQ總和
