검색 조회시간을 조금 빨리 하고 싶습니다.

검색 조회시간을 조금 빨리 하고 싶습니다.

QA

검색 조회시간을 조금 빨리 하고 싶습니다.

본문

안녕하세요, 회사 직원들 출퇴근 과 근무시간등등 여러개 컬럼을 조회하고 있습니다.

30명가까이 되는데, 1개월로 조회하니,

10초넘게 걸려서 어떤부분을 수정해야되는지 문의 드립니다.

첫번째 반복: 직원명 조회,

두번째 반복: 직원명 해당되는 검색 시작일부터 +1일로 조회,

 

개발 초보입니다. 많은 도움 부탁드립니다. 감사합니다. 


<?php
include_once('./_common.php');
include_once(G5_PLUGIN_PATH.'/jquery-ui/datepicker.php');
include_once('./admin_list.lib.php');
$s_week .= calculate_prev_week($startday)." 00:00:00";
$e_week .= calculate_next_week($startday)." 23:59:59";
$n_dahg .= calculate_month_startday_list7($startday)." 00:00:00";
$e_dahg .= calculate_month_endday_list7($startday)." 23:59:59";
if(!$endday){
    $startday = calculate_prev_week($startday);
    $endday = date("Y-m-d", strtotime($startday." +6 day"));
}
?>
<!-- 필수 JS/CSS { -->
<link type="text/css" href="./adminlist/style.css" rel="stylesheet" />
<link type="text/css" href="./adminlist/style-adminlist4.css" rel="stylesheet" />
<script type="text/javascript" src="./adminlist/jquery.min.js"></script>
<script type="text/javascript" src="./adminlist/jquery-ui.min.js"></script>
<!-- } -->
<table  cellpadding=0 cellspacing=0 align=center >
    <tr>
        <td colspan=10 align=center>
        <form method="post" action="admin_list7.php">
        <input type="hidden" name="bo_table"  value='<?=$bo_table?>'>
            이름 : <input type="text" name="n_nmame" class="frm_input" value='<?=$n_nmame?>' size=10>
        <input type="text" name="startday" value="<?php echo $startday; ?>" id="startday" class="datepicker frm_input" placeholder="시작일" readonly="true" /> ~ 
        <input type="text" name="endday" value="<?php echo $endday; ?>" id="endday" class="datepicker frm_input" placeholder="종료일" readonly="true" />
            </br></br>
        <div>
            <input type="submit" value='검색'>   
            <button type="button" onclick="javascript:set_date('오늘');" class="date_btn">오늘</button>
            <button type="button" onclick="javascript:set_date('어제');" class="date_btn">어제</button>
            <button type="button" onclick="javascript:set_date('이번주');" class="date_btn">이번주</button>
            <button type="button" onclick="javascript:set_date('이번달');" class="date_btn">이번달</button>
            <button type="button" onclick="javascript:set_date('지난주');" class="date_btn">지난주</button>
            <button type="button" onclick="javascript:set_date('지난달');" class="date_btn">지난달</button>
        </div>
        </form>
        </td>
    </tr>
</table>
    </br></br>
<div id="hanbit_gantchart">
<table >
    <tr>
        <th align=center width="3%">순서</th>
        <th align=center width="4%">이름</th>
        <th align=center width="4%">내용</th>
        <?php calculate_view_list7($startday,$endday); ?>
        <th align=center width="3%">근무<br>일수</th>
        <th align=center width="4%">근무<br>시간</th>
        <th align=center width="4%">평균<br>근무<br>시간</th>
        <th align=center width="4%">오버<br>타임</th>
    </tr>
    <?
        $sql_search .= " where mb_name ='{$n_nmame}'"; // 최고관리자 제외
        $sql_order = " order by mb_name";

    $sql = " select mb_name from {$g5['member_table']} {$sql_search} {$sql_order}";
    $result = sql_query($sql);
 
