최적화

Hojun Jeong·2023년 6월 29일
0

MySQL

목록 보기
4/4
post-thumbnail

함수는 다음의 작업을 하고 있었다

var result =  mainTable
.Include(tableA)
.Include(tableB)
.Include(tableC)
.GroupJoin(~~~code with groupJoining with tableD)
.GroupJoin(~~~code with groupJoining with tableE)
.Where(~~conditions).ToList();

result.Select(ToMyModel).ToList();
  1. 시간이 오래걸린다는 문제로 시작이 되었다
  2. 시간이 많이 걸리는 원인을 찾기위해 알아보다 이렇게 했을때 ToMyModel에서 조회쿼리를 타고 있음을 발견 => include의 eager loading이 일어나지 않음을 알게됨
    => groupJoin의 linq문이 include와 함께있으면 include eagerloading동작 안함
  3. 즉 include와 join과의 분리가 답
var includeResult =  mainTable
.Include(tableA)
.Include(tableB)
.Include(tableC).ToList();

var joinResult = includeResult
.GroupJoin(~~~code with groupJoining with tableD)
.GroupJoin(~~~code with groupJoining with tableE)
.Where(~~conditions).ToList();
  1. 다른 db서버로 재실행 하던중 tableA, tableB, tableC, mainTable과의 연관성이 높은 서버에서 오히려 시간이 더 많이 걸림을 알게됨
  2. 생각해보니 include,join까지 모두 한 후에 filtering을 하는것이 불필요했음을 느꼈다
    => mainTable에 대한 filtering이 이뤄지는 Where이므로 제일 앞으로 빼보았다
var filteredResult =  mainTable
.Where(~~conditions);

var includeResult = filteredResult
.Include(tableA)
.Include(tableB)
.Include(tableC).ToList();

var joinResult = includeResult
.GroupJoin(~~~code with groupJoining with tableD)
.GroupJoin(~~~code with groupJoining with tableE)
.Where(~~conditions).ToList();

❗ 7초가 걸렸던 쿼리가 1초 미만을 줄어들었다

중요한 포인트

1.쿼리를 실행할때 조건절을 보고 최대한 이른 시점에 사용하여 들고있는 데이터를 줄일수 있는방법을 사용
2.include는 join과 분리하여 사용

참고자료
https://gist.github.com/hellerbarde/2843375
🔼 최적화가 필요한 부분은 대부분 프로그램내부가 아닌 db로부터 데이터 가져오는 부분이다

profile
Student , Junior Developer

0개의 댓글