Fórum Melhorar desempenho procedure #405188

18/07/2011

0

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

Responder

Posts

18/07/2011

Marco Pinheiro

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.
Responder

Gostei + 0

18/07/2011

Ricardo Albano

Valeu, vou testar
Responder

Gostei + 0

19/07/2011

Ricardo Albano

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.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar