2013-01-04 62 views
2

我需要手動將大量的訂單項目保存到數據庫。目前,我正在做這樣的事情:如何優化保存多個模型?

for($x=0; $x<250000; $x++) 
{ 
    $orderItem = Mage::getModel('sales/order_item'); 
    $data = array('a'=>1, 'b'=>2, 'c'=>3); 
    $orderItem->setData($data)->save(); 
} 

試圖從一個shell腳本運行該代碼利用永遠。我可以使用什麼策略來加速此代碼?

+0

嘗試看看'Mage_Sales_Model_Resource_Order_Abstract :: _postSaveFieldsUpdate()'並使用類似的邏輯在'Mage_Sales_Model_Resource_Order_Item'中創建公共方法。 – Zyava

回答

3

我認爲在這種情況下,最重要的是加速顯着的創建自定義數據庫查詢。

編輯:相關選項:嘗試重寫模型和資源模型以實現方法bulkSave(),它與save()類似,但僅創建相應的查詢對象並將其返回,因此它實際上並不使用數據庫。然後收集所有的查詢,並在每千件左右的大交易中運行它們。

+0

這種方法肯定會更快,但這個查詢的複雜性非常高。如果只是我實際上將所有項目都設置爲A,B,C! – Ryre

+0

@Toast您可以對每個項目有不同的查詢,並將它們全部放入一個字符串中,然後在每說出1000個項目後在DB上執行該查詢。或者它是複雜的,甚至撰寫這樣的查詢? – mpaepper

+0

@Toast在編輯中詳細闡述了這一點。 – mpaepper

4

我不知道,但看看@Mage::getModel('core/resource_transaction')

https://stackoverflow.com/a/4879133/1191288

你可以嘗試在以往X量做批量保存

$batch = 500; 
$orderItem = Mage::getModel('sales/order_item'); 
$transactionSave = Mage::getModel('core/resource_transaction'); 

for($x=0; $x<250000; $x++){ 
    $orderItem->setData(array('a'=>1, 'b'=>2, 'c'=>3)); 
    $transactionSave->addObject($orderItem); 
    $orderItem->reset() 
    if ($x % $batch == 0){ 
     $transactionSave->save(); 
     $transactionSave = null; 
     $transactionSave = Mage::getModel('core/resource_transaction'); 
    } 
} 

if($x % $batch > 0) 
    $transactionSave->save(); 
+0

最後的評論不能取消評論。循環,正確,但在交易中。所以速度更快。 – infabo