orm
orm copied to clipboard
Скорость работы Batch Insert
Очень медленно работает batch Insert. Тестировал на вставке 500 000 записей, по 100 запусков на каждый пример кода с предварительным truncate table перед каждым запуском скрипта.
$insert = $orm->getFactory()->database()->insert('test')->columns(
['id', 'title']
);
$count = 500_000;
for ($i = 1; $i <= $count; $i++) {
$insert->values(
[
$i,
'title ' . $i
]
);
$id++;
}
$t = microtime(true);
$insert->run();
echo (microtime(true) - $t);
Среднее время 12.3411750793457
То же самое через PDO
$question_marks = [];
$insert_values = [];
$count = 500_000;
for ($i = 1; $i <= $count; $i++) {
$question_marks[] = '(?, ?)';
$insert_values[] = $i;
$insert_values[] = 'title ' . $i;
}
$t = microtime(true);
$sql = "INSERT INTO `test` (`id`, `title`) VALUES " .
implode(',', $question_marks);
$stmt = $pdo->prepare($sql);
$stmt->execute($insert_values);
echo (microtime(true) - $t);
Среднее время 0.96931888580322
Это потому что пакетная вставка пока не поддерживается в орм. Каждая сущность вставляется отдельным запросом.
Пакетную вставку планируем завозить в версию 2, вроде как
Судя по всему тут затык на DBAL, там есть пакетная вставка, но не ясно почему она тормозит.