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