(PHP) Скорость отработки SQL запроса.

Sslimx
Дата: 11.09.2006 13:19:19
Существует скрипт, который запускает процедуру на оракле и выдает грид с ответом.
Так вот если выполнить эту процедуру например из PL\SQL девелопера, то она отрабатывает меньше секунды.
А если запускаешь скрипт, то команда ociexecute($stmt); может отрабатывать и минуту и больше.
Хотя замечено что с каждым последующим запуском процедуры (даже с разными параметрами) из скрипта, сокращается время её выполнения.

Где проблемма?
Куда копать?
+
Дата: 11.09.2006 18:38:21
текст запроса в студию
pamir
Дата: 11.09.2006 19:18:54
Sslimx
Так вот если выполнить эту процедуру например из PL\SQL девелопера, то она отрабатывает меньше секунды.

Девелопер не фетчит все строки. Строк много?

Sslimx
А если запускаешь скрипт, то команда ociexecute($stmt); может отрабатывать и минуту и больше.
Хотя замечено что с каждым последующим запуском процедуры (даже с разными параметрами) из скрипта, сокращается время её выполнения.

Похоже, что с каждым запуском у вас запрос и данные попадают в кэш оракла, поэтому и увеличивается скорость.
Sslimx
Дата: 12.09.2006 13:00:57
+
текст запроса в студию


$curs = ocinewcursor($conn);

$SQL = "begin mon.vinn.SEARCH_KLNF('$inn','$f','$i','$o',to_date('$bdate','dd.mm.yyyy'),:data,:cod,:msg); end;";

$stmt = ociparse($conn, $SQL);

ocibindbyname($stmt, "data", $curs, -1, OCI_B_CURSOR);
ocibindbyname($stmt, "cod", $cod, 1024);
ocibindbyname($stmt, "msg", $msg, 4096);

ociexecute($stmt);

Вот последняя команда и тормозит...

2pamir
Возвращаемый курсор максимум - 4 строки, обычно одна.

Зависимость скорости выполнения первого раза от размера возвращаемых данных или от входящих данных не замечена.

Да, на кэш оракла похоже, но встает вопрос, почему из девелопера выполняется сразу быстро?
Гутманс
Дата: 13.09.2006 09:52:12
Sslimx
+
текст запроса в студию


$curs = ocinewcursor($conn);

$SQL = "begin mon.vinn.SEARCH_KLNF('$inn','$f','$i','$o',to_date('$bdate','dd.mm.yyyy'),:data,:cod,:msg); end;";

$stmt = ociparse($conn, $SQL);

ocibindbyname($stmt, "data", $curs, -1, OCI_B_CURSOR);
ocibindbyname($stmt, "cod", $cod, 1024);
ocibindbyname($stmt, "msg", $msg, 4096);

ociexecute($stmt);

Вот последняя команда и тормозит...

2pamir
Возвращаемый курсор максимум - 4 строки, обычно одна.

Зависимость скорости выполнения первого раза от размера возвращаемых данных или от входящих данных не замечена.

Да, на кэш оракла похоже, но встает вопрос, почему из девелопера выполняется сразу быстро?

Лучше переписать или как-то обернуть SEARCH_KLNF по-другому, чтоб обойтись без бинденья возвращаемых данных. Возможно, если подумать можно реализовать механизм возврата данных аля селект, а запрос сформировать как обычную строку (Oracle-то поймет и PHP не будет напрягаться).
Sslimx
Дата: 14.09.2006 12:30:57
Дело в том, что я имею доступ только к определенным процедурам на оракле.

Select запрещен из всех таблиц.

К тому же процедура отрабатывает быстро.
Нет смысла в ней что то менять.