Melhorar desempenho procedure
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
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
Curtidas 0
Respostas
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.
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
18/07/2011
Valeu, vou testar
GOSTEI 0
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.
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