DELETE FROM FLXSTG.CFTB_CONTRACT_CHARGES
WHERE STG_BLK_CD = 'UE' AND DT_INS_STG < to_date('05/06/13','dd/mm/YY') -- 12.627163
alguém tem uma ideia o que eu posso fazer para melhorar a performance?
DELETE FROM FLXSTG.CFTB_CONTRACT_CHARGES
WHERE STG_BLK_CD = 'UE' AND DT_INS_STG < to_date('05/06/13','dd/mm/YY') -- 12.627163
DECLARE
-- Cursor para identificar o rowid (endereco unico) a ser limpo na tabela
-- Rowid seria um endereco unico que localiza o registro na instancia dados
CURSOR CV_LIMPEZA IS
SELECT ROWID FROM <TABELA> WHERE <CONDICOES>;
-- Estou criando uma especie de array aqui
TP_ROWID IS TABLE OF CHAR(18);
RY_ROWID TP_ROWID;
BEGIN
-- Abrindo cursor
OPEN CV_LIMPEZA;
-- Loop de limpeza principal
LOOP
-- Carregando no array 50000 registros (enderecos rowid)
FETCH CV_LIMPEZA BULK COLLECT INTO RY_ROWID LIMIT 50000;
-- Comando FORALL para limpeza massiva dos registros
FORALL I IN 1..RY_ROWID.COUNT
DELETE FROM <TABELA> WHERE ROWID = RY_ROWID(I);
COMMIT;
-- Se chegou ao final do cursor, sai do LOOP
EXIT WHEN CV_LIMPEZA%NOTFOUND;
END LOOP;
-- Fechando o cursor
CLOSE CV_LIMPEZA;
END;
CREATE TABLE myTable2 AS
(SELECT * FROM myTable
WHERE ID IN (o que deseja manter))
TRUNCATE TABLE myTable;
INSERT INTO myTable
(campos preservados)
SELECT (campos preservados)
FROM myTable2
ALTER TABLE <tabela> TRUNCATE SUBPARTITION;
Olá Sergio,stcoutinho escreveu:Cleberz,
Como você mencionou, são 12 milhões de registros que você está tentando executar com um único comando DELETE. Não creio que a limpeza seja instântanea, especialmente se você estiver em modo ARCHIVE.
Talvez você pudesse usar COLLECTIONS para tentar agilizar a limpeza desta tabela. COLLECTIONS funcionam como cursores e podem agilizar o processamento de um volume massivo de dados
Abaixo, segue uma sugestão (rascunho) de como poderia elaborar uma rotina com COLLECTIONS.
Abraços,DECLARE -- Cursor para identificar o rowid (endereco unico) a ser limpo na tabela -- Rowid seria um endereco unico que localiza o registro na instancia dados CURSOR CV_LIMPEZA IS SELECT ROWID FROM <TABELA> WHERE <CONDICOES>; -- Estou criando uma especie de array aqui TP_ROWID IS TABLE OF CHAR(18); RY_ROWID TP_ROWID; BEGIN -- Abrindo cursor OPEN CV_LIMPEZA; -- Loop de limpeza principal LOOP -- Carregando no array 50000 registros (enderecos rowid) FETCH CV_LIMPEZA BULK COLLECT INTO RY_ROWID LIMIT 50000; -- Comando FORALL para limpeza massiva dos registros FORALL I IN 1..RY_ROWID.COUNT DELETE FROM <TABELA> WHERE ROWID = RY_ROWID(I); COMMIT; -- Se chegou ao final do cursor, sai do LOOP EXIT WHEN CV_LIMPEZA%NOTFOUND; END LOOP; -- Fechando o cursor CLOSE CV_LIMPEZA; END;
Sergio Coutinho
EXIT WHEN RY_ROWID.COUNT = 0 .
Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante