Вставка рандомизированных данных в базу данных Vertica с использованием переполнения стека

Моя цель — генерировать случайные данные (числа с плавающей запятой, строки, даты и т. Д.), Используя php, а затем вставлять данные в базу данных на Vertica сервер. Я не знаю, что я делаю очень хорошо, но я попытался использовать цикл for для создания и вставки данных.

$RecCount = 10000;
function generateRandomString($length = 60) {
return substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, $length);
}

for($i = 0; $i < $RecCount; ++$i)
{
$a=mt_rand(0,1000000);
$b=generateRandomString();

$timestamp = mt_rand(1, time());

$rd = date('d M Y', $timestamp);
$rt = date('H:i:s', $timestamp);
$ts = date('Y-m-d H:i:s', strtotime('+1 hour') );

$sql = "INSERT into test values('$i','$a','$b','$rd','$rt','$ts','t')";
$result = errortrap_odbc($conn, $sql);

# Insert data into the table with odbc_prepare and odbc_execute
$values = array($i,$a,$b,$rd,$rt,$ts,'t');
$statement = odbc_prepare($conn,"INSERT into test values(?,?,?,?,?,?,?)");if(!$result = odbc_execute($statement, $values)) {
echo "odbc_execute Failed!" . "\n";
} else {
echo "Success: odbc_execute." . "\n";
}
}

Сценарий работал так, как задумано, и ему удалось запустить циклы вставки 10 тыс. Примерно за 5 минут, но мне интересно, есть ли способ как-нибудь оптимизировать это и сделать его значительно быстрее, так как моя конечная цель — сравнить скорости вставки Vertica сервер к MySQL сервер, поэтому я бы хотел, чтобы он был максимально эффективным.

Может быть, цикл for — неправильный путь? Я просто не знал, как еще это сделать.

2

Решение

  1. Выключите автокоммит, если он у вас включен. (Вы всегда можете включить его позже). Не забудьте совершить после того, как вы закончите.

    # Turn on autocommit before executing insert
    odbc_autocommit ( $conn, false );
    
    # After all executes are successful, commit the work
    odbc_commit ( $conn );
    
  2. Кроме того, не odbc_prepare внутри вашей петли. Вы должны готовиться перед циклом, это нужно сделать только один раз.

Единственный другой способ сделать это быстрее для Vertica — это использовать batch execute (насколько я знаю, для php odbc или pdo не поддерживается). Пакетное выполнение превратится в гораздо более эффективный COPY заявление. Другой альтернативой является использование COPY Однако, вероятно, вам придется прыгать через обручи. Если у вас действительно много данных, то вы захотите. Это не то, что вы можете легко сделать в PHP. Это будет включать либо выполнение vsql, либо создание файла в кластере.

Если вы действительно хотите сравнить Vertica с MySQL, то это определенно не соответствует сильным сторонам Vertica. Vertica очень быстро загружает данные, но не очень быстро выполняет тонны небольших запросов. Что вы тестируете, так это то, насколько быстро вставка в обе базы данных из PHP. Поскольку нет пакетного выполнения, MySQL, вероятно, победит.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]