ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2021-04-21일 슬로우 쿼리 문제 발견.
    PHP/회사일 기록지 2021. 4. 21. 15:16
    728x90

    사용자들이 자주 사용하는 페이지에서 특정 php스크립트 페이지에서 슬로우 쿼리가 일어나는 부분을 발견했다.

    이 사업장에 대략 사원수는 : 1400명

    1400명밖에 안되는 사업장에서 월근태 페이지에 모든 사원들의 정보를 가져오는데 걸리는 시간은 20초....

    원인이 뭘까

     

    SELECT 
          EMP_NO, 
          KOREAN_NAME, 
          RETIRE_DATE, 
          ENTER_DATE, 
          RESIDENT_NO, 
          C.DUTY_NAME, 
          D.COMPNAME 
    FROM 		 AS B 
    JOIN 		 AS C 
    ON 			B.DUTY_CODE = C.DUTY_CODE 
    JOIN 		 D ON C.COMPCODE = D.PCOMPCODE 
    WHERE 		C.USE_TAG = 'Y' 
    And 		B.WORK_MANAGE_TAG='A' ORDER BY EMP_NO

     

    우선 이 쿼리가 기본적으로 월근태 자료에 해당하는 사원들을 뽑아오는 쿼리이다.

    1400명을

    	for($j=0; $row = $obj->fetch2($result); $j++)

    반복문을 이용하여 테이블 행들을 그리는 방식인데.

    반복문안 내부에서 도는  로직에서 호출하는 반복 쿼리가 문제인것 같다.

     

    문제발견)

    [문제쿼리 1] 급여자료가 있는지 확인하는 쿼리.

    $PayRun_Data

    결과값이 $Pay_Run_Data에 담긴다.

     

    내코멘트) 지금 반복문이 1400번 도는데 급여자료가 있는지 확인하는 쿼리도 1400번 돈다 ㄷㄷ.

    해결방법) 사원을 뽑아오는 쿼리에서 조인문을 활용해서 해당사원의 귀속년월에 급여자료가 있는지 확인하게 쿼리를 합치자.

     

    [문제쿼리 2] 월근태 자료가 있을경우 그자료를 $row5변수에 담고 그 값을 기존에 뿌려질 $row변수에 옮긴다.

    if($T_CNT !== 0) 
    //월근태 자료가 있는경우!
    
    $result5		= $obj->query($Qry1);
    $row5		= $obj->fetch2($result5);
    
    $row = $row5

    내코멘트) 만약 21년4월에 1400명이 다 자료가 있을경우 이또한 1400번 쿼리가 돈다. 자료가 없을때 실행되는 페이지와 있을때 페이지의 속도가 차이가 심하다.

    해결방법) 당장 머릿속에 생각나는 방법은 먼저 월근태 자료가 있는 사람들을 쿼리 한번에 불러와서 2차원 배열에 담아서 만들고, 고유값 사원 번호 같은것으로 배열의 key값으로 설정한뒤 $row행의(1300명 대상자 결과값이 담긴 변수) 사원 번호를 이용해서 $row5[][]값을 $row에 담는것이다.

     

    [해결방법 알고리즘]
    $query =""; //자료가 있는 사람들을 한번에 불러오는 쿼리
    $while(){//반복문으로 2차원배열 생성
    $row['20210421']['KOREAN_NAME'];
    $row['20210421']['PRE_TIEM'];
    }
    
    $row['KOREAN_NAME'] = $row5[$row['EMP_NO']]['KOREAN_NAME'];
    $row['PRE_TIME'] = $row5[$row['EMP_NO']]['PRE_TIME'];
    
    //이렇게 하면 결과값이 같지않을까

     

     

    [결과] 페이지 실행시간이 처음에 14초가 걸렸는데, 문제의 쿼리 2가지만 수정하였더니 5초가걸린다!!!! 9초단축

    728x90
Designed by Tistory.