//직원명 조회

    for ($i=0; $rows=sql_fetch_array($result); $i++) {
        $y++;
        $mb_name = $rows['mb_name'];
        ?>
        <tr >
            <td align=center><strong><?php echo $y ?></strong></td>
            <td align=center><strong ><?php echo $mb_name?></strong></td>
            <td align=center><strong >
            <div class="office_time_go">출근시간: </div>
            <div class="office_time_end">퇴근시간: </div>
            <div class="office_time_alltime">근무시간: </div>
            <div class="office_time_overtime">오버타임: </div>
            </strong></td>
        <?php
            
//직원명으로 검색(시작일과 종료일)로 조회

        for($a=0; $a<count_list7($startday, $endday); $a++){
            $beforeDay = date("Y-m-d", strtotime($startday." +$a day"));
            $sql_office_time = "SELECT wr_2, wr_7,wr_15,wr_16,wr_3,wr_4 FROM $write_table WHERE wr_is_comment = 0 and wr_3 LIKE '%$beforeDay%' and wr_name ='$mb_name'";
            $result_office_time = sql_query($sql_office_time);
            $row=sql_fetch_array($result_office_time);
            
            $yoil = calculate_yoil($beforeDay);
            
        if($row['wr_3'] && (!$row['wr_2'] || strpos($row['wr_2'], "오전") || strpos($row['wr_2'], "오후")) ){
            ?>
            <td align=center> 
                    <div class="office_time_go"><?php echo substr($row['wr_3'], 11, 5); ?></div>
                    <div class="office_time_end"><?php if($row['wr_3'] != $row['wr_4']) echo substr($row['wr_4'], 11, 5); ?></div>
                
                <?php if(!$row['wr_7']){ ?> 
                    <div class="office_time_alltime" style="background-color:#efefef;" title="<?php echo substr($row['wr_3'], 11, 5); ?> ~ <?php echo substr($row['wr_4'], 11, 5); ?>">
                <?php }else { ?> 
                    <div class="office_time_alltime" >
                <?php } ?> 
                    <font style="padding-top:3px"> <?php echo str_replace("시간", "시간<br>", $row['wr_7']); ?></font> </div>
                <?php if($row['wr_2']){ ?> 
                    <div class="office_time_overtime" style="background-color:#92d050;">
                <?php }else { ?> 
                    <div class="office_time_overtime" >
                <?php } ?> <div><?php if($row['wr_2']){ echo $row['wr_2']; }else{ echo str_replace("시간", "시간<br>", $row['wr_15']); } ?></div>
                    </div>
            </td>
            <?php
        }else if($row['wr_2']) {
            ?>
            <td >
            <div class="office_time_go"></div>
            <div class="office_time_end"></div>
            <div class="office_time_alltime"></div>
            <div class="office_time_overtime" style="background-color:#92d050;"><?php echo $row['wr_2'] ?></div></td>
            <?php
        }else{
            ?>
            <td>
            <div class="office_time_go"></div>
            <div class="office_time_end"></div>
            <div class="office_time_alltime"></div>
            <div class="office_time_overtime"></div>
            </td>
            <?php
        }
            ?>
        <?php 
        }
            $count_endday = date("Y-m-d", strtotime($endday." +1 day"));
            $sql_office_overtime = "SELECT sum(wr_8),sum(wr_16) FROM $write_table WHERE wr_is_comment = 0 and wr_3 between '$startday' and '$count_endday'  and wr_name ='$mb_name'";
            $result_office_overtime = sql_query($sql_office_overtime);
            $row_office_overtime=sql_fetch_array($result_office_overtime);
            
            $sql_office_day = "SELECT count(*) FROM $write_table WHERE wr_is_comment = 0 and wr_3 between '$startday' and '$count_endday'  and wr_name ='$mb_name'";
            $result_office_day = sql_query($sql_office_day);
            $row_office_day=sql_fetch_array($result_office_day);
        ?>
            <td align=center> 
            <?php echo $row_office_day['count(*)']; ?>일
            </td>
            <td align=center> 
            <?php echo office_time($row_office_overtime['sum(wr_8)']); ?>
            </td>
            <td align=center> 
            <?php echo office_time_avg($row_office_overtime['sum(wr_8)'], $row_office_day['count(*)']); ?>
            </td>
            <td align=center> 
            <?php if($row_office_overtime['sum(wr_16)']) echo office_time($row_office_overtime['sum(wr_16)']); ?>
            </td>
        </tr>
    <?php
    } 
    ?>
