Yii2 создать большой объем данных - PullRequest
0 голосов
/ 26 апреля 2018

Я должен создать большой объем данных из существующих данных таблицы.Количество данных составляет от 5000 до 10000 в день.

Мой контроллер:

$skus = Sku3d::find()->all();

foreach ($skus as $sku) {
    $model = new Loghour3d();
    $model->sku = $sku->sku;
    $model->modeler = $sku->modeler;
    $model->team = $sku->team;
    $time = new \DateTime('now');
    $today = $time->format('Y-m-d');
    $model->day = $today;
    $model->handover = $sku->handover;
    $model->hour = $sku->totalhours;
    $model->save();
}

Но созданные часы неверны.Пример: $sku->totalhours = 12 но $model->hour = 600 и мой код $model->hour = $sku->totalhours;.Так что я не знаю, откуда 600.

А также есть ли лучший способ выполнить эту задачу, потому что сейчас это занимает около 15-20 минут.

1 Ответ

0 голосов
/ 26 апреля 2018

Если вы хотите ускорить обработку большого объема данных из базы данных, вы должны отказаться от использования 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();
...