четверг, 23 сентября 2010 г.

13 использований конвейерных и параллельных табличных функций

Обзор табличных функций
Табличные функции
Конвейерные табличные функции


Обзор табличных функций

Табличные функции -- это функции, которые создают коллекцию строк (либо вложенную таблицу, или массив) к которой можно обратиться как к обычной физической таблице БД. Вы можете использовать табличную функцию по имени во фразе 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) или обслуживающий механизм. Такой подход подобен обычному выполнению.
  • Интерфейсный подход: потребитель и производитель работают на одном и том же потоке исполнения. Производитель явно возвращяет управление обратно потребителю после производства набора результатов. Кроме того, производитель кэширует текущее состояние, чтобы он мог возобновить процесс с того места, где был прерван, когда потребитель вызывет его снова.

Интерфейсный подход требует от вас осуществления ряда чётко-определённых интерфейсов в процедурных языках.


Источник.

Комментариев нет:

Отправить комментарий