2013-02-04 4 views
0

나는 codeigniter와 mysql을 사용하고 있으며 mssql 서버에서 데이터를 가져 와서 내 시스템으로 업데이트하려고합니다. 매우 느립니다. 여기 이 코드의 끔찍한 성능

class systemupdate extends MY_Controller{ 

    function systemupdate() {  
     return parent::MY_Controller(); 
    } 

    function index(){ 
     $message = '';                     
     $message = "CRON Information::COMMON INVENTORY SYSTEM: QUANTITY UPDATE FOR TRADE WH STARTED."; 
     log_message('info', $message); 
     $this->load->model("cis/sapinventorymodel"); 
     $objMainResult = $this->sapinventorymodel->FetchDetailsByUnit(420); 
     $mainResult = json_decode($objMainResult); 
     if((isset($mainResult)) && ($mainResult->results > 0)) 
     { 
      $this->load->model("cron/systemupdatemodel"); 
      foreach($mainResult->rows as $main) 
      { 
       $arrQuantity = ''; 
       $arrQuantity = $this->systemupdatemodel->FetchTradeWhQuantity($main->number); 
       if((isset($arrQuantity)) && (count($arrQuantity) > 0)) 
       { 
        if((isset($arrQuantity[0]->quantity)) && ($arrQuantity[0]->quantity != NULL)){ 
         $objMainResult = $this->sapinventorymodel->SaveTradeWhQuantity($main->a_umber, $main->a_plant, 
                        $main->a_unit,$arrQuantity[0]->quantity); 
        } 
       } 
      } 
     } 
     $message = "CRON Information::COMMON INVENTORY SYSTEM: QUANTITY UPDATE FOR TRADE WH FINSIHED."; 
     log_message('info', $message);  
    } 
} 

은 모델에게 기록의

class systemupdatemodel extends MY_Model { 

    function systemupdatemodel() { 
     parent::__construct(); 
     $CI->sapData = $this->load->database("sapinventory", TRUE); 
     $this->sapData = &$CI->sapData; 
    } 

    function FetchTradeWhQuantity($p_intNumber){ 

     $query = $this->sapData->query("SELECT quantity FROM master1 WHERE NUMBER = '$p_intNumber'"); 
      if(($query->num_rows() > 0) && ($query->num_rows() == 1)){ 
       return $query->result(); 
      }else 
      { 
       $query1 = $this->sapData->query("SELECT quantity FROM master2 WHERE EANNUMBER = '$p_intNumber'"); 
       if(($query1->num_rows() > 0) && ($query1->num_rows() == 1)){ 
        return $query1->result(); 
       }     
      }          
    } 
} 

총 수입니다 .. 내가 뭐하는 거지 뭐 잘못 있으면 알려 주시기 바랍니다 7857이 여러 번 즉 그 루프입니다. sapinventory은 mssql 서버입니다.

+0

개선 할 수있는 한 가지는'($ query-> num_rows() = 0) && ($ query-> num_rows() == 1)'을')'. 이렇게하면'$ query-> num_rows()'호출 수가 줄어 듭니다. 결과가 '1'일 때 항상 '0'보다 큽니다. – mixable

+0

성능이 얼마나 끔찍한가요? 실행하는데 얼마나 걸리나요? 첫 번째 쿼리에서 가져온 각 데이터 행에 대해 2 개의 데이터베이스 쿼리를 수행합니다. 따라서 잠재적으로 db에 약 15,000 건의 호출이 발생합니다. – Jeemusu

+0

@Jeemusu - CRON 일이라고 생각합니다. 첫 번째 테이블을 검사하고 두 번째 테이블에서 데이터가 없는지 확인합니다. 10 분 이상 걸립니다. – Hacker

답변

1

FetchTradeWhQuantitySaveTradeWhQuantity이 경우 많은 양의 실행됩니다. 즉, 행 당 최소 3 개의 mysql 쿼리를 (아마도) 의미합니다. 대신 1 ~ 2 개의 큰 쿼리를 통해이 쿼리를 실행하면 성능이 크게 높아질 것입니다.

이제는 쉽게 할 수있는 일이나 어려운 일이 될 수 있습니다.

예를 들면;

function FetchTradeWhQuantity($p_intNumber){ ... } 

function FetchTradeWhQuantity($p_intNumber) { 

    $query = $this->sapData->query(" 

          SELECT quantity 
          FROM master 1 
          WHERE NUMBER = '{$p_intNumber}' 
          UNION 
          SELECT quantity 
          FROM master2 
          WHERE EANNUMBER = '{$p_intNumber}' 

            "); 

    if ($query->num_rows() == 1) 
     return $query->result(); 

} 

할 수 그러나 당신이 할 수있는 최고의 것은 2-3로이 모든 작업을 수행하는 것입니다 를 조회합니다. 모든 데이터를 가져 와서 ID를 사용하고 UPDATE 또는 INSERT INTO ... ON DUPLICATE KEY UPDATE을 실행하십시오. 그런 다음 서버는 mysql 데이터베이스에 몇 번만 연결하면되고 작은 행마다 PHP로 핀볼을 재생할 필요가 없습니다.