Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (PHP+Oracle+SYS_REFCURSOR) Многократное падение скорости при фетченге!!! / 2 сообщений из 2, страница 1 из 1
12.01.2013, 02:33
    #38107329
serji0
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(PHP+Oracle+SYS_REFCURSOR) Многократное падение скорости при фетченге!!!
Клиент: Windows 7 + Oracle InstantClient 11.2.0 + PHP 5.4.3 + php_oci8_11g
Сервер: Oracle Database 10g Release 10.2.0.5.0

В базе есть процедура
Код: plsql
1.
PROCEDURE TestProc(cur OUT SYS_REFCURSOR, id IN NUMBER)


которая возвращает
Код: plsql
1.
SELECT * FROM TestTable WHERE id = :id


Цель - выбрать записи из процедуры, используя PHP.

Делаю строго по букварю:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
//запрашиваю идентификатор курсора
$q_cursor = oci_parse($db, "select TestProc(1) from dual");
oci_execute($q_cursor);
//запрашиваю данные
$q_data = oci_fetch_array($q_cursor, OCI_NUM+OCI_RETURN_NULLS);
$q_data = $q_data[0];
oci_set_prefetch($q_data, 1000);
oci_execute($q_data);

//фетчу все строки и замеряю время
$t1 = microtime(true);
while (oci_fetch_array($q_data, OCI_ASSOC+OCI_RETURN_NULLS)) {}
$t2 = microtime(true);


При этом время фетчинга 1400 записей составляет непомерные 13,5 секунд, т.е. одна запись фетчится около 10 миллисекунд.

Пробую напрямую:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
//запрашиваю данные
$q_direct = oci_parse($db, "select * from TestTable where id = 1");
oci_execute($q_direct);

//фетчу все строки и замеряю время
$t3 = microtime(true);
while (oci_fetch_array($q_direct, OCI_ASSOC+OCI_RETURN_NULLS)) {}
$t4 = microtime(true);


В результате все 1400 записей влетают за 30 миллисекунд.

Разница в скорости в 450(!) раз. Но ведь так не должно быть?

Кстати, sqlplus не делает разницы между первым и вторым вариантом - обрабатывает за 30-50 миллисекунд и первый и второй запросы, фетча при этом все 1400 записей.

Игрища с платформой, версиями php и ораклавского клиента проводил: результат тот-же.

Где копать? Что делать?
...
Рейтинг: 0 / 0
12.01.2013, 13:29
    #38107467
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(PHP+Oracle+SYS_REFCURSOR) Многократное падение скорости при фетченге!!!
Код: php
1.
$q_cursor = oci_parse($db, "select TestProc(1) from dual");


а с каких пор оракловые процедуры так вызываются?
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (PHP+Oracle+SYS_REFCURSOR) Многократное падение скорости при фетченге!!! / 2 сообщений из 2, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]