Mam dwa stoły. Nazwijmy je KEY i VALUE.
KLUCZ jest mały, zawiera około 1.000.000 rekordów.
VALUE jest ogromne, powiedzmy 1.000.000.000 rekordów.Usuwanie ogromnych ilości danych z ogromnego stołu
Pomiędzy nimi jest połączenie takie, że każdy KLUCZ może mieć wiele WARTOŚCI. To nie jest klucz obcy, ale w zasadzie to samo znaczenie.
DDL wygląda to
create table KEY (
key_id int,
primary key (key_id)
);
create table VALUE (
key_id int,
value_id int,
primary key (key_id, value_id)
);
Teraz mój problem. Około połowa wszystkich identyfikatorów key_ids w VALUE została usunięta z KEY i muszę je usunąć w uporządkowany sposób, podczas gdy obie tabele nadal znajdują się pod dużym obciążeniem.
byłoby łatwe do zrobienia
delete v
from VALUE v
left join KEY k using (key_id)
where k.key_id is null;
Jednak, jako że nie wolno mieć limit
na multi tabeli usuwać Nie podoba mi się takie podejście. Takie usuwanie trwałoby kilka godzin, a to uniemożliwia dezaktywację usunięć.
Innym rozwiązaniem jest utworzenie kursora, aby znaleźć wszystkie brakujące identyfikatory key_ids i usunąć je jeden po drugim z ograniczeniem. Wydaje się to bardzo powolne i rodzajem odwrotu.
Czy są jeszcze jakieś opcje? Jakieś fajne sztuczki, które mogłyby pomóc?
Dzięki.
Czasami "GDZIE NIE ZNAJDUJE SIĘ" jest szybsze niż "LEWY DOŁĄCZ [...] JEST NIŻĄ", ale nie jest w tym przypadku pewne (http://stackoverflow.com/questions/6777910/sql-performance-on-left -outer-join-vs-not-exists). Mam nadzieję, że to pomoże! –
masz na myśli to, że już usunąłeś klucze, a teraz chcesz usunąć wpisy osierocone w VALUE, prawda? – newtover
W porządku, przynajmniej to byłby dokładnie ten sam problem :) –