2013-02-04 110 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 )'。這將減少'$ query-> num_rows()'調用的次數。當結果是「1」時,它總是大於「0」。 – mixable

+0

表現有多糟糕?需要多長時間才能執行?您對從第一個查詢中提取的每一行數據進行2次數據庫查詢。所以這可能會有大約15,000次調用db。 – 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並運行UPDATEINSERT INTO ... ON DUPLICATE KEY UPDATE。然後服務器只需要連接到mysql數據庫幾次,並且不必爲每個小行用php彈球。