PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Zrozumienie operacji wsadowych JDBC

Mogą być zaangażowane różne rodzaje przetwarzania wsadowego, a ja omówiłbym część tego sterownika PostgreSQL JDBC (pgjdbc).

TL; DR:pgjdbc używa mniej okrążeń sieciowych w przypadku użycia API wsadowego. BatchedQuery jest używany tylko wtedy, gdy reWriteBatchedInserts=true jest przekazywany do ustawień połączenia pgjdbc.

Odpowiednie może być https://www.slideshare.net/VladimirSitnikv/postgresql-and-jdbc-striving-for-high-performance (slajd 44,...)

Jeśli chodzi o wykonanie zapytania, opóźnienie sieci jest często znaczną częścią upływu czasu.

Załóżmy, że chodzi o wstawienie 10 wierszy.

  1. Bez grupowania (np. po prostu PreparedStatement#execute w pętli). Kierowca wykonałby następujące czynności

    execute query
    sync <-- wait for the response from the DB
    execute query
    sync <-- wait for the response from the DB
    execute query
    sync <-- wait for the response from the DB
    ...
    

    Godny uwagi czas spędzi się w "czekaniu na DB"

  2. API wsadowe JDBC. To jest PreparedStatement#addBatch() umożliwia sterownikowi wysyłanie wielu „wykonań zapytań” w ramach jednej sieci. Obecna implementacja jednak nadal dzieliłaby duże partie na mniejsze, aby uniknąć zakleszczenia TCP.

    Działania byłyby znacznie lepsze:

    execute query
    ...
    execute query
    execute query
    execute query
    sync <-- wait for the response from the DB
    
  3. Zauważ, że nawet z #addBatch , istnieje obciążenie poleceń „wykonaj zapytanie”. Przetwarzanie każdej wiadomości indywidualnie zajmuje serwerowi sporo czasu.

    Jednym ze sposobów zmniejszenia liczby zapytań jest użycie wstawiania wielowartościowego. Na przykład:

    insert into tab(a,b,c) values (?,?,?), (?,?,?), ..., (?,?,?)
    

    Ten PostgreSQL umożliwia wstawianie wielu wierszy naraz. Wadą jest brak szczegółowego komunikatu o błędzie (dla każdego wiersza). Obecnie Hibernate nie implementuje wstawiania wielu wartości.

    Jednak pgjdbc może przepisywać zwykłe wstawki wsadowe na wiele wartości w locie od 9.4.1209 (2016-07-15).

    Aby aktywować przepisywanie wielu wartości, musisz dodać reWriteBatchedInserts=true właściwość połączenia. Funkcja została pierwotnie opracowana w https://github.com/pgjdbc/pgjdbc/pull/491

    Wystarczy użyć 2 instrukcji, aby wstawić 10 wierszy. Pierwsza z nich to instrukcja 8-wartościowa, a druga to instrukcja 2-wartościowa. Użycie potęgi dwójki umożliwia pgjdbc utrzymanie liczby odrębnych instrukcji w porządku, co poprawia wydajność, ponieważ często używane instrukcje są przygotowywane przez serwer (zobacz Jaka jest żywotność instrukcji PostgreSQL przygotowanych po stronie serwera)

    BatchedQuery reprezentuje tego rodzaju wielowartościowe instrukcje, więc zobaczysz tę klasę użytą w reWriteBatchedInserts=true tylko przypadek.

    Wady tej funkcji mogą obejmować:niższe szczegóły jako „wynik wsadowy”. Na przykład, zwykła partia daje "na liczbę wierszy instrukcji", jednak w przypadku wielu wartości otrzymujesz po prostu status "wyciągu ukończonego". Co więcej, przepisywanie w locie może nie przeanalizować niektórych instrukcji SQL (np. https://github.com/pgjdbc/pgjdbc/issues/1045).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak mogę uzyskać zrzut bazy danych postgres w postaci zwykłego tekstu na heroku?

  2. NULL kontra `nieskończoność` w typach zakresów PostgreSQL

  3. Odejmij minuty od wartości czasu w PostgreSQL

  4. Dlaczego sekwencje identyfikatorów SQL nie są zsynchronizowane (w szczególności przy użyciu Postgresa)?

  5. Sterownik PostgreSQL 9.2 JDBC używa strefy czasowej klienta?