我有一个关于2场景的性能问题,哪个会更快。Sql Server计算功能和内存列表之间的性能
选项#1
难道是更快地抢在内存中,使用C#所有的旅行报告列表中删除我不想要的,例如:
var travelReports = db.TravelReports.Include("ApprovalStatuses")
.Where(s => s.IsDeleted == false).ToList();
travelReports.RemoveAll(s => s.Status == TravelReportStatus.Draft);
travelReports.RemoveAll(s => s.Status == TravelReportStatus.NeedsInformation);
在这种情况下,状态将在模型上进行计算,使用NotMapped属性和getter,使用审批状态,如:
if (ApprovalStatuses.Count == 0)
{
return TravelReportStatus.Draft;
}
else if (JobRoles.All(j => ApprovalStatuses.Any(a => a.Role == j && a.Status == ApprovalStatus.Approved)))
{
return TravelReportStatus.Processed;
}
else if (ApprovalStatuses.Any(s => s.Status == ApprovalStatus.Denied))
{
return TravelReportStatus.Denied;
}
else
{
return TravelReportStatus.PendingApproval;
}
选项#2 将一个函数我在S模式QL并呼叫列状态:
CREATE FUNCTION dbo.GetTravelReportStatus(@travelReportId int)
RETURNS int
AS
-- Returns a Enum Int Value of the Status --
BEGIN
DECLARE @value int;
DECLARE @count int;
DECLARE @isReject int = 0;
SELECT @isReject = Count(*) FROM dbo.Approvals WHERE TravelReportId = @travelReportId and Status = 3;
SELECT @count = Count(*) FROM dbo.Approvals WHERE TravelReportId = @travelReportId;
SELECT @value =
CASE
WHEN @isReject > 0 THEN 3
WHEN @isReject = 0 and @count = 0 THEN 1
WHEN @isReject = 0 and @count > 0 and @count < 6 THEN 2
WHEN @isReject = 0 and @count >= 6 THEN 4
END;
return @value;
END;
Sql("ALTER TABLE dbo.TravelReports ADD Status AS dbo.GetTravelReportStatus(Id)");
然后使用SQL和实体框架来仅获取具有我想要的状态的旅行报告。
var travelReports = db.TravelReports.Include("ApprovalStatuses")
.Where(s => s.Status == TravelReportStatus.PendingApproval || s.Status == TravelReportStatus.Processed || s.Status == TravelReportStatus.Denied)
.Where(s => s.IsDeleted == false).ToList();
旅行报告将持续增长,但大约4年后,它们将被移动到归档存储并不再存在于数据库中。
我的问题是将选项1或选项2提供给我最好的性能?每次我要求旅行报告时,选项2是否会打2个查询的数据库?因此,如果我返回一个用户25个旅行报告,我将打到数据库25^2次来计算状态,在codefirst EF中有没有办法阻止它?
”在内存中抓取所有旅行报告列表并使用C#删除那些我不想要的列表会更快吗?“除非你的桌子非常小。 –
我编辑了你的标题。请参阅:“[应该在其标题中包含”标签“](http://meta.stackexchange.com/questions/19190/)”,其中的共识是“不,他们不应该”。 –
对不起,我会在将来看到:) –