Chcę poznać najbardziej efektywny sposób aktualizowania każdego wiersza w bardzo dużej tabeli Oracle dla jednej kolumny. Na przykład:
update mytable set mycolumn=null;
lub:
update mytable set mycolumn=42;
Moja wiedza może być bardzo nieaktualna. To, co robię, to zmieniam tabelę, aby upuścić kolumnę. Następnie zmieniam tabelę, aby dodać kolumnę z domyślną wartością nowej wartości, której chcę użyć. Następnie zmieniam tabelę, aby usunąć domyślną wartość dla kolumny. Uważam, że jest to o wiele szybsze niż uruchamianie aktualizacji, ale mam wrażenie, że istnieje lepsza metoda.
Odpowiedzi:
Wiele zależy od innych działań wykonywanych przeciwko tej tabeli podczas wykonywania tej masowej aktualizacji. Mam nadzieję, że masz jakieś środowisko testowe, w którym możesz uruchomić próbki tego, co chcesz zrobić i dowiedzieć się, który sposób jest najlepszy. Spróbowałbym:
update table set column_name = blah
;updating the column=blah
a także zatwierdzać każdą aktualizację X (być może 10000). Możesz zrównoleglić ten kod, kopiując go i kopiując, wykonując osobną sekcję kluczy podstawowych.Mieliśmy bardzo podobny problem z tabelą, która była bardzo aktywnie wykorzystywana w systemie OLTP i byliśmy w stanie zrównoleglić ją 5 razy i działaliśmy bez wpływu użytkownika na blokowanie tabeli wierszy o wielkości 100+ MM co 10000. Nie powiedziałeś, jak duży stół lub rodzaj aplikacji, którą uruchamiasz, ale tego rodzaju rozwiązanie może ci pasować.
źródło
Aby szybko
UPDATE
, upewnij się, że nie masz żadnych wyzwalaczy, które strzelają.Pamiętaj, aby ponownie włączyć tylko te, które chcesz, kiedy skończysz.
Być może natrafiłeś na ogólne koszty utrzymania indeksu. Spróbuj odbudować swoje indeksy osobno. Aby to zrobić, pomocna tutaj odpowiedź pappes powinna być pomocna: /programming/129046/disable-and-later-enable-all-table-indexes-in-oracle
Powtarzam tutaj odpowiedź pappe w celach informacyjnych. (Pamiętaj, że to polecenie SPOOL przyjmuje założenia dotyczące platformy i środowiska).
Importuj ...
źródło
usuń indeks. zaktualizuj kolumnę. zwróć indeks z powrotem. ale jeśli kolumna zawiera tę samą wartość dla wszystkich wierszy, możesz usunąć indeks.
źródło
Jeśli nie masz ograniczenia miejsca, możesz utworzyć nową tabelę, taką samą jak twoja tabela z nową kolumną dodaną do tej tabeli i usunąć starą tabelę:
źródło
Wypróbuj wiele sekwencji aktualizacji / zatwierdzania. Wstawianie / aktualizowanie / usuwanie zbyt wielu wierszy bez zatwierdzenia prowadzi do dużego obciążenia operacji we / wy. Można go dość zoptymalizować, znając rozmiary bloków oraz rozmiary rekordów i inne rzeczy.
Do usuwania całych danych z tabeli
truncate table x
jest lepsze niżdelete from x
. Również czyszczenie powoduje kolejne obciążenie procesu.Edycja: Możesz użyć
inmemory
opcji, ładując tabelę do pamięci w formacie kolumnowym, a następnie wykonać aktualizację. to naprawdę zależy od relacji i struktury twojego DB. Zobacz ten artykuł .źródło
truncate
anidelete
nie miałbym żadnej pomocy.