Возвращает ли курсоры быстрее? - PullRequest
3 голосов
/ 22 июня 2011

При использовании хранимой процедуры быстрее вернуть курсор назад? или это быстрее использовать параметр выходных данных типа данных. или это действительно не будет иметь никакого различия в производительности.

PROCEDURE SPUSINGCURSOR ( input1 INT,
                          retcursor out sys_refcursor ) IS
BEGIN

  OPEN retcursor FOR
    SELECT var1,
           var2,
           var3
      FROM Table_Vlaues
     WHERE var1 = input1
  ORDER BY var1;

END;

1 Ответ

7 голосов
/ 22 июня 2011

Зависит от многих вещей.

Если вы выполняете запрос в SP и возвращаете вложенный тип таблицы, содержащий результаты, SP потребуется время для запуска и использования памяти, необходимой для хранения данных. Также потребуется отправить все эти данные клиенту за один раз, что займет некоторое время. Но если вам нужно получить доступ ко всем данным, прежде чем делать что-то еще, а требования к памяти не слишком велики, это разумный способ сделать что-то.

Если вместо этого открыть и вернуть REF CURSOR, фактическое время выполнения SP и требуемая память будут меньше; но вы просто откладываете время выполнения на потом, когда извлекаете из курсора. Если есть хороший шанс, вам не нужно извлекать все строки; или если набор данных, вероятно, будет очень большим; или если выборка строк небольшими партиями позволяет вам выполнять какую-то другую значимую промежуточную работу (например, направлять их в другой поток или процесс, который на самом деле что-то с ними делает), то это может быть лучшим вариантом. Основным недостатком возврата курсора является то, что выборка из него, вероятно, потребует большего количества сетевых обращений, что в целом может быть медленнее, чем просто возврат данных сразу.

Неэффективное возвращение открытого REF CURSOR заключается в том, что с ним легче работать в некоторых клиентских средах (например, в JDBC он сопоставляется непосредственно с ResultSet, тогда как для типа вложенных таблиц вам необходимо выполнить дополнительную работу для предоставить Java информацию о типе).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...