Melhorar desempenho procedure

Oracle

18/07/2011

Olá,
Estou executando uma procedure para inserir dados de outra tabela. Leio o cursor da tabela e conforme os dados incluo na nova tabela.Até tudo bem, a tabela tem aproximadamente 1 milhão de registro, mas a inclusão esta rápida. 
O problema é que terei que incluir uma verificação se os dados já existem, ou seja, antes de incluir devo verificar se os mesmos já existem.  Quando faço esta verificação fica muito lento.
Já tentei:
1ªbegin  select nome into varnome from tab1 where data = vardata e codigo = varCodigo;  exception    when data no found then        insert .....end
2ª  select count(nome) into varx from tab1 where data = vardata e codigo = varCodigo;  if varx <> 0 then     insert ......  end;

Já criei um ínidice com os campos data e codigo, mas aí dá erro na procedure, não inseri.
Alguém tem alguma sugestão?
Fico no aguardo,
Ricardo
Ricardo Albano

Ricardo Albano

Curtidas 0

Respostas

Marco Pinheiro

Marco Pinheiro

18/07/2011

As vezes se vc tentar usar o MERGE possa ajudar.

Segue abaixo um exemplo que achei na net:


CREATE TABLE TEST (
ID NUMBER,
a VARCHAR2(10),
b VARCHAR2(10),
CONSTRAINT pk_test PRIMARY KEY (ID) );

MERGE INTO TEST t
USING (SELECT 1 ID, 'a' a, 'b' b FROM dual) new_row
ON (t.id = new_row.id)
WHEN MATCHED THEN
UPDATE SET t.a = new_row.a,
           t.b = new_row.b
WHEN NOT MATCHED THEN
INSERT (ID, a, b) VALUES (new_row.id, new_row.a, new_row.b);


MERGE INTO TEST t
USING (SELECT 1 ID, 'x' a, 'y' b FROM dual) new_row
      ON (t.id = new_row.id)
WHEN MATCHED THEN
UPDATE SET  t.a = new_row.a,
            t.b = new_row.b
WHEN NOT MATCHED THEN
INSERT (ID, a, b) VALUES (new_row.id, new_row.a, new_row.b);

Att.,

Marco.
GOSTEI 0
Ricardo Albano

Ricardo Albano

18/07/2011

Valeu, vou testar
GOSTEI 0
Ricardo Albano

Ricardo Albano

18/07/2011

Olá,
Testei o merge, mas não consegui fazer funcionar. Pois tenho que testar e gravar na mesma tabela.
Fiz alguns tipos de merge:

         merge into tabela exemplo         using tabela exemplo2         on  (exemplo.data  = A          and  exemplo.codigo = B)         when not matched then

         merge into tabela exemplo         using (select data, codigo from tabela                where  data  = A                 and    codigo = B) exemplo2         on  (exemplo.data  = exemplo2.data          and  exemplo.codigo = exemplo2.codigo)         when not matched then

         merge into tabela exemplo         using (select data, codigo from tabela) exemplo2         on  (exemplo2.data  = A          and  exemplo2.codigo = B)         when not matched then


         merge into tabela exemplo         using (select exemplo3.sequencial from tabela exemplo3                where  exemplo3.data  = A                 and    exemplo3.codigo = B) exemplo2         on  (exemplo.sequencial  = exemplo2.sequencial)         when not matched then

         merge into tabela exemplo         using (select * from tabela) exemplo2         on  (exemplo.data  = A          and  exemplo.codigo = B)
Mas não funciona. Não inclui o registro.Vale lembrar que os campos DAta e codigo, são os dois campos que me possibilitam verificar a existência do registro. O sequencial é a PK.
GOSTEI 0
POSTAR