2013-06-13 10 views
0

Я хочу понять использование и необходимость в массовых сборах forall заявлений.объемный сбор ... для всех видов использования

В качестве примера упоминается here

В большинстве примеров в различных веб-страниц; авторы сначала извлекают данные из таблицы, используя операции массового сбора. После этого они вставляют его в целевую таблицу, используя оператор forall.

DECLARE 
TYPE prod_tab IS TABLE OF products%ROWTYPE; 
products_tab prod_tab := prod_tab(); 
BEGIN 
-- Populate a collection - 100000 rows 
SELECT * BULK COLLECT INTO products_tab FROM source_products; 

FORALL i in products_tab.first .. products_tab.last 
INSERT INTO target_products VALUES products_tab(i); 

Но я не понимаю, когда выбрать этот метод. Я думаю, что могу написать код, как показано ниже:

INSERT INTO target_products 
SELECT * FROM SOURCE_PRODUCTS; 

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

Итак, почему нам нужно выбирать навалом сбор forall заявления? Для регистрации ошибок или любых других преимуществ?

ответ

3

Если вы можете реализовать свое требование в соответствии с пунктом INSERT INTO SELECT, вам даже не нужно использовать операторы forall и bulk collect. Существует поговорка: «, если вы можете сделать это в SQL, сделайте это в SQL».

Но в некоторых ситуациях вам может потребоваться обработать данные по строкам, что может заставить вас закодировать цикл. Это на самом деле ужасно, это означает, что ваши операции в этом цикле будут выполняться как отдельные операторы над концом. Но если вы используете forall, механизм PL/SQL запустит ваш цикл в режиме набора, что даст вам реальное повышение производительности.

1

Ну, ответ на ваш вопрос «когда все это возможно!».

Проблема с вашим вопросом заключается в том, что в описанном вами сценарии вам даже не нужен PLSQL.

forall предназначен для ситуаций, когда вам необходимо выполнить некоторые операции с plsql на данных, которые вы получили, прежде чем вставлять их в целевую таблицу. в этом случае у вас будет большой объем данных в коллекции plsql, которую вы захотите вставить в таблицу целей. это то, что для forall, и это намного эффективнее, чем вставить в цикл.

0

Всякий раз, когда мы отправляем PL/SQL-блоки в сервер oracle, всегда выполняются инструкции SQL. Через SQL-движок и также выполняются процедурные инструкции. Через обработчик процедур. Этот процедурный оператор-исполнитель доступен в PL/SQL-движке, всякий раз, когда мы используем большую загрузку через SQL, PL/SQL-операторы, всегда сервер oracle выполняет эти инструкции отдельно через эти механизмы. Этот тип методологии исполнения всегда использует методологию исполнения переключения контента, что снижает производительность приложения. Чтобы преодолеть эту проблему, оракул представил процесс «массового связывания» с использованием коллекций, то есть в этом методе сервер oracle выполняет все SQL-запросы за раз.

  1. выберите ... в ... п
  2. курсор принести заявление
  3. DML возвращающихся положений

PL/SQL Bulk Сбора и Bulk привязка

Для получения дополнительной информации >>>>>> >http://www.oraappdata.com/2017/02/plsql-bulk-collect-and-bulk-bind.html

Смежные вопросы