OCI в PHP гораздо быстрее, чем Occi? - PullRequest
2 голосов
/ 09 мая 2011

почему код ниже в php (oci) быстрее, чем c ++ (occi)?Для 50k строк php выполнить скрипт за 30 секунд.Программа выполняется через 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 ]

4 голосов
/ 09 мая 2011

Быстрое сканирование документов показывает, что @unapersson, упомянутый выше, может быть правильным, после того как вы построили Statement, перед выполнением запроса, возможно, стоит поиграть со следующими настройками:

setPrefetchMemorySize()

Установите объем памяти, который будет используется внутренне OCCI для хранения данных выбирается во время каждой поездки в сервер.

setPrefetchRowCount()

Установите количество строк, которые будут извлекается изнутри OCCI во время каждого туда и обратно на сервер.

У меня сложилось впечатление, что в нынешнем виде каждый вызов next() может вызывать обратную передачу на сервер.

1 голос
/ 09 мая 2011

Я не знаю PHP, поэтому я не могу прокомментировать эту сторону.Что касается C ++, вы очищаете поток вывода после каждой записи, что может быть хорошим значением ненужных очисток.Удалите endl и используйте '\n' и протестируйте снова:

if ( i % 1000 == 0 ) cout << i << '\n';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...