Если вы хотите ускорить обработку большого объема данных из базы данных, вы должны отказаться от использования ActiveRecord
в первую очередь.Работа с массивами и использование DAO должно быть намного более эффективным, чем создание ActiveRecord
объекта для каждой записи.
Второе - вы должны использовать batchInsert()
для вставки несколькихзаписи в одном запросе.Вставка 100 записей в один запрос быстрее, чем в 100 отдельных запросов.
Третье - если какое-либо значение одинаково для каждой записи, переместите его перед foreach.Нет смысла вычислять текущую дату 10000 раз, если она всегда одинакова.
$skus = Sku3d::find()->asArray()->all();
$time = new \DateTime('now');
$today = $time->format('Y-m-d');
$toInsert = [];
foreach ($skus as $sku) {
$toInsert[] = [
'sku' => $sku['sku'],
'modeler' => $sku['modeler'],
'team' => $sku['team'],
'day' => $today,
'handover' => $sku['handover'],
'hour' => $sku['totalhours'],
];
}
Yii::$app->db->createCommand()
->batchInsert(
Loghour3d::tableName(),
[
'sku',
'modeler',
'team',
'day',
'handover',
'hour',
],
$toInsert
)
->execute();