.net core 에서 ef core 와 ado.net 성능 문의

안녕하세요.

80만건 정도를 배치 처리를 하고 있는데요.
원래 예전부터 ef 는 잘 사용을 하지 않았습니다.
하지만, 이제는 써볼려고 써봤는데요… 머가 문제 일까요 ㅠ.ㅠ 성능 차이가 너무 나네요.
머가 문제인지 모르겠네요. 로직 자체는 아주 심플 합니다. (ef 가 open close 를 빈번한게 문제일까요 )
ef 의 자동화된 쿼리를 로그로 남겨서 봐도…query 자체는 문제는 없어 보이는데요. ( 인덱스 문제는 아닌듯)

일단 raw 쿼리를 이용하여 아래 처럼 할경우 대략 4시간 정도
디비.open
루프 돌면서 80만건에 대해서 인서트-업데이트
디비.close

**ef core 를 이용 (repository 를 만들어서 종속성을 주입하고) 대략 12시간 지나도 반도 안 끝남 ㅠ.ㅠ **
80만건 루프 돌면서 각 건별로 인서트-업데이트 savechange

3개의 좋아요

음…저도 자세하게는 알지 못하나, ef core 자체는 ef시절부터 성능 이슈가 있었던 것으로 알고 있습니다. 게다가 linq자체도 성능이슈가 있습니다. orm을 좋아하시는 분들중에서 ef core를 좋아하시지 않는 분들은 거진 위와 같은 성능이슈때문에 안쓰시고 보통 dapper같은 성능중심 orm을 사용하시는 거로 압니다. 구글에 ef 성능에 관해 검색하시면 많은 글을 보실 수 있습니다.

체크하시는 데이터 80만 건에 대하여 인서트와 업데이트가 섞여있다면 업데이트 위주로 하시고 인서트는 sqlbulkcopy 같은 벌크인서트 클래스를 통해 인서트하시면 속도가 좀 개선되지 않을까 합니다.

또한 커넥션을 여닫는 것도 오버헤드에 속하니 말씀하신거처럼 커넥션을 열어두고 배치작업을 하시는게 좋을 듯하며, 디비에서 인덱스도 고려해보시면 좋을 듯 합니다.

2개의 좋아요

아래 링크를 참고해보세요. 일반적으로 대량 삽입은 다른 방식을 사용합니다.

4개의 좋아요

MSDN에 확장에 관해서 언급한 아티클도 있었군요 ㅎㅎ 요즘은 CosmosDB하느라 EF를 주로 안쓰지만 나중에 다시 EF Core 할 때 알아봐야겠습니다. 이것도 유료이려나…ㅎㅎ

2개의 좋아요

그냥 대량 배치성은 dapper raw query 를 써야 겠어요 ㅠㅠ

NoTracking 적용을 해보니, 체감상 살짝 빨라진거 같기는 한데요.
전체적인 구조상 ef core performance 적용하기에는 리스크가 있네요

2개의 좋아요

아! 이러면 안되는데… ef core 로 성능을 마춰봐야겟어요.
급할것도 없는데. ef 로 해봐야죠

배치 프로세스의 종속성 부분에서 아래처럼 NoTracking 이 가능하네요.

options => options.UseMySql(mySqlConnectionStr, serverVersion).UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking)

2개의 좋아요

화이팅입니다!! 적용기 후기 알려주세요 ㅎㅎ

1개의 좋아요

안녕하세요.

EF Core 3.1이시면, savechange 호출 이후에
legacy.Entry({건별}).State = EntityState.Detached;
를 적용해보시기 바랍니다.

제가 잘못한건지 모르겠지만, QueryTrackingBehavior.NoTracking 적용해도 savechange 호출하면 EF Entity가 attached 되는거 같았습니다.
savechange() 호출이후에 명시적으로 Detached 시켜주니 빨라졌습니다.

2개의 좋아요

EF core에 관련된 질문은 현재 ASP.NET core 카테고리 아래에 종합하고 있습니다. 추후 후속 질문을 올려주실 때에는 ASP.NET core 카테고리로 질문을 올려주시면 감사하겠습니다.

3개의 좋아요

EfCore는 원래 대량 업데이트가 느립니다 ㅎㅎㅎ (못써먹을 정도로)
SqlCommand로 하면 몇배는 더 빨라지니 Bulk Insert, 혹은 Bulk Update 같은걸로 검색해보세요!

특히나 80만건 같은 데이터를 다루는 앱이라면 Ef Core에 확장메소드를 필수적으로 만드시는걸 추천합니다!

3개의 좋아요

해결방식이 약간다르기는 하나, 닷넷코어 3.1(ef)를 이용하여 실무에서
20만건정도 inertOrupdate를 대량업데이트 처리하고 있으며 3분이채 걸리지 않습니다.
(Entity frame work extension에서 bulkinsertOrUpdate 지원하며 유료이며 가격이상당해서 직접구현사용하였습니다.)

약간 변종의 방식이기는 하나, 작동되는 코드포함되어 있으니 참고하세요 주요컨셉은

4개의 좋아요