PL/SQL — параметр NOCOPY для повышения производительности

Мне было интересно, как передача NOCOPY в качестве параметра функции может повысить производительность функции, возвращающей SYS_REFCURSOR.

Прочитав документацию Oracle, я прочитал следующее:

This technique can give significant speedup if you are passing back large amounts of data in OUT parameters, such as collections, big VARCHAR2 values, or LOBs.

Поскольку SYS_REFCURSORS — это указатели на набор результатов для запроса, а SELECT — самая быстрая операция в SQL, есть ли какое-то преимущество в передаче такой вещи, как <SYS_REFCURSOR> OUT NOCOPY SYS_REFCURSOR, в функцию?

Я нашел эта тема, но возникают два мнения:

1. Мы можем повысить производительность вызова по ссылке, а не по значению следующим образом:

Procedure (vRefCur OUT NOCOPY SYS_REFCURSOR). 

2 - SYS_REFCURSOR уже является указателем (связь), и для повышения производительности следует оптимизировать оператор SQL.

Как вы думаете?

Заранее спасибо!

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
3
0
789
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Что касается производительности - большой разницы нет.

Когда NOCOPY не указан, Oracle просто создаст другая копия указателя.
Так что если вы не хотите иметь два одинаковых указателя в системе - дайте подсказку NOCOPY.

Большое спасибо! :)

ruifgmonteiro 06.03.2019 13:00

Для SYS_REFCURSOR это не имеет никакого значения. SYS_REFCURSOR — это просто указатель, т.е. размер всего пара байт.

Вы получите разницу за LOB, которая может иметь размер в несколько гигабайт или даже терабайт.

Да, я понимаю! Спасибо :)

ruifgmonteiro 06.03.2019 13:00

Другие вопросы по теме