Microsoft.Data.SqlClient(및 EF Core)를 사용하면 대용량 비동기 읽기 속도가 180% 향상됨 - 이 기능을 키는 방법!


#성능 최적화 #.NET #SqlClient #데이터베이스 #비동기 처리

핵심 요약

Microsoft.Data.SqlClient 7.0 Preview 2 버전에서 대용량 바이너리 및 텍스트 데이터를 비동기로 읽을 때 성능이 최대 180% 향상되는 새로운 기능이 추가되었습니다. 5년 이상의 커뮤니티 협력을 통해 개발된 이 기능은 이전 버전 대비 1.7초에서 0.06초로 단축시키는 극적인 성능 개선을 제공합니다. 두 개의 AppContext 스위치만 활성화하면 즉시 적용 가능한 실용적인 솔루션입니다.


상세 요약

문제 배경

비동기 대용량 데이터 읽기의 성능 저하

  • Microsoft.Data.SqlClient(SQL Server 및 Azure SQL용 ADO.NET 공급자)의 가장 높은 투표를 받은 이슈가 비동기 대용량 데이터 읽기 성능 저하
  • 바이너리 및 텍스트 데이터를 비동기로 읽을 때 극도로 느린 속도 문제 지속

오랜 개발 과정

  • 커뮤니티 기여자 Wraith2가 5년 이상 전에 작업 시작
  • 버전 6.1.0에서 실패한 시도 후 커뮤니티의 적극적 협력으로 버그 수정
  • Microsoft.Data.SqlClient 7.0 Preview 2에서 최종 적용

성능 개선 수치

놀라운 성능 향상

  • 최신 기능 활성화 시 90% 이상의 성능 향상 관측
  • 구형 드라이버 버전 사용자는 최대 180% 성능 증가 가능
  • 비교 대상: EF Core 9가 현재 사용 중인 버전(5.1.6)

벤치마크 결과

항목 평균(ms) 오류(ms) 표준편차(ms) Gen0 Gen1 Gen2 할당 메모리
비동기 1,713.09 33.639 29.820 2000 1000 1000 30.67 MB
동기 33.72 0.539 0.530 875 875 875 20 MB

결과: 1.7초에서 0.06초로 단축 - 약 28배 성능 개선

적용 방법

1단계: 최신 드라이버 버전 업데이트

프로젝트 파일(.csproj)에 다음과 같이 NuGet 패키지 참조 추가 또는 업데이트:

<PackageReference Include="Microsoft.Data.SqlClient" Version="7.0.0-preview2.25289.6" />

2단계: AppContext 스위치 활성화

애플리케이션 시작 시점(예: Program.cs의 초기 라인)에서 다음 두 개의 스위치 설정:

AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.UseCompatibilityAsyncBehaviour", false);
AppContext.SetSwitch("Switch.Microsoft.Data.SqlClient.UseCompatibilityProcessSni", false);

이 두 스위치를 비활성화함으로써 새로운 성능 최적화 기능 활성화

주의사항 및 팁

중요 참고 사항

  • Preview 2 버전이므로 프로덕션 환경에 적용 전 철저한 테스트 필수
  • 두 스위치 모두 false로 설정해야 새로운 기능 활성화
  • 호환성 문제 발생 시 GitHub 이슈 생성 후 커뮤니티 지원 요청 가능

적용 체크리스트

  • 패키지 버전 정확히 확인 (7.0.0-preview2.25289.6)
  • Program.cs 상단에 두 개의 AppContext.SetSwitch() 호출 추가
  • 애플리케이션 재구성 및 테스트
  • 문제 발생 시 Microsoft.Data.SqlClient GitHub 저장소에서 이슈 보고
2개의 좋아요