terça-feira, 15 de fevereiro de 2011

Operador FORALL

PL / SQL operador forall velocidades 30x mais rápido para inserções de tabelas

A carga de uma tabela Oracle a partiz de uma matriz envolve trocas de contexto que são muito demoradas, com o operado FORALL a velocidade de gravação é 30x mais rápida.

Veja abaixo um exemplo:

 

-- Criando a tabela products

create table products  (product_id varchar2(20),

                        product_name varchar2(20),

                        effective_date varchar2(20))

 

-- Alimentando convencionalmente a tabela

declare

x  number;

begin

  for x in 1..10000

  loop

    insert into products values (x, 'teste', dbms_utility.get_time);

  end loop;

  commit;

end;

 

--

DECLARE

  -- Declaro o tipo prod_tab como sendo a tabela products

  TYPE prod_tab IS TABLE OF products%ROWTYPE;

 

  -- Defino o array a ser utilizado

  products_tab   prod_tab := prod_tab();

 

  start_time  number; 

  end_time    number;

BEGIN

  -- Populo o array com os dados da tabela products

  SELECT * BULK COLLECT INTO products_tab FROM products;

  

  -- Trunco a tabela apenas para teste

  EXECUTE IMMEDIATE 'TRUNCATE TABLE products';

  Start_time := DBMS_UTILITY.get_time;

 

  -- Populo a tabela products com um insert convencional

  FOR i in products_tab.first .. products_tab.last LOOP

   INSERT INTO products (product_id, product_name, effective_date)

     VALUES (products_tab(i).product_id, products_tab(i).product_name,

             products_tab(i).effective_date);

  END LOOP;

 

  end_time := DBMS_UTILITY.get_time;

  DBMS_OUTPUT.PUT_LINE('Conventional Insert: '||to_char(end_time-start_time));

  

  -- Trunco a tabela apenas para teste

  EXECUTE IMMEDIATE 'TRUNCATE TABLE products';

  Start_time := DBMS_UTILITY.get_time;

 

  -- Populo a tabela products utilizando o forall e as informações da coleção Bulk

  FORALL i in products_tab.first .. products_tab.last

   INSERT INTO products VALUES products_tab(i);

  

  end_time := DBMS_UTILITY.get_time;

  DBMS_OUTPUT.PUT_LINE('Bulk Insert: '||to_char(end_time-start_time));

  COMMIT;

END;

Mais um exemplo

 

create table tobjecttable as

select * from all_objects  where 1=0

/

declare

       type tobjecttable is table of all_objects%rowtype;

       objecttable$ tobjecttable;

      

begin

       select * bulk collect into objecttable$ from all_objects;

      

       forall x in objecttable$.first..objecttable$.last

                insert into t1 values objecttable$(x);

end;

Nenhum comentário :

Postar um comentário

Related Posts Plugin for WordPress, Blogger...