Szybkie ładowanie danych do tabeli

Czasem mamy bardzo mało czasu na załadowanie danych do tabeli. Nie robi się wtedy ważne miejsce na dysku tylko szybkość wykonania. Ostatnio spotkałem się z takim problemem stąd też ten wpis.

Tworzymy sobie dowolną tabelkę. Posłużymy się najlepiej jakąś istniejącą z większą liczbą rekordów. Na jej podstawie stworzymy tabelkę do naszego tematu

01

Zróbmy sobie zliczenie rekordów w nowej tabeli aby wiedzieć ile razy powielić dane aby było ich ponad 2 miliony rekordów

02

 

Teraz napiszmy krótki skrypt który powieli nam każdy rekord powiedzmy 10 tysięcy razy

03

 

Teraz zapytanie o liczbę rekordów w tabeli powinno zwrócić liczbę 2370000

 

Stworzymy sobie nową tabelkę o nazwie KRAJE_2 na podstawie tabelki kraje ale tym razem bez danych

03a

 

Mamy już dość sporą tabelkę KRAJE, możemy więc przystąpić do pracy.
Na początku musimy zmienić wartość LOGGING najnowszej tabelki. Tworząc tabelę domyślna wartość ustawiona jest na YES i jest to poprawne i bezpieczne. Wartość LOGGING określa czy chcemy logować informację o tabeli w plikach powtórzeń. Ustawienie na wartość NOLOGGING pomoże nam zminimalizować generowanie rekordów powtórzeń.
Wykonajmy więc nasze zapytanie aby upewnić jaką wartość ma nasza tabelka.

04

 

W powyższym zrzucie widzimy że nasze tabelki mają wartość YES czyli LOGGING. Zmieńmy ją teraz na NO czyli NOLOGGING dla drugiej tabeli

05

 

Powyższe zapytanie powinno nam teraz wyświetlić

06

 

Uzupełnijmy teraz naszą tabelkę KRAJE_2 danymi z tabeli KRAJE czyli ponad dwoma milionami rekordów. Może od razu napiszmy to w bloku aby od razu było widać różnicę pomiędzy zwykłym INSERT’em a wykorzystaniem bezpośredniej ścieżki do pliku czyli               /*+APPEND */

08

 

I wynik, gdzie widzimy że INSERT z bezpośrednią ścieżką do pliku wykonał się około 3,5 razy szybciej

09

 

WAŻNE !

Należy pamiętać że użycie opcji NOLOGGING powoduje niemożliwość odtworzenia takich danych jeśli wystąpi problem podczas ładowania. Jeśli więc nasza operacja INSERT z hint APPEND przebiegła pomyślnie zaraz po jej wykonaniu zróbmy kopię zapasową tabeli oraz zmieńmy jej wartość na YES w kolumnie LOGGING.
Jeśli dane są kluczowe i nie można ich odtworzyć i załadować ponownie to lepiej nie korzystać z opcji NOLOGGING. Wtedy zastosowanie INSERT z bezpośrednią ścieżką do pliku i tak będzie szybsze niż zwykłe załadowanie danych.

Możemy jeszcze wykonać insert z opcją LOGGING dla porównania.

Warunkiem zastosowania opcji NOLOGGING na tabeli i jej działania jest to żeby baza była również ustawiona w tryb NO. Jeśli przestawimy nielogowanie dla tabeli ale baza będzie ustawiona na YES to i tak ustawienie dla bazy jest nadrzędne. Warto więc sprawdzić ustawienie bazy odpytując widok v$database

10

 

Posted in Programowanie.