요약
Entity Framework의 ToListAsync 성능 문제가 Microsoft.Data.SqlClient 6.1.0에서 크게 개선되었다는 소식을 다룬 기술 업데이트입니다.
문제 상황
이전에 Entity Framework에서 대용량 NVARCHAR(MAX) 문자열을 await ToListAsync()
로 가져올 때 성능 문제가 있었습니다. 실제로는 Entity Framework가 아닌 기본 Microsoft.Data.SqlClient 패키지에서 SqlDataReader를 올바르게 사용하지 않아 많은 메모리 할당과 느린 쿼리가 발생했습니다.
성능 비교 (개선 전) Wraith2의 벤치마크 결과:
- 비동기 (UseContinue: False): 757.51ms, 101.49MB 할당
- 동기 (UseContinue: False): 39.40ms, 80.14MB 할당
비동기 방식이 동기 방식보다 약 19배 느리고 더 많은 메모리를 사용했습니다.
Microsoft.Data.SqlClient 6.1.0의 개선사항 Wraith2가 5년에 걸쳐 일련의 풀 리퀘스트를 통해 이 문제를 해결했습니다. 주요 개선사항은 "패킷 멀티플렉싱 지원을 추가하여 대용량 데이터 읽기 성능 향상"입니다.
성능 비교 (개선 후)
- 비동기 (UseContinue: True): 49.45ms, 101.51MB 할당
- 동기 (UseContinue: True): 40.09ms, 80.14MB 할당
개선 결과 분석
- 비동기 방식의 실행 시간이 757.51ms에서 49.45ms로 약 93% 개선
- 동기와 비동기 방식 간의 성능 격차가 크게 줄어들었음
- 메모리 할당에서는 여전히 20% 격차가 있지만 상당한 개선을 이룸
적용 방법
- Entity Framework를 사용하는 경우에도 직접 종속성이 전이 종속성을 재정의하므로 패키지를 테스트할 수 있습니다
- 또는 새로운 Microsoft.Data.SqlClient 버전이 포함된 다음 EF 릴리스를 기다릴 수 있습니다
영향 범위 이 문제는 주로 Microsoft.Data.SqlClient 패키지를 사용하는 SqlServer 패키지/구현에 영향을 미쳤습니다. 영향을 받는지 확인하려면 종속성 그래프에서 해당 패키지를 확인해야 합니다.
전망 Microsoft.Data.SqlClient의 최종 안정 버전인 6.1이 곧 출시될 예정이며, 이는 Entity Framework의 대용량 데이터 처리 성능을 크게 향상시킬 것으로 기대됩니다.