Michał Kowalski Bazy danych
Temat: [Orcale] Usuwanie rekordów za pomocą skryptu z indeksem
Witam,muszę usunąć ok 3,7 mln rekordów z tabeli.
Dla bezpieczeństwa chcę je usuwać po 1000 sztuk z każdorazowym zatwierdzeniem transakcji.
Dla przyśpieszenia operacji chciałem również założyć indeks na pola.
Poniżej jest skrypt, który moim zdaniem powinien to "ogarnąć".
Prośba do osób, które mają doświadczenie w tej materii o rzucenie okiem i ewentualne zasugerowanie zmian jeśli wydałyby się Wam konieczne.
prompt
prompt 'create temp index'
declare
begin
execute immediate 'create index tmp_idx_all on cct_contacts(con_id, con_channel, con_direction, con_audit_cu, con_other_result, trunc(con_contact_date))';
end;
/
prompt
prompt 'delete row'
BEGIN
FOR i IN 1..3730 LOOP
DELETE FROM ib_crm_cc.cct_contacts
WHERE con_channel in ('SMS','EML') and con_direction ='OUT' and con_audit_cu='ftp'
and con_other_result not in ('Zapytanie','informacja','informacja o karcie')
and con_id NOT in ('3519769','1987482','1653456')
and trunc(CON_CONTACT_DATE) <= to_date('2012-07-26', 'yyyy-mm-dd') AND rownum <= 1000;
COMMIT;
END LOOP;
END;
prompt
prompt 'delete tem index'
declare
begin
execute immediate 'drop index tmp_idx_all';
end;
/
Najwięcej obaw mam do indeksów.
con_channel (mogą wystąpić tylko 5 wartości EML, SMS, PHO, LST i FAX 80% rekordów tabeli ma znacznik SMS i EML różne od null)
con_direction (mogą wsytapić tylko dwie wartosci 'IN' i 'OUT' różne od null)
con_audit_cu (najczęsciej 'ftp' ok 10% rekordów ma jeden z kilkudziesięciu loginów)
con_other_result (ok kilkadziesiąt różnych nazw)
con_id - niepowtarzalne, numeryczne
CON_CONTACT_DATE (typu data - data w przypadku 80% rekordów jest jedną z kilkudziesięciu powtarzających się wartości, pozostałe 20% ok 900 tys. rekordów ma losowe/zróżnicowane daty)
Dlaczego piszę o tym co jest w polach?
Zastanawiam się tylko czy z uwagi na niewielką liczbę unikalnych wartości w polach np. CON_DIRECTION nie użyć indeksu BITMAP oraz standardowo B-Tree dla pola CON_ID i trunc(con_contact_date)
execute immediate 'create index tmp_idx_others on cct_contacts(con_id, trunc(con_contact_date))';
execute immediate 'create BITMAP index tmp_idx_bit on cct_contacts(con_channel,con_direction,con_audit_cu,con_other_result)';
Które rozwiązanie będzie szybsze?
A może inaczej to zrobić?Michał Kowlaski edytował(a) ten post dnia 02.11.12 o godzinie 15:43