我是Linq查询的初学者,我想知道我的查询是否可以通过另一种方式改进:
long vehid = json.VehicleId.Value;
DateTime date = DateTime.Parse(json.date.Value);
var Alerts = (from t2 in entities.Alerts.AsNoTracking()
where
t2.GeneratedTimeLocal.Year == date.Year
&& t2.GeneratedTimeLocal.Month == date.Month
&& t2.GeneratedTimeLocal.Day == date.Day
&& (t2.AlertType == 2 || t2.AlertType == 3)
&& t2.vId == vid
select new
{
GeneratedTimeLocal = t2.GeneratedTimeLocal,
OptionalText = t2.OptionalText
});
return Alerts;
问题在于,Alerts数据表中包含大量数据,这些数据日益增加,现在它的速度很慢。
Alerts datatable中的GeneratedTimeLocal
字段是datetimeoffset(7)类型。
有没有办法改进这个查询?
答案 0 :(得分:3)
定义日期范围以改进查询。然后检查查询执行计划,并根据该计划确定是否需要新索引或更改现有索引。
long vehid = json.VehicleId.Value;
DateTime dateFrom = DateTime.Parse(json.date.Value).Date; // date with no time
DateTime dateTo = dateFrom.AddDays(1); // add one day to create the date range
var Alerts = (from t2 in entities.Alerts.AsNoTracking()
where
t2.GeneratedTimeLocal >= dateFrom
&& t2.GeneratedTimeLocal <= dateTo
&& (t2.AlertType == 2 || t2.AlertType == 3)
&& t2.vId == vid
select new
{
GeneratedTimeLocal = t2.GeneratedTimeLocal,
OptionalText = t2.OptionalText
});
return Alerts;
另一方面,请记住,在执行ToList()之前,此查询不会被执行。
试试这个索引:
CREATE INDEX IX_Alert_GeneratedTimeLocal_vId_AlertType_with_include ON Alert(GeneratedTimeLocal,vId,AlertType)INCLUDE(OptionalText)
我假设您正在使用SQL Server。如果表格很大,您也可以尝试过滤索引。查看此链接:https://docs.microsoft.com/en-us/sql/relational-databases/indexes/create-filtered-indexes