Оптимизация фетчинга курсора

StUV

Rotaredom
Оптимизация фетчинга курсора

Возник трабл с временем выполнения скрипта - при стягивании большого количества записей время на oci_fetch_assoc в цикле занимает до 99% выполнения всего кода вытягивания данных:

общее время выборки 1000 записей ~1,145 сек
из них 0,019 сек на oci_execute процедуры, остальное на fetch
Фактически время на один fetch ~0.001 сек - но при выборке 10 тыс записей это уже 10 сек...

Единственной очевидно-возможный вариант оптимизации отпал после
http://phpclub.ru/talk/showthread.php?s=&threadid=70926&rand=0
(так это сейчас или нет - но соотношение времен выполнения с oci_set_prefetch осталось тем же)

oci_fetch_all так же не дал какого-либо ускорения выборки

Знает ли кто-нибудь варианты настройки сервера/клиента/пхп для оптимизации выборки?

Всем спасибо.
 

Falc

Новичок
StUV
Фетч записей в оракле - это обычно не только пересылка записей от базы к клиенту, но и выбарка этих самых записей (грубо говоря исполнение запроса)

Для того что бы проверить что тормозит именно фетч, напиши pl/sql блок:
Код:
Begin
  For x In (SQL) Loop
    Null;
  End Loop;
End;
Если время выполнения такого кода, такое же как и фетч из под ПХП, то тебе надо оптимизировать запрос.

-~{}~ 12.10.06 18:25:

Если все-таки проблема в фетче, то могу порекомендовать следующие вариаты:
1. Попробовать разобраться с prefetch'ем для курсоров (мне не удалось).
2. Уйти от курсоров и выполнять прямой запрос из ПХП (в таком варианте prefetch нормально работает)
3. А зачем тебе столько записей фетчить на клиента?
 

StUV

Rotaredom
1. мне уж вряд ли, да и времени на это нет...
2. - без вариантов - зпрещено "регламентом разработки" =)

3.
в дерево (pid => id) добавляется новый узел (в любое место)
для перестройки кеша на стороне веб-сервера требуется вытянуть с базы все узлы дерева и перестроить с учетом некоторых фильтров на значения узлов поддерева, в которое попадает узел...

в выборке селект строящий дерево и сохраняющий его в виде линейного списка записей, отсортированного по pid/modif_time

не думаю, что стянуть записи простым select * и построить дерево средствами пхп будет быстрее...
 

Falc

Новичок
Ты провел тест что я привел выше и убедился что тормозит именно фетч?

Если это так, то остается:
1. Смириться.
2. Все таки уйти от курсоров, например написав специальную вьюху, и сделав простой селект из нее на клиенте, тогда логика все равно останется на оракле.
 

StUV

Rotaredom
Falc
1. спасибо за советы
тест обязательно сделаем на след неделе - щас времени нет... даже на это ;)

2. просто нереально =)
 
Сверху