orm icon indicating copy to clipboard operation
orm copied to clipboard

Скорость работы Batch Insert

Open iamsaint opened this issue 3 years ago • 2 comments

Очень медленно работает 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

iamsaint avatar May 20 '21 11:05 iamsaint

Это потому что пакетная вставка пока не поддерживается в орм. Каждая сущность вставляется отдельным запросом.

Пакетную вставку планируем завозить в версию 2, вроде как

roxblnfk avatar May 20 '21 13:05 roxblnfk

Судя по всему тут затык на DBAL, там есть пакетная вставка, но не ясно почему она тормозит.

wolfy-j avatar May 20 '21 13:05 wolfy-j