php中的Oci比occi快得多?

时间:2011-05-09 07:45:13

标签: c++ oracle

为什么下面的代码在php(oci)中比c ++(occi)更快? 对于50k行,php在30s内执行脚本。程序在5分钟内执行!

/* php - oci code */
$s = oci_parse($c, 'select "client" from test');
oci_execute($s, OCI_DEFAULT);  

while ($row = oci_fetch_array($s, OCI_ASSOC+OCI_RETURN_NULLS)) 
{
    $i++;
    if ($i%1000 == 0) echo $i.' '.$row['client'].PHP_EOL;
}
/* c++ occi code */
string q("select client from test");
ora_stmt = ora_conn->createStatement (q);

ora_stmt->setPrefetchRowCount(1000);  // THIS IS AN ANSWER

ResultSet *rset = ora_stmt->executeQuery();
while (rset->next ())
{
    i++;
    if (i%1000 == 0) cout << i << endl;
}

有什么方法可以改善环境?

我的回答:

ora_stmt->setPrefetchRowCount(1000);

2 个答案:

答案 0 :(得分:4)

通过文档的快速浏览揭示了上面提到的@unapersson可能是正确的,一旦你构造了Statement,在执行查询之前,可能值得玩下面的设置:

  

setPrefetchMemorySize()

     

设置将要的内存量   由OCCI内部使用来存储数据   在每次往返旅程中取得   服务器

     

setPrefetchRowCount()

     

设置将包含的行数   每次都由OCCI内部提取   往返服务器。

我的印象是,对next()的每次调用都可能触发到服务器的往返。

答案 1 :(得分:1)

我不懂PHP,所以我不能在那方评论。在C ++方面,你在每次写入后刷新输出流,这可能是很多不需要的刷新。移除endl并使用'\n'并再次测试:

if ( i % 1000 == 0 ) cout << i << '\n';