使用 php 将随机数据插入 Vertica 数据库
Inserting randomized data into Vertica database using php
我的目标是使用 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";
}
}
该脚本按预期工作并在大约 5 分钟内设法 运行 10k 插入循环,但我想知道是否有某种方法可以优化它并使其显着加快,因为我的最终目标是将 Vertica
服务器的插入速度与 MySQL
服务器的插入速度进行比较,因此我希望它尽可能高效。
也许 for 循环是错误的方法?我只是不知道还能怎么做。
如果你打开了自动提交,请关闭它。 (您以后可以随时将其重新打开)。完成后一定要提交。
# Turn on autocommit before executing insert
odbc_autocommit ( $conn, false );
# After all executes are successful, commit the work
odbc_commit ( $conn );
另外,不要 odbc_prepare
在你的循环中。你应该在循环之前准备,它只需要做一次。
使 Vertica 更快的唯一其他方法是使用批处理执行(据我所知 php odbc 或 pdo 不支持)。批处理将变成更高效的 COPY
语句。另一种选择是使用 COPY
但是你可能不得不跳过篮球。如果你真的有很多数据,那么你会想要的。这不是您可以在 PHP 内轻松完成的事情。它将涉及执行 vsql 或在集群上创建文件。
如果您真的想将 Vertica 与 MySQL 进行比较,那么这绝对不是在发挥 Vertica 的优势。 Vertica 在加载数据方面速度极快,但在执行大量小查询方面并不快。您要测试的是从 PHP 插入两个数据库的速度有多快。因为没有batch execute,所以MySQL很有可能赢。
我的目标是使用 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";
}
}
该脚本按预期工作并在大约 5 分钟内设法 运行 10k 插入循环,但我想知道是否有某种方法可以优化它并使其显着加快,因为我的最终目标是将 Vertica
服务器的插入速度与 MySQL
服务器的插入速度进行比较,因此我希望它尽可能高效。
也许 for 循环是错误的方法?我只是不知道还能怎么做。
如果你打开了自动提交,请关闭它。 (您以后可以随时将其重新打开)。完成后一定要提交。
# Turn on autocommit before executing insert odbc_autocommit ( $conn, false ); # After all executes are successful, commit the work odbc_commit ( $conn );
另外,不要
odbc_prepare
在你的循环中。你应该在循环之前准备,它只需要做一次。
使 Vertica 更快的唯一其他方法是使用批处理执行(据我所知 php odbc 或 pdo 不支持)。批处理将变成更高效的 COPY
语句。另一种选择是使用 COPY
但是你可能不得不跳过篮球。如果你真的有很多数据,那么你会想要的。这不是您可以在 PHP 内轻松完成的事情。它将涉及执行 vsql 或在集群上创建文件。
如果您真的想将 Vertica 与 MySQL 进行比较,那么这绝对不是在发挥 Vertica 的优势。 Vertica 在加载数据方面速度极快,但在执行大量小查询方面并不快。您要测试的是从 PHP 插入两个数据库的速度有多快。因为没有batch execute,所以MySQL很有可能赢。