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 サーバーです。

4

1 に答える 1

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 でピンボールをする必要はありません。

于 2013-02-04T13:47:15.220 に答える