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

使用php将随机数据插入Vertica数据库,php,database,vertica,Php,Database,Vertica,我的目标是使用php生成随机数据(浮动、字符串、日期等),然后将数据插入Vertica服务器上的数据库。我不知道我在做什么,但我尝试使用for循环来创建和插入数据 $RecCount = 10000; function generateRandomString($length = 60) { return substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0,

我的目标是使用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";
    }
}
$RecCount=10000;
函数生成器域字符串($length=60){
返回substr(str_shuffle(“0123456789abcdefghijklmnopqrstuvxyzabcdefghijklmnopqrstuvxyz”),0,$length;
}
对于($i=0;$i<$RecCount;++$i)
{
$a=百万兰特(01000000);
$b=GeneratorDomainString();
$timestamp=mt_rand(1,time());
$rd=日期('d M Y',$timestamp);
$rt=日期($H:i:s',$timestamp);
$ts=日期('Y-m-d H:i:s',标准时间('+1小时');
$sql=“插入测试值(“$i”、“$a”、“$b”、“$rd”、“$rt”、“$ts”、“t”)”;
$result=errortrap_odbc($conn,$sql);
#使用odbc_prepare和odbc_execute将数据插入表中
$values=数组($i、$a、$b、$rd、$rt、$ts、't');
$statement=odbc_prepare($conn,“插入测试值(?,,,,,,,,,?));
如果(!$result=odbc\u execute($statement,$values)){
回显“odbc\u执行失败!”。“\n”;
}否则{
echo“成功:odbc_执行”。“\n”;
}
}
该脚本按预期工作,并在大约5分钟内成功运行了10k insert循环,但我想知道是否有某种方法可以优化该脚本并使其显著加快,因为我的最终目标是比较
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。您应该在循环之前做好准备,它只需要做一次

  • 让Vertica更快的唯一其他方法是使用批处理执行(据我所知,php odbc或pdo不支持)。批处理执行将变成一个更高效的
    COPY
    语句。另一种选择是使用
    COPY
    ,但是你可能必须跳出障碍。如果你真的有很多数据,那么你会想要。这在PHP中是不容易做到的。它将涉及执行vsql或在集群上创建文件


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

    考虑发布到-这是工作代码需要优化的地方,我知道这一点。我的第一个目标是比较插入速度,第二个目标是比较加载速度,希望Vertica能跑得更好MySQL@Greip如果您可以切换到
    复制
    ,它的性能可能会更好。如果使用python,则可以使用vertica_python或vertica提供的新python模块。两者都支持
    复制
    ,并且非常易于使用。否则,您将需要使用
    vsql
    java
    JDBC
    驱动程序还将批处理
    INSERT
    转换为
    COPY