SQL Server 쿼리 실행 시간에 큰 문제가 있습니다. 오랜 시간 동안 성공적으로 디버깅했습니다.LINQ to 엔티티 천천히 쿼리
기본적으로 '주문'통계는 주문별로 그룹화되어 사용자에게 표시되는 보고서를 생성합니다. 문제는 대부분 쿼리 실행이 비교적 빠르지 만 때로는 서버가 급속히 중단되어 시간 초과가 발생한다는 것입니다.
나는 가끔씩 잘못된 쿼리 성능이 SQL Server에서 매개 변수 스니핑 (sniffing)으로 인해 발생하는 것으로 보입니다. 내 관계에는 많은 양의 관련 행이 있습니다. 어떤 관계는 하나의 부모 행에 대해 10,000 개의 행을 가질 수 있지만 다음 행은 관련 행을 하나만 가질 수 있습니다. 나는 이것이 쿼리 최적화 프로그램이 어떤 경우 인덱스를 완전히 무시하고 실제로 성능이 떨어지는 것으로 생각합니다.
기본적으로이 문제에 대한 해결책을 제시하는 방법을 모릅니다. 나는 어느정도 아래에 내 쿼리를 최적화하거나 쿼리 최적화 프로그램이 매번 인덱스를 사용하도록하는 몇 가지 방법을 찾아야합니다. 저장 프로 시저는이 프로젝트에서 옵션이 아닙니다. 불행히도.
내가 시도한 것은 '주문'에 대한 독립적 인 요청을 작성하는 것이지만 시스템에서 1000 개가 넘는 주문으로 인해 막대한 속도 저하가 발생하며 실제로 옵션이 아닙니다. 합리적인 실행 시간 내에서 실행되도록 가장 가까운 것은 아래의 쿼리로 차례로 매개 변수 스니핑 문제를 겪고있는 것으로 보입니다.
result = (from ord in db.Orders
join comm in db.Comments.Where(i =>
i.UserId == userId &&
i.Created >= startDate &&
i.Created < endDate &&
i.UserGroupId == channelId &&
i.Campaign.CampaignCountryId == countryId &&
(i.CommentStatus.Name == CommentStatus.Approved || i.CommentStatus.Name == CommentStatus.Pending))
on ord.OrderId equals comm.OrderId into Comments
join motif in db.Motifs.Where(i =>
i.UserId == userId &&
i.Created > startDate &&
i.Created < endDate &&
i.UserGroupId == channelId && i.Campaign.CampaignCountryId == countryId)
on ord.OrderId equals motif.OrderId into Motifs
where ord.EndDate > startDate
select new ReportRow()
{
OrderName = ord.Name,
OrderId = ord.OrderId,
ChannelId = channelId,
Comments = Comments.Count(c => c.CommentStatus.Name == CommentStatus.Approved),
PendingComments = Comments.Count(c => c.CommentStatu.Name == CommentStatus.Pending),
Motifs = Motifs.Count(),
UniqueMotifs = Motifs.GroupBy(c => c.Uin).Count(),
ApprovedValue = ((decimal?)Motifs.GroupBy(c => c.Uin).Select(c => c.FirstOrDefault()).Sum(c => c.Value) ?? 0) + ((decimal?)Comments.Where(c => c.Commentstatu.Name == Commentstatus.Approved).Sum(c => c.Value) ?? 0),
PendingValue = ((decimal?)Comments.Where(c => c.Commentstatu.Name == Commentstatus.Pending).Sum(c => c.Value) ?? 0)
}).ToList();
return result;
어떤 도움도 내보고 실행하는 방법에 대한 아이디어는 합리적으로 빠른 모든 시간은 크게 감상 할 수있다 - 아무리 쿼리는 일반적으로 SQL에보고 자체 또는 일부 멋진 아이디어를 최적화 있다면.
차이점이 있으면 Azure SQL을 사용하고 있습니다.
SSMS의 위의 LINQ에서 생성 된 쿼리를 실행할 때 모든 단일 실행에서 좋은 쿼리 실행 시간을 얻을 수 있으므로 DB 디자인이 문제가되지 않아야하지만 가장 효율적이지는 않습니다. 솔루션 어쨌든.
어쩌면 귀하의 답변에 대한 답변이 아닙니다. 보고서에 대한보기를 만든 다음보기를 쿼리하여 결과를 얻을 수 있습니다. 이렇게하면 쿼리가 매번 SQL에서 제대로 작동하는지 확인할 수 있습니다. –
안녕하세요, 귀하의 의견을 보내 주셔서 감사합니다! 실제로보기를 만들려고하지 않았습니다. 그들과 함께 시작할 수있는 올바른 방향을 가르쳐 주시겠습니까? – veturi
답변을 게시했습니다. 세부 정보를 요청할 수 있습니다. –