Oracle
 sql >> Baza danych >  >> RDS >> Oracle

WSTAW 10 milionów zapytań w ciągu 10 minut w Oracle?

Wiem, że inni o tym wspominali i nie chcesz tego słyszeć, ale użyj SQL*Loader lub tabel zewnętrznych. Mój średni czas wczytywania tabel o mniej więcej tej samej szerokości wynosi 12,57 sekundy dla nieco ponad 10m rzędów. Te narzędzia zostały specjalnie zaprojektowane do szybkiego ładowania danych do bazy danych i są w tym całkiem niezłe. Może to wiązać się z dodatkowymi karami czasowymi w zależności od formatu pliku wejściowego, ale jest sporo opcji i rzadko musiałem zmieniać pliki przed załadowaniem.

Jeśli nie chcesz tego robić, nie musisz jeszcze aktualizować swojego sprzętu; musisz usunąć każdą możliwą przeszkodę w szybkim załadowaniu tego. Aby je wyliczyć, usuń:

  1. Indeks
  2. Spust
  3. Sekwencja
  4. Partycja

Biorąc to wszystko pod uwagę, zobowiązujesz bazę danych do wykonania większej ilości pracy, a ponieważ robisz to transakcyjnie, nie wykorzystujesz w pełni potencjału bazy danych.

Załaduj dane do osobnej tabeli, powiedz ABC_LOAD . Po całkowitym załadowaniu danych wykonaj pojedynczy WSTAW oświadczenie do ABC.

insert into abc
select abc_seq.nextval, a.*
  from abc_load a

Kiedy to zrobisz (a nawet jeśli nie) upewnij się, że rozmiar pamięci podręcznej sekwencji jest poprawny; cytować:

Gdy aplikacja uzyskuje dostęp do sekwencji w pamięci podręcznej sekwencji, te numery sekwencji są szybko odczytywane. Jeśli jednak aplikacja uzyskuje dostęp do sekwencji, której nie ma w pamięci podręcznej, przed użyciem numerów sekwencyjnych sekwencja musi zostać odczytana z dysku do pamięci podręcznej.

Jeśli aplikacje używają wielu sekwencji jednocześnie, pamięć podręczna sekwencji może nie być wystarczająco duża, aby pomieścić wszystkie sekwencje. W takim przypadku dostęp do numerów sekwencji może często wymagać odczytów z dysku. Aby uzyskać szybki dostęp do wszystkich sekwencji, upewnij się, że pamięć podręczna ma wystarczającą liczbę wpisów, aby pomieścić wszystkie sekwencje używane jednocześnie przez aplikacje.

Oznacza to, że jeśli masz 10 wątków jednocześnie zapisujących po 500 rekordów, każdy przy użyciu tej sekwencji, potrzebujesz pamięci podręcznej o rozmiarze 5000. W dokumencie ALTER SEQUENCE opisano, jak to zmienić:

alter sequence abc_seq cache 5000

Jeśli zastosujesz się do mojej sugestii, zwiększę rozmiar pamięci podręcznej do około 10,5 m.

Spójrz na użycie wskazówki APPEND (zobacz także Oracle Base); instruuje to Oracle do użycia wstawiania ścieżki bezpośredniej, która dołącza dane bezpośrednio na końcu tabeli, zamiast szukać miejsca na ich umieszczenie. Nie będziesz mógł tego użyć, jeśli Twoja tabela ma indeksy, ale możesz go użyć w ABC_LOAD

insert /*+ append */ into ABC (SSM_ID, invocation_id , calc_id, ... )
select 'c','b',NULL, 'test', 123 , 'N', 'asdf' from dual
union all select 'a','b',NULL, 'test', 123 , 'N', 'asdf' from dual
union all select 'b','b',NULL, 'test', 123 , 'N', 'asdf' from dual
union all select 'c','g',NULL, 'test', 123 , 'N', 'asdf' from dual

Jeśli używasz podpowiedzi DOŁĄCZ; Dodałbym TRUNCATE ABC_LOAD po wstawieniu do ABC w przeciwnym razie ten stół będzie rósł w nieskończoność. Powinno to być bezpieczne, ponieważ do tego czasu skończysz korzystać ze stołu.

Nie wspominasz, jakiej wersji, edycji lub Oracle używasz. Istnieje kilka dodatkowych sztuczek, których możesz użyć:

  • Oracle 12c

    Ta wersja obsługuje kolumny tożsamości; możesz całkowicie pozbyć się sekwencji.

    CREATE TABLE ABC(
       seq_no         NUMBER GENERATED AS IDENTITY (increment by 5000)
    
  • Oracle 11g r2

    Jeśli trzymasz spust; możesz przypisać wartość sekwencji bezpośrednio.

    :new.seq_no := ABC_seq.nextval;
    
  • Oracle Enterprise Edition

    Jeśli korzystasz z Oracle Enterprise, możesz przyspieszyć WSTAWIANIE z ABC_LOAD używając podpowiedzi RÓWNOLEGŁY:

    insert /*+ parallel */ into abc
    select abc_seq.nextval, a.*
      from abc_load a
    

    Może to powodować własne problemy (zbyt wiele równoległych procesów itp.), więc przetestuj. To może pomoc dla mniejszych wstawek wsadowych, ale jest to mniej prawdopodobne, ponieważ stracisz czas na obliczanie, który wątek powinien co przetwarzać.

tl;dr

Użyj narzędzi dołączonych do bazy danych.

Jeśli nie możesz ich użyć, pozbądź się wszystkiego, co może spowolnić wstawianie i zrób to zbiorczo, ponieważ w tym jest dobra baza danych.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Konfiguracja źródła danych Oracle dla Spring

  2. jak wyeksportować dane z tabeli logów do treści wiadomości e-mail w Oracle

  3. Zarządzanie obsługą błędów podczas uruchamiania sqlplus ze skryptów powłoki

  4. Oracle:czy kolejność kolumn ma znaczenie w indeksie?

  5. 2 sposoby na uzyskanie dnia z randki w Oracle