80만건 정도를 배치 처리를 하고 있는데요.
원래 예전부터 ef 는 잘 사용을 하지 않았습니다.
하지만, 이제는 써볼려고 써봤는데요… 머가 문제 일까요 ㅠ.ㅠ 성능 차이가 너무 나네요.
머가 문제인지 모르겠네요. 로직 자체는 아주 심플 합니다. (ef 가 open close 를 빈번한게 문제일까요 )
ef 의 자동화된 쿼리를 로그로 남겨서 봐도…query 자체는 문제는 없어 보이는데요. ( 인덱스 문제는 아닌듯)
일단 raw 쿼리를 이용하여 아래 처럼 할경우 대략 4시간 정도
디비.open
루프 돌면서 80만건에 대해서 인서트-업데이트
디비.close
**ef core 를 이용 (repository 를 만들어서 종속성을 주입하고) 대략 12시간 지나도 반도 안 끝남 ㅠ.ㅠ **
80만건 루프 돌면서 각 건별로 인서트-업데이트 savechange
음…저도 자세하게는 알지 못하나, ef core 자체는 ef시절부터 성능 이슈가 있었던 것으로 알고 있습니다. 게다가 linq자체도 성능이슈가 있습니다. orm을 좋아하시는 분들중에서 ef core를 좋아하시지 않는 분들은 거진 위와 같은 성능이슈때문에 안쓰시고 보통 dapper같은 성능중심 orm을 사용하시는 거로 압니다. 구글에 ef 성능에 관해 검색하시면 많은 글을 보실 수 있습니다.
체크하시는 데이터 80만 건에 대하여 인서트와 업데이트가 섞여있다면 업데이트 위주로 하시고 인서트는 sqlbulkcopy 같은 벌크인서트 클래스를 통해 인서트하시면 속도가 좀 개선되지 않을까 합니다.
또한 커넥션을 여닫는 것도 오버헤드에 속하니 말씀하신거처럼 커넥션을 열어두고 배치작업을 하시는게 좋을 듯하며, 디비에서 인덱스도 고려해보시면 좋을 듯 합니다.