#성능 최적화 #.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 저장소에서 이슈 보고