Mam hurtownię danych (wyrocznię), w której muszę ustawić kolumnę na tę samą wartość dla wszystkich 700 milionów wierszy.
Nie mam dostępu administratora ani dostępu do administratora, więc należy to zrobić za pomocą podstawowego narzędzia SQL i nie tworzy się tabeli tymczasowej.
Dalsze komplikowanie spraw polega na tym, że jeśli spróbuję wykonać prostą aktualizację, gdzie 1 = 1, zabraknie miejsca na ponawianie.
Sposób, w jaki mam teraz działający, jest taki:
loop
update mytable set mycolumn = '1' where mycolumn is null and rownum < 50000;
commit;
end loop
ale wiem, że to prawdopodobnie naiwne i musi istnieć szybsze i bardziej eleganckie rozwiązanie.
oracle
performance
słuchałem
źródło
źródło
Odpowiedzi:
Jeśli masz miejsce, możesz CTAS przy użyciu minimalnego cofania / ponawiania . Jeśli masz jakieś indeksy, robienie tego w jakikolwiek inny sposób będzie bardzo wolne i generuje logowanie jak szalone.
W przypadku, gdy masz pojedynczy IOT bez dodatkowych indeksów lub pojedynczy klaster tabeli, możesz przejść przez aktualizację klucza podstawowego / klastra w porcjach bez konieczności ponownego skanowania całej tabeli w celu znalezienia pól, które nie zostały jeszcze zaktualizowane.
--edytować
Następnie sugeruję podzielenie tabeli na części w celu przetworzenia przy użyciu czegoś, na którym indeksujesz (nawet jeśli jest to pojedyncza kolumna, możesz podzielić ją na zakresy wartości). To spowoduje wykonanie FTS raz zamiast jednego dla każdego fragmentu, jak w twoim kod. Będziesz musiał żyć z okropną ilością przeróbek i wyczyścisz również swoje miejsce cofania (więc nie będzie później retrospekcji)
--edit2
jeśli możesz dodać / zmienić nazwę / upuścić kolumny, możesz to zrobić bardzo skutecznie , ale tylko na 11g
źródło
NOLOGGING
spowoduje unieważnienie hotstandbys.nologging
narzędzie do magazynówcreate table foo as select * from bar where rownum<100000
)Jeśli używasz 11 g, upuść kolumnę i dodaj ją z powrotem jako kolumnę NOT NULL z wartością domyślną. Jest to sprzeczne z intuicją, ale Oracle zapisze domyślną wartość w definicji tabeli, zastępując ją w czasie wykonywania.
źródło