Ich schlage vor, sich mit dem Protokoll des Berichts von Vladimir Sitnikov vom Anfang 2016 vertraut zu machen: "PostgreSQL und JDBC pressen alle SĂ€fte aus."


! . 10 NetCracker. . , Java, , SQL â , .
, , PostgreSQL . Java. , , Java. , .

:

. .

. 20 .

20 â . 100 , , , . . .
, . .

â . ? , , .

https://github.com/pgjdbc/pgjdbc/pull/478
, , . , , . .
Super extended query â , . , , - , - , . . , , . , .

, , â simple query extended query.
?
. . , , . . - .

Extended query â . , . - . . . .

. . Java . .
statement. . close. ? ? . . . , .

, . ? «close». , â . «PARSE EXECUTE DEALLOCATE».
statements? . PreparedStatement , , . , .

, , . statement, . â . REST statement id. .

?

â statements. : «prepare» «execute».


, , - - . , . , . statement. - , , .
, . . , . , .

? ?
statements. , , .
PostgreSQL . , .
.

.
â , PgSQL. . . . . 100500 . . â . -.
â . , . -. , .

https://github.com/pgjdbc/pgjdbc/pull/319
2015 . . . , . PgSQL, . . , .
Server-prepared statements 5- , .

â ? ? , .
, OLTP- - 20 . 0,5 , 20 . â 10 , 170 . OLTP . 1, 5, 10 , .
20 . 0 . .
? Java, .
- , â ? , , PL 8 LibPQ, , , . ? .

, , - . . , , , .

. . - , SQL-.
? , .
hashCode. CPU â hashâ . â . - . .

. . ORM, , NULL, -. Int, setInt. NULL, VARCHAR . NULL? . .
. , , , VARCHAR, Server-prepared statements. statement.

, , . NULL. , , PreparedStatements

, . , , . . .
? ? , â . . . . , , . , , - , . .

https://gist.github.com/vlsi/df08cbef370b2e86a5c1
, , . NULL . 20 . , .
, . . «?» «$1» , ?

https://gist.github.com/vlsi/df08cbef370b2e86a5c1
â . â . - . --. â - . , . , , , ?

? ? . generic . , , - generic , , , , . , . - , .
? , , - . , . +0, OFFSET 0. , . «+0» . .
â . , 6 «explain analyze». 5, .
â pgsql-hackers . , , â .

https://gist.github.com/vlsi/df08cbef370b2e86a5c1
â , . «+0». . , . . . «+0» , , .

6- explainâ. 6 , . , . . .
, ? , . .

. , . . â . ? . . â , .

: «?». , , , , «search_path», , . , .
? , server-prepared statements , search_path - . . - .

, , . , . 9.1 . , .

Set search_path + server-prepared statements =
cached plan must not change result type
? â . search_path . , .
, . . , , . , , , - , : «, . , statements , ?». , - statements .
â , Java. PL/ pgSQL . .

. -. . . . Java- 128 .
, , . . . resultSet . ? ? - ? , Postgres . . OutOFMemory? OutOfMemory? ? - .
, . OFFSET/LIMIT. ? , autoCommitâ ?
, , . autoCommit, . ? .

, Postgres, . PgJDBC , .
FetchSize, . . statement , , , 10, 50. , autoCommit. autoCommit â .
setFetchSize â . , .

. . ? , , , 10 , . .

, , , : defaultRowFetchSize .

. â , . , INSERT, VALUES. . «INSERT SELECT». . .
, Batch statement, , . Postgres â COPY , . . .

, . , ? .

TCP . , , . , , , .

. , .
, . , 200 , . .

https://github.com/pgjdbc/pgjdbc/pull/380
, 10 . . ? , - . «128» â batching.

Java microbenchmark harness
, . , . , , .

. InsertBatch . InsertBatch , . . , values . . , , , COPY.

COPY.

. User default type, INSERT .
: pgjdbc/ubenchmsrk/InsertBatch.java, GitHub. , . .

. , , batch â . batching , . . .

. . . ? , . COPY, , .

. , VALUES, VALUES, VALUES 10 . . 1, 2, 4, 128. , Batch Insert, , . . . , , , VALUES . EXECUTE.
COPY â . . , . . COPY.
COPY , . . , , . Batch , COPY â .
Was machen wir als NĂ€chstes? Sie haben es gemessen. Wir verstehen, dass wir entweder Strukturen oder den genialen Bacth verwenden mĂŒssen, um mehrere Werte zu kombinieren.

Was muss aus dem heutigen Bericht gelernt werden?
- PreparedStatement ist unser Alles. Es gibt viel fĂŒr die Leistung. Es gibt ein groĂes Fass Teer.
- Und Sie mĂŒssen die EXPLAIN ANALYZE 6 Mal durchfĂŒhren.
- Und Sie mĂŒssen OFFSET 0 und Tricks wie +0 verdĂŒnnen, um den Prozentsatz unserer problematischen Abfragen zu bearbeiten, die dort verblieben sind.