이 질문에 실행하는 데 시간이 전혀 들지 않지만 마지막 줄의 주석 처리를 제거하는 데 5 초가 걸립니다. 어떻게 이것이 쿼리에 많은 영향을 미칠 수 있습니까? 거의 동일한 쿼리입니다.프리디 케이트 빌더를 사용하는 느린 쿼리의 문제점
return db.Parties.Where(predicate).Select(p => new SearchResult
{
adressPerson = p.Contacts.SingleOrDefault(m => m.contact_type == "H").streetname,
//adressOrg = p.Contacts.SingleOrDefault(m => m.contact_type == "W").streetname
});
어떻게 문제를 찾을 수 있습니까? 나는 그것이 많은 코드를 게시 바보 그러나 여기 어쨌든 SQL 쿼리 알고
predicate = predicate.Or(p => p.surname.EndsWith(keyword));
predicate = predicate.Or(p => p.lastname.EndsWith(keyword));
predicate = predicate.Or(p => p.organisation.EndsWith(keyword));
predicate = predicate.Or(p => p.Contacts.Any(c => c.streetname.EndsWith(keyword)));
predicate = predicate.Or(p => p.Memberships.Any(m => m.Congregation.congregation_name.EndsWith(keyword)));
predicate = predicate.Or(p => p.PartyCategories.Any(m => m.Category.category_name.EndsWith(keyword) || m.Category.category_code.EndsWith(keyword)));
:
는 다음과 같은 술어가 모습입니다. 모든 단서?
SELECT (
SELECT [t6].[streetname]
FROM [dbo].[Contact] AS [t6]
WHERE ([t6].[contact_type] = @p7) AND ([t6].[party_id] = [t0].[party_id])
) AS [adressPerson], (
//SELECT [t7].[streetname]
//FROM [dbo].[Contact] AS [t7]
//WHERE ([t7].[contact_type] = @p8) AND ([t7].[party_id] = [t0].[party_id])
//) AS [adressOrg]
FROM [dbo].[Party] AS [t0]
WHERE ([t0].[surname] LIKE @p0) OR ([t0].[lastname] LIKE @p1) OR ([t0].[organisation] LIKE @p2) OR (EXISTS(
SELECT NULL AS [EMPTY]
FROM [dbo].[Contact] AS [t1]
WHERE ([t1].[streetname] LIKE @p3) AND ([t1].[party_id] = [t0].[party_id])
)) OR (EXISTS(
SELECT NULL AS [EMPTY]
FROM [dbo].[Membership] AS [t2]
LEFT OUTER JOIN [dbo].[Congregation] AS [t3] ON [t3].[congregation_id] = [t2].[congregation_id]
WHERE ([t3].[congregation_name] LIKE @p4) AND ([t2].[party_id] = [t0].[party_id])
)) OR (EXISTS(
SELECT NULL AS [EMPTY]
FROM [dbo].[PartyCategories] AS [t4]
INNER JOIN [dbo].[Category] AS [t5] ON [t5].[category_id] = [t4].[category_id]
WHERE (([t5].[category_name] LIKE @p5) OR ([t5].[category_code] LIKE @p6)) AND ([t4].[party_id] = [t0].[party_id])
))
는 은 INNER 작동하지 않았다 마지막 선택 성명에서 가입 밝혀졌다 해결했다.
predicate = predicate.Or(p => p.PartyCategories
.GroupJoin(db.Categories, b => b.category_id, c => c.category_id, (b, c) => new { b, c })
.SelectMany(c => c.c.DefaultIfEmpty(), (c, b) => new { c.c, b })
.Any(m => m.b.category_name.EndsWith(keyword) || m.b.category_code.EndsWith(keyword)));
나는이 방법으로 문제이었다고 생각한다. 술어를 다시 작성하면 SQL이 INNER JOIN 대신 LEFT OUTER JOIN이됩니다. – Niklas
@Niklas : 맞습니다. 그리고 두 가지 경우에서 SQL 프로파일 러가 한 것을 보았습니까? –
프로파일 러가없는 sqlexpress를 사용합니다 ... 제 생각 에는요? – Niklas