두 시나리오의 성능에 대한 질문이 있으며 더 빠를 것입니다.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 재산 및 게터를 사용하여 모델에 계산 될 것 같은 :
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 Travel Reports를 반환하면 상태를 계산하기 위해 데이터베이스를^2 번 방문 할 것입니다. CodeFirst EF에서이를 중지시키는 방법이 있습니까?
"모든 여행 보고서 목록을 메모리에 저장하고 C#을 사용하여 내가 원하지 않는 목록을 빨리 삭제할 수 있습니까?" 당신의 테이블이 아주 작지 않은 한. –
제목을 편집했습니다. "[제목에"태그 "가 포함되어 있어야합니까?] (http://meta.stackexchange.com/questions/19190/)"합의가 "아니오, 그렇지 않아야합니다"로 표시되어야합니다. –
제목에 대해 미안 해요, 나는 그것을 미래에 볼 것입니다 :) –