sql >> Database teknologi >  >> RDS >> PostgreSQL

jdbc batch ydeevne

AFAIK er ingen server-side batching i fe/be protokol , så PgJDBC kan ikke bruge det. . Opdater :Nå, jeg tog fejl. PgJDBC (nøjagtig fra 9.3) gør send batches af forespørgsler til serveren hvis den ikke behøver at hente genererede nøgler . Den sætter bare en masse forespørgsler i kø i sendebufferen uden at synkronisere med serveren efter hver enkelt forespørgsel.

Se:

Selv når der anmodes om genererede nøgler, er den udvidede forespørgsel protokol bruges til at sikre, at forespørgselsteksten ikke skal sendes hver gang, kun parametrene.

Helt ærligt, JDBC batching er ikke en god løsning under alle omstændigheder. Det er nemt at bruge for appudvikleren, men temmelig suboptimalt for ydeevnen, da serveren stadig skal udføre hver sætning individuelt - dog ikke parse og planlægge dem individuelt, så længe du bruger forberedte udsagn.

Hvis autocommit er slået til, vil ydeevnen være absolut patetisk, fordi hver erklæring udløser en commit. Selv når autocommit er slået fra, vil masser af små erklæringer ikke være særlig hurtige, selvom du kunne eliminere forsinkelserne rundtur.

En bedre løsning til mange simple UPDATE s kan være at:

  • COPY nye data til en TEMPORARY eller UNLOGGED bord; og
  • Brug UPDATE ... FROM til UPDATE med en JOIN mod den kopierede tabel

For KOPI, se PgJDBC-dokumenterne og COPY dokumentation i serverdokumenterne .

Du vil ofte opdage, at det er muligt at justere ting, så din app ikke behøver at sende alle disse individuelle UPDATE overhovedet.




  1. Hvorfor 'fremmednøglebegrænsning mislykkes', når der findes en fremmednøgle?

  2. Udfør VACUUM FULL med JPA

  3. MySql:Vælg elementer, der har alle værdierne

  4. MYSQL vælg join multiple table og SUM