Запрос администратора базы данных не имеет смысла.
Администратор почти наверняка думает о том, что он хочет минимизировать количество сдвигов контекста механизма SQL в PL / SQL, которые происходят при извлечении данных.от курсора.Но предлагаемое решение плохо нацелено на эту конкретную проблему и создает другие гораздо более серьезные проблемы с производительностью в большинстве систем.
В Oracle смещение контекста с SQL на PL / SQL происходит, когда виртуальная машина PL / SQLзапрашивает у виртуальной машины SQL дополнительные данные, виртуальная машина SQL отвечает, выполняя оператор, чтобы получить данные, которые затем упаковывает и передает обратно в виртуальную машину PL / SQL.Если подсистема PL / SQL запрашивает строки по одной за раз, и вы извлекаете много строк, возможно, что эти сдвиги контекста могут составлять значительную долю вашего общего времени выполнения.Для решения этой проблемы Oracle ввела концепцию массовых операций, по крайней мере, в течение 8 дней.Это позволило виртуальной машине PL / SQL запрашивать несколько строк одновременно с виртуальной машины SQL.Если виртуальная машина PL / SQL запрашивает 100 строк за раз, вы устранили 99% сдвигов контекста, и ваш код потенциально может работать намного быстрее.
После введения массовых операций появилось много кода, которыйможет быть реорганизован для повышения эффективности путем явного использования операций BULK COLLECT
вместо выборки построчно и последующего использования циклов FORALL
для обработки данных в этих коллекциях.Однако к 10.2 дням Oracle объединила массовые операции в неявные циклы FOR
, поэтому неявный цикл FOR
теперь автоматически массово собирает пакеты по 100, а не извлекает строку за строкой.
В вашемОднако в этом случае, поскольку вы возвращаете данные клиентскому приложению, использование массовых операций гораздо менее значимо.Любой достойный API на стороне клиента будет иметь функциональность, позволяющую клиенту указывать, сколько строк нужно извлечь из курсора в каждом цикле обхода сети, и эти запросы на выборку будут идти непосредственно на виртуальную машину SQL, а не через PL/ SQL VM, поэтому нет никаких сдвигов контекста SQL в PL / SQL, о которых стоит беспокоиться.Ваше приложение должно заботиться о получении соответствующего количества строк в каждом цикле - достаточно, чтобы приложение не становилось слишком болтливым и узким местом в сети, но не настолько, чтобы вам приходилось слишком долго ждать, пока результаты не будутвозвращено или для хранения слишком большого объема данных в памяти.
Возврат коллекций PL / SQL, а не REF CURSOR, в клиентское приложение не приведет к уменьшению количества происходящих изменений контекста.Но у него будет множество других недостатков, не последним из которых является использование памяти.Коллекция PL / SQL должна храниться целиком в глобальной области процесса (PGA) (при условии подключения к выделенному серверу) на сервере базы данных.Это кусок памяти, который должен быть выделен из оперативной памяти сервера.Это означает, что серверу нужно будет выделить память для выборки каждой последней строки, которую запрашивает каждый клиент.Это, в свою очередь, резко ограничит масштабируемость вашего приложения и, в зависимости от конфигурации базы данных, может украсть ОЗУ из других частей базы данных Oracle, что будет очень полезно для повышения производительности приложений.И если у вас закончится пространство PGA, ваши сеансы начнут получать ошибки, связанные с памятью.Даже в приложениях, основанных исключительно на PL / SQL, вы никогда не захотите извлекать все данные в коллекции, вам всегда нужно извлекать их небольшими партиями, чтобы минимизировать количество используемой PGA.
Кроме того, загрузка всех данных в память заставит приложение работать намного медленнее. Практически любой фреймворк позволит вам извлекать данные по мере необходимости, например, если у вас есть отчет, отображаемый на страницах по 25 строк каждая, вашему приложению потребуется только извлечь первые 25 строк, прежде чем рисовать первый экран. И ему никогда не придется выбирать следующие 25 строк, если пользователь случайно не запросит следующую страницу результатов. Однако, если вы извлекаете данные в массивы, как предлагает ваш администратор базы данных, вам придется извлечь все строки, прежде чем приложение сможет начать отображать первую строку, даже если пользователь никогда не хочет видеть больше, чем первая горстка строк. Это будет означать гораздо больше операций ввода-вывода на сервере базы данных для извлечения всех строк, больше PGA на сервере, больше оперативной памяти на сервере приложений для буферизации результата и более длительное ожидание сети.