使用php将随机数据插入Vertica数据库

时间:2016-07-22 12:24:21

标签: php database 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";
    }
}

该脚本按预期工作,并设法在大约5分钟内运行10k插入循环,但我想知道是否有某种方式我可以优化它并使其显着更快,因为我的最终目标是比较Vertica服务器到MySQL服务器的插入速度,以便我们尽可能高效。

也许for循环是错误的方法?我只是不知道该怎么做。

1 个答案:

答案 0 :(得分:0)

  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。你应该在循环之前做好准备,只需要做一次。

  3. 使Vertica更快的另一种方法是使用批量执行(据我所知,不支持php odbc或pdo)。批量执行将变为更高效的COPY语句。另一种选择是使用COPY但是你可能需要跳过篮球。如果你真的有很多数据,那么你想要。这不是你在PHP中可以轻松做的事情。它将涉及执行vsql或在集群上创建文件。

    如果您真的想比较Vertica与MySQL,那么这绝对不会影响Vertica的优势。 Vertica在加载数据方面非常快,但执行大量小查询的速度并不快。您在测试的是从PHP插入两个数据库的速度有多快。因为没有批处理执行,MySQL很可能会获胜。