我正在使用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 :(得分:1)
FetchTradeWhQuantity
和SaveTradeWhQuantity
会进行大量的运行。这意味着(可能)每行至少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弹奏弹球。