</table>
</div>
<?php
//include_once(G5_PATH.'/tail.php');
?>
<script type="text/javascript">
// 달력 시작
//<![CDATA[
$(function(){
    $(".targetFocus").click(function(){
        $($(this).data("target")).focus();
    });
});
//]]>
// 달력 끝
</script>
<!-- 캘린더 옵션 { -->
<script>
$.datepicker.setDefaults({
    closeText: "닫기",
    prevText: "이전달",
    nextText: "다음달",
    currentText: "오늘",
    monthNames: ["1월", "2월", "3월", "4월", "5월", "6월","7월", "8월", "9월", "10월", "11월", "12월"],
    monthNamesShort: ["1월", "2월", "3월", "4월", "5월", "6월","7월", "8월", "9월", "10월", "11월", "12월"],
    dayNames: ["일요일", "월요일", "화요일", "수요일", "목요일", "금요일", "토요일"],
    dayNamesShort: ["일", "월", "화", "수", "목", "금", "토"],
    dayNamesMin: ["일", "월", "화", "수", "목", "금", "토"],
    weekHeader: "주",
    dateFormat: "yy-mm-dd", // 날짜형태 예)yy년 m월 d일
    firstDay: 0,
    isRTL: false,
    showMonthAfterYear: true,
    yearSuffix: "년"
    })
    $(".datepicker").datepicker({
    })
    </script>
<script type="text/javascript">
// 달력 시작
//<![CDATA[
$(function(){
    $(".datepicker").datepicker({
        dateFormat: "yy-mm-dd",
        
    });
    $(".targetFocus").click(function(){
        $($(this).data("target")).focus();
    });
});
//]]>
// 달력 끝
    $(function(){
        $(".startday, .endday").datepicker({ changeMonth: true, changeYear: true, dateFormat: "yy-mm-dd", showButtonPanel: true, yearRange: "c-99:c+99", maxDate: "+0d" });
        //$(".set_date").datetimepicker({ changeMonth: true, changeYear: true, dateFormat: "yy/mm/dd", timeFormat:"HH:mm:ss", controlType:"select", oneLine:true, showButtonPanel: true, yearRange: "c-99:c+99", maxDate: "+0d" });
    });
    function set_date(today)
    {
        <?php
        $date_term = date('w', G5_SERVER_TIME);
        $week_term = $date_term + 7;
        $last_term = strtotime(date('Y-m-01', G5_SERVER_TIME));
        ?>
        if (today == "오늘") {
            document.getElementById("startday").value = "<?php echo date('Y-m-d', G5_SERVER_TIME); ?>";
            document.getElementById("endday").value = "<?php echo date('Y-m-d', G5_SERVER_TIME);; ?>";
        } else if (today == "어제") {
            document.getElementById("startday").value = "<?php echo date('Y-m-d', G5_SERVER_TIME - 86400); ?>";
            document.getElementById("endday").value = "<?php echo date('Y-m-d', G5_SERVER_TIME - 86400); ?>";
        } else if (today == "이번주") {
            document.getElementById("startday").value = "<?php echo date('Y-m-d', strtotime('-'.$date_term.' days', G5_SERVER_TIME)); ?>";
            document.getElementById("endday").value = "<?php echo date('Y-m-d', G5_SERVER_TIME); ?>";
        } else if (today == "이번달") {
            document.getElementById("startday").value = "<?php echo date('Y-m-01', G5_SERVER_TIME); ?>";
            document.getElementById("endday").value = "<?php echo date('Y-m-d', G5_SERVER_TIME); ?>";
        } else if (today == "지난주") {
            document.getElementById("startday").value = "<?php echo date('Y-m-d', strtotime('-'.$week_term.' days', G5_SERVER_TIME)); ?>";
            document.getElementById("endday").value = "<?php echo date('Y-m-d', strtotime('-'.($week_term - 6).' days', G5_SERVER_TIME)); ?>";
        } else if (today == "지난달") {
            document.getElementById("startday").value = "<?php echo date('Y-m-01', strtotime('-1 Month', $last_term)); ?>";
            document.getElementById("endday").value = "<?php echo date('Y-m-t', strtotime('-1 Month', $last_term)); ?>";
        } else if (today == "전체") {
            document.getElementById("startday").value = "";
            document.getElementById("endday").value = "";
        }
    }
</script>
 

	
		
			wr_1:공휴일출근여부,
		
		
			wr_2:휴가종류,
		
		
			wr_3:출근시간,
		
		
			wr_4:퇴근시간,
		
		
			wr_5:출근지역,
		
		
			wr_6:퇴근지역,
		
		
			wr_7:근무시간,
		
		
			wr_8:근무시간유닉스,
		
		
			wr_9:출근지역-기타지역,
		
		
			wr_10:퇴근지역-기타지역 ,
		
		
			wr_11,12 : 출근 지점명, 도로명, 
		
		
			wr_13,14 : 퇴근 지점명, 도로명,
		
		
			wr_15:오버타임시간,
		
		
			wr_16:오버타임유닉스
		
	


이 질문에 댓글 쓰기 :

답변 3

db 테이블인덱스구성이 어떻게 되어 있나요?

 

불필요한 query 문이 많군요.

 

$write_table 게시판에

index ( wr_name, wr_3) 정도만 추가해도 효과가 있을 듯하군요.

우선 쿼리를 sql에서 개별로 실행해보시는것이 좋을듯 싶네요

실행해서 시간체크 하시고 만일 개별로 실행했을때 시간이 1초를 넘어간다면 쿼리를 개선해야 할듯 싶네요.. 조건절에서 가장 많이 걸려지는 큰 조건부터 순차적으로 작성하시는게 좋구요....

그래도 느리다면 인덱스를 활용하셔야 할것 같습니다.

그리고 쿼리를 반복문으로 돌릴것 아니면 그냥 sql_fetch($sql_office_overtime); 로 해주시는게 좋아 보입니다. 성능면에서 별차이는 없다고 하지만 그래도 sum row가 단일행인데 sql_fetch_array를 쓸필요는 없을듯 싶네요... 저역시 고수는 아니니 그냥 참고하시는 정도로만 여겨주세요

쿼리문 최소화, 인덱스 설정, 캐시 설정 크게 가면 검색 테이블을 따로 만드는것이 나을수도 있습니다.

우선 쿼리를 최대한 간결하게 하시고, 그 후에도 속도 문제가 된다면 인덱스 설정식으로 고민하시는것이 좋습니다

답변을 작성하시기 전에 로그인 해주세요.
전체 7
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT