Табличные функции
Конвейерные табличные функции
Обзор табличных функций
Табличные функции -- это функции, которые создают коллекцию строк (либо вложенную таблицу, или массив) к которой можно обратиться как к обычной физической таблице БД. Вы можете использовать табличную функцию по имени во фразе FROM запроса.
Табличная функция может принимать коллекцию строк на входе. В качестве такого входного параметра может быть либо тип коллекция либо REF CURSOR.
Выполнение табличной функции может быть параллельной и возвращаемые строки могут передаваться непосредственно к следующему процессу без промежуточной постановки. Строки из коллекции возвращённые табличной функцией могуть быть конвейерными (pipelined) -- т.е. многократно возвращаться, а не партиями.
Потоковое, конвейерное и параллельное выполнение может повысить производительность:
- используя мультипоточность (multithreaded), одновременное выполнение функций таблицы
- исключая промежуточные постановки между процессами
- улучшая время отклика запроса: с неконвейерными табличными функциям вся коллекция возвращяемая табличной функцией должна быть построена и возвращена на сервере пострчно. Конвееризация позволяет возвращать строки многократно. Это также уменьшает объем памяти, который требуется табличной функции, так как в качестве объекта кэш не нужно материализовывать всю коллекцию.
- обеспечивая итератный возврат строк коллекции из табличной функции, вместо ожидания пока вся коллекция установится в памяти или таблицах и только затем вернется.
Типичная обработка данных с непараллельными и неконвейерными табличными функциями |
В противовес покажем как поток и параллельное выполнение может улучшить некоторый сценарий.
Обработка информации с помощью конвейерного и параллельного выполнения |
Табличные функции
Табличные функции возвращают экземпляр типа коллекции и могут быть выбраны подобно таблице, вызвая функцию в фразе FROM запроса. Табличные функции используют служебное слово TABLE.
Тип коллекция BookSet_t определяется так:
CREATE TYPE Book_t AS OBJECT ( name VARCHAR2(100), author VARCHAR2(30), abstract VARCHAR2(1000)); CREATE TYPE BookSet_t AS TABLE OF Book_t;Тип данных CLOB хранится в таблице Catalogs:
CREATE TABLE Catalogs ( name VARCHAR2(30), cat CLOB);Функцию GetBooks определим следующим образом:
CREATE FUNCTION GetBooks(a CLOB) RETURN BookSet_t;
Следующий запрос вернет весь каталог и соответсвующий список книг.
SELECT c.name, Book.name, Book.author, Book.abstract FROM Catalogs c, TABLE(GetBooks(c.cat)) Book;
Конвейерные табличные функции
Данные называются конвейерными если они потребляются потребителями (преобразуются), как только производитель (преобразование) создает их, не будучи записи в таблицы или кэш, перед началом следующего преобразования.
Конвейер позволяет табличной функции вернуть строки быстрее, а также, могут уменьшить объем памяти, необходимый для кэширования результатов табличной функции.
Конвейерная табличная функция может возвращать результат сбора табличной функции в подмножества.
Возвращенная коллекция ведет себя как поток, который может быть извлечен по запросу. Это делает возможным использование табличных функций как виртуальных таблиц.
Конвеерные табличные функции могут быть сделаны двумя путями:
- Нативный PL/SQL подход: потребитель и производитель могут работать на отдельный нитях исполнения (либо в том же или другом контексте процесса) и общаться через поток (pipe) или обслуживающий механизм. Такой подход подобен обычному выполнению.
- Интерфейсный подход: потребитель и производитель работают на одном и том же потоке исполнения. Производитель явно возвращяет управление обратно потребителю после производства набора результатов. Кроме того, производитель кэширует текущее состояние, чтобы он мог возобновить процесс с того места, где был прерван, когда потребитель вызывет его снова.
Интерфейсный подход требует от вас осуществления ряда чётко-определённых интерфейсов в процедурных языках.
Источник.
Комментариев нет:
Отправить комментарий