성능을 관리하십시오.
적어도 EF Core 에서는 여기에 주어진 다른 답변이 다른 성능을 초래할 수 있다는 것을 경험했습니다 . OP가 Linq to SQL에 대해 물었다는 것을 알고 있지만 EF Core에서도 동일한 질문이 발생하는 것으로 보입니다.
내가 처리해야 할 특정 사례에서 Marc Gravell의 (구문 적으로 더 좋은) 제안은 Mike U가 묘사 한 것과 유사하게 크로스 적용 내부에서 왼쪽 조인을 초래 하여이 특정 쿼리의 추정 비용이 2라는 결과를 얻었습니다. 교차 조인이없는 쿼리에 비해 시간이 많이 걸립니다 . 서버 실행 시간 은 3 배로 다릅니다 . [1]
Marc Gravell의 솔루션으로 교차 조인이없는 쿼리가 발생했습니다.
컨텍스트 : 기본적으로 두 테이블에서 두 개의 왼쪽 조인을 수행해야했는데 각각의 테이블에는 다시 다른 테이블에 대한 조인이 필요했습니다. 또한 왼쪽 조인을 적용 해야하는 테이블에 다른 위치 조건을 지정해야했습니다. 또한 기본 테이블에 두 개의 내부 조인이있었습니다.
예상 운영자 비용 :
- 크로스 적용 : 0.2534
- 십자가없이 적용 : 0.0991.
서버 실행 시간 (ms) (쿼리가 10 번 실행되었으며 SET STATISTICS TIME ON을 사용하여 측정 된 쿼리) :
- 크로스 적용 : 5, 6, 6, 6, 6, 6, 6, 6, 6, 6
- 크로스 적용없이 : 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
(처음 실행은 두 쿼리 모두에 대해 느려졌습니다. 캐시 된 것으로 보입니다.)
테이블 크기 :
- 메인 테이블 : 87 행,
- 왼쪽 조인의 첫 번째 테이블 : 179 행;
- 왼쪽 조인의 두 번째 테이블 : 7 행
EF 코어 버전 : 2.2.1.
SQL Server 버전 : MS SQL Server 2017-14 ... (Windows 10).
모든 관련 테이블에는 기본 키에 대한 인덱스 만있었습니다.
내 결론 : 생성 된 SQL은 실제로 다를 수 있으므로 항상 보는 것이 좋습니다.
[1] 흥미롭게도 MS SQL Server Management Studio에서 '클라이언트 통계'를 설정할 때 반대 경향을 볼 수있었습니다. 즉, 교차 적용이없는 마지막 솔루션 실행에는 1 초 이상이 걸렸습니다. 내 설정에 문제가 있다고 생각합니다.