【问题标题】:Inserting randomized data into Vertica database using php使用 php 将随机数据插入 Vertica 数据库
【发布时间】:2016-07-22 12:24:20
【问题描述】:

我的目标是使用 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 循环是错误的方法?我只是不知道该怎么做。

【问题讨论】:

  • 考虑发布到Code Review - 这是工作代码只需要优化的地方

标签: php database vertica


【解决方案1】:
  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 更快的唯一其他方法是使用批处理执行(据我所知,对于 php odbc 或 pdo 不支持)。批量执行将变成更高效的COPY 语句。另一种选择是使用COPY,但是你可能不得不跳过箍。如果你真的有很多数据,那么你会想要的。这不是您可以在 PHP 中轻松完成的事情。这将涉及执行 vsql 或在集群上创建文件。

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

【讨论】:

  • 我知道这一点。我的第一个目标是比较插入速度,我的第二个目标是比较加载速度,希望 Vertica 的性能优于 MySQL
  • @Greip 如果您可以切换到COPY,它的表现可能会更好。如果您使用 python,则可以使用 vertica_python 或 Vertica 提供的新 python 模块。两者都支持COPY,并且非常易于使用。否则,您需要使用vsqljavaJDBC 驱动程序还将批处理 INSERT 转换为 COPY
猜你喜欢
  • 2013-05-29
  • 1970-01-01
  • 2011-01-30
  • 1970-01-01
  • 2016-11-12
  • 2014-01-24
  • 2015-03-25
  • 2017-10-03
相关资源
最近更新 更多