АпгрСйд для Π»Π΅Π½ΠΈΠ²Ρ‹Ρ…: ΠΊΠ°ΠΊ PostgreSQL 12 ΠΏΠΎΠ²Ρ‹ΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ

АпгрСйд для Π»Π΅Π½ΠΈΠ²Ρ‹Ρ…: ΠΊΠ°ΠΊ PostgreSQL 12 ΠΏΠΎΠ²Ρ‹ΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ

PostgreSQL 12, послСдняя вСрсия Β«Π»ΡƒΡ‡ΡˆΠ΅ΠΉ Π² ΠΌΠΈΡ€Π΅ рСляционной Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… с ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ исходным ΠΊΠΎΠ΄ΠΎΠΌΒ», Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ°Ρ€Ρƒ-Ρ‚Ρ€ΠΎΠΉΠΊΡƒ нСдСль (Ссли всС ΠΏΠΎΠΉΠ΄Π΅Ρ‚ ΠΏΠΎ ΠΏΠ»Π°Π½Ρƒ). Π­Ρ‚ΠΎ соотвСтствуСт ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌΡƒ Ρ€Π°ΡΠΏΠΈΡΠ°Π½ΠΈΡŽ β€” новая вСрсия с ΡƒΠΉΠΌΠΎΠΉ Π½ΠΎΠ²Ρ‹Ρ… возмоТностСй Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ Ρ€Π°Π· Π² Π³ΠΎΠ΄, ΠΈ, чСстно говоря, это впСчатляСт. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ я ΠΈ стал Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΌ Ρ‡Π»Π΅Π½ΠΎΠΌ сообщСства PostgreSQL.

По-ΠΌΠΎΠ΅ΠΌΡƒ, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΏΡ€ΠΎΡˆΠ»Ρ‹Ρ… выпусков, PostgreSQL 12 Π½Π΅ содСрТит ΠΎΠ΄Π½ΠΎΠΉ-Π΄Π²ΡƒΡ… Ρ€Π΅Π²ΠΎΠ»ΡŽΡ†ΠΈΠΎΠ½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ (ΠΊΠ°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, сСкционированиС ΠΈΠ»ΠΈ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌ запросов). Π― ΠΊΠ°ΠΊ-Ρ‚ΠΎ ΠΏΠΎΡˆΡƒΡ‚ΠΈΠ», Ρ‡Ρ‚ΠΎ главная Ρ„ΠΈΡˆΠΊΠ° PostgreSQL 12 β€” Π² большСй ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ. А Ρ€Π°Π·Π²Π΅ Π½Π΅ это Π½ΡƒΠΆΠ½ΠΎ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ управляСтС критичСски Π²Π°ΠΆΠ½Ρ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ вашСго бизнСса?

Но PostgreSQL 12 этим Π½Π΅ ограничиваСтся: с Π½ΠΎΠ²Ρ‹ΠΌΠΈ возмоТностями ΠΈ ΡƒΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ΡΡ‚Π²ΠΎΠ²Π°Π½ΠΈΡΠΌΠΈ прилоТСния Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π»ΡƒΡ‡ΡˆΠ΅, Π° ΠΎΡ‚ вас всСго-навсСго трСбуСтся ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π°ΠΏΠ³Ρ€Π΅ΠΉΠ΄!

(Ну, ΠΌΠΎΠΆΠ΅Ρ‚, Π΅Ρ‰Π΅ индСксы ΠΏΠ΅Ρ€Π΅ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ, Π½ΠΎ Π² этом Ρ€Π΅Π»ΠΈΠ·Π΅ это Π½Π΅ Ρ‚Π°ΠΊ ΡΡ‚Ρ€Π°ΡˆΠ½ΠΎ, ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΏΡ€ΠΈΠ²Ρ‹ΠΊΠ»ΠΈ.)

Π’ΠΎΡ‚ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π΄ΠΎΡ€ΠΎΠ²ΠΎ β€” Π°ΠΏΠ³Ρ€Π΅ΠΉΠ΄Π½ΡƒΡ‚ΡŒ PostgreSQL ΠΈ сразу Π½Π°ΡΠ»Π°ΠΆΠ΄Π°Ρ‚ΡŒΡΡ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡΠΌΠΈ Π±Π΅Π· Π»ΠΈΡˆΠ½ΠΈΡ… Ρ‚Π΅Π»ΠΎΠ΄Π²ΠΈΠΆΠ΅Π½ΠΈΠΉ. НСсколько Π»Π΅Ρ‚ Π½Π°Π·Π°Π΄ я Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π» ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ с PostgreSQL 9.4 Π΄ΠΎ PostgreSQL 10 ΠΈ ΡƒΠ²ΠΈΠ΄Π΅Π», ΠΊΠ°ΠΊ ΡƒΡΠΊΠΎΡ€ΠΈΠ»ΠΎΡΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ благодаря ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½Π½ΠΎΠΌΡƒ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΠΈΠ·ΠΌΡƒ запросов Π² PostgreSQL 10. И, Π³Π»Π°Π²Π½ΠΎΠ΅, ΠΎΡ‚ мСня ΠΏΠΎΡ‡Ρ‚ΠΈ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎΡΡŒ (всСго-Ρ‚ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ max_parallel_workers).

Π‘ΠΎΠ³Π»Π°ΡΠΈΡ‚Π΅ΡΡŒ, ΡƒΠ΄ΠΎΠ±Π½ΠΎ, ΠΊΠΎΠ³Π΄Π° сразу послС Π°ΠΏΠ³Ρ€Π΅ΠΉΠ΄Π° прилоТСния Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π»ΡƒΡ‡ΡˆΠ΅. А ΠΌΡ‹ ΠΎΡ‡Π΅Π½ΡŒ стараСмся Ρ€Π°Π΄ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, вСдь Ρƒ PostgreSQL ΠΈΡ… всС большС.

И ΠΊΠ°ΠΊ ΠΆΠ΅ простой Π°ΠΏΠ³Ρ€Π΅ΠΉΠ΄ Π΄ΠΎ PostgreSQL 12 сдСлаСт вас счастливым? БСйчас расскаТу.

Π‘Π΅Ρ€ΡŒΠ΅Π·Π½Ρ‹Π΅ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ индСксирования

Π‘Π΅Π· индСксирования Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ ΡƒΠ΅Π΄Π΅Ρ‚. А ΠΊΠ°ΠΊ Π΅Ρ‰Π΅ быстро Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ? Π€ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Π°Ρ систСма индСксирования PostgreSQL называСтся B-Π΄Π΅Ρ€Π΅Π²ΠΎ. Π­Ρ‚ΠΎΡ‚ Ρ‚ΠΈΠΏ индСкса ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ для систСм хранСния.

ΠœΡ‹ просто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ CREATE INDEX ON some_table (some_column), Π° PostgreSQL ΠΏΡ€ΠΎΠ΄Π΅Π»Ρ‹Π²Π°Π΅Ρ‚ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ индСкса, ΠΏΠΎΠΊΠ° ΠΌΡ‹ постоянно вставляСм, обновляСм ΠΈ удаляСм значСния. ВсС Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ само ΠΏΠΎ сСбС, ΠΊΠ°ΠΊ ΠΏΠΎ Π²ΠΎΠ»ΡˆΠ΅Π±ΡΡ‚Π²Ρƒ.

Но Ρƒ индСксов PostgreSQL Π΅ΡΡ‚ΡŒ ΠΎΠ΄Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° β€” ΠΎΠ½ΠΈ Ρ€Π°Π·Π΄ΡƒΠ²Π°ΡŽΡ‚ΡΡ ΠΈ Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ лишнСС мСсто Π½Π° дискС, Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ извлСчСния ΠΈ обновлСния Π΄Π°Π½Π½Ρ‹Ρ… сниТаСтся. Под Β«Ρ€Π°Π·Π΄ΡƒΠ²Π°Π½ΠΈΠ΅ΠΌΒ» я ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°ΡŽ нСэффСктивноС ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅ индСксной структуры. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ β€” Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈ Π½Π΅ Π±Ρ‹Ρ‚ΡŒ β€” связано с мусорными ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ удаляСт VACUUM (спасибо Π·Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠŸΠΈΡ‚Π΅Ρ€Ρƒ Π“Π΅ΠΉΠ³Π°Π½Ρƒ (Peter Geoghegan)). Π Π°Π·Π΄ΡƒΠ²Π°Π½ΠΈΠ΅ индСкса особСнно Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎ Π² Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠ°Ρ…, Π³Π΄Π΅ индСкс Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ измСняСтся.

PostgreSQL 12 ΡΠ΅Ρ€ΡŒΠ΅Π·Π½ΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠ°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ индСксов B-Π΄Π΅Ρ€Π΅Π²Π°, ΠΈ экспСримСнты с тСстами Ρ‚ΠΈΠΏΠ° TPC-C ΠΏΠΎΠΊΠ°Π·Π°Π»ΠΈ, Ρ‡Ρ‚ΠΎ мСста Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, Π² срСднСм, Π½Π° 40% мСньшС. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ Ρ‚Ρ€Π°Ρ‚ΠΈΠΌ мСньшС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° обслуТиваниС индСксов B-Π΄Π΅Ρ€Π΅Π²Π° (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π½Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ записи), Π½ΠΎ ΠΈ Π½Π° ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…, вСдь индСксы стали Π³ΠΎΡ€Π°Π·Π΄ΠΎ мСньшС.

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡŽΡ‚ свои Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ β€” ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ это OLTP-прилоТСния (ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ) β€” Π±ΡƒΠ΄ΡƒΡ‚ Π³ΠΎΡ€Π°Π·Π΄ΠΎ эффСктивнСС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ диск ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ запросы. Π§Π΅ΠΌ большС Π½Π° дискС мСста, Ρ‚Π΅ΠΌ большС Ρƒ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… пространства для роста Π±Π΅Π· Π°ΠΏΠ³Ρ€Π΅ΠΉΠ΄Π° инфраструктуры.

НСкоторыС стратСгии Π°ΠΏΠ³Ρ€Π΅ΠΉΠ΄Π° Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ ΠΏΠ΅Ρ€Π΅ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ индСксы B-Π΄Π΅Ρ€Π΅Π²Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ этими прСимущСствами (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, pg_upgrade Π½Π΅ пСрСстроит индСксы автоматичСски). Π’ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… вСрсиях PostgreSQL пСрСстройка Π±ΠΎΠ»ΡŒΡˆΠΈΡ… индСксов Π² Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ… ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠ»Π° ΠΊ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌΡƒ ΠΏΡ€ΠΎΡΡ‚ΠΎΡŽ, вСдь Π² это врСмя нСльзя Π±Ρ‹Π»ΠΎ Π²Π½ΠΎΡΠΈΡ‚ΡŒ измСнСния. Но Π² PostgreSQL 12 Π΅ΡΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄Π½Π° классная Ρ„ΠΈΡˆΠΊΠ°: Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ индСксы ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ REINDEX CONCURRENTLY, Ρ‡Ρ‚ΠΎΠ±Ρ‹ совсСм ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ простоя.

Π’ PostgreSQL 12 Π΅ΡΡ‚ΡŒ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ инфраструктуры индСксирования. Π•Ρ‰Π΅ ΠΎΠ΄Π½Π° ΡˆΡ‚ΡƒΠΊΠ°, Π³Π΄Π΅ Π½Π΅ обошлось Π±Π΅Π· Π²ΠΎΠ»ΡˆΠ΅Π±ΡΡ‚Π²Π°, β€” ΠΆΡƒΡ€Π½Π°Π» ΡƒΠΏΡ€Π΅ΠΆΠ΄Π°ΡŽΡ‰Π΅ΠΉ записи, ΠΎΠ½ ΠΆΠ΅ WAL (write-ahead log). Π–ΡƒΡ€Π½Π°Π» ΡƒΠΏΡ€Π΅ΠΆΠ΄Π°ΡŽΡ‰Π΅ΠΉ записи записываСт ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ Π² PostgreSQL Π½Π° случай сбоя ΠΈ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Π΅Π³ΠΎ для Π°Ρ€Ρ…ΠΈΠ²Π°Ρ†ΠΈΠΈ ΠΈ восстановлСния Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΆΡƒΡ€Π½Π°Π» ΡƒΠΏΡ€Π΅ΠΆΠ΄Π°ΡŽΡ‰Π΅ΠΉ записи записываСтся Π½Π° диск, Π° это ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚Ρ€Π°Π·ΠΈΡ‚ΡŒΡΡ Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

Π’ PostgreSQL 12 ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΠ»ΠΈΡΡŒ ΠΈΠ·Π΄Π΅Ρ€ΠΆΠΊΠΈ записСй WAL, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ индСксами GiST, GIN ΠΈ SP-GiST ΠΏΡ€ΠΈ построСнии индСкса. Π­Ρ‚ΠΎ Π΄Π°Π΅Ρ‚ нСсколько ΠΎΡ‰ΡƒΡ‚ΠΈΠΌΡ‹Ρ… прСимущСств: записи WAL Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ мСньшС мСста Π½Π° дискС, Π° Π΄Π°Π½Π½Ρ‹Π΅ быстрСС воспроизводятся, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π²ΠΎ врСмя восстановлСния послС сбоя ΠΈΠ»ΠΈ восстановлСния Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Ρ‚Π°ΠΊΠΈΠ΅ индСксы Π² своих прилоТСниях (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, гСопространствСнныС прилоТСния Π½Π° основС PostGIS ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ индСкс GiST), это Π΅Ρ‰Π΅ ΠΎΠ΄Π½Π° Ρ„ΠΈΡ‡Π°, которая Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π±Π΅Π·ΠΎ всяких усилий с вашСй стороны.

Π‘Π΅ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ β€” большС, Π»ΡƒΡ‡ΡˆΠ΅, быстрСС

Π’ PostgreSQL 10 появилось Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠ΅ сСкционированиС. Π’ PostgreSQL 11 Π΅Π³ΠΎ стало Π³ΠΎΡ€Π°Π·Π΄ΠΎ ΠΏΡ€ΠΎΡ‰Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ. Π’ PostgreSQL 12 ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΌΠ°ΡΡˆΡ‚Π°Π± сСкций.

Π’ PostgreSQL 12 ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ систСмы сСкционирования стала Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π»ΡƒΡ‡ΡˆΠ΅, особСнно Ссли Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ тысячи сСкций. НапримСр, Ссли запрос Π·Π°Ρ‚Ρ€Π°Π³ΠΈΠ²Π°Π΅Ρ‚ всСго нСсколько сСкций Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅, Π³Π΄Π΅ ΠΈΡ… тысячи, ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π³ΠΎΡ€Π°Π·Π΄ΠΎ быстрСС. ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½Π° Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Ρ‚Π°ΠΊΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ² запросов. Π•Ρ‰Π΅ Π²Ρ‹ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚Π΅, ΠΊΠ°ΠΊ ΡƒΡΠΊΠΎΡ€ΠΈΠ»ΠΈΡΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ INSERT Π² Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ… со мноТСством сСкций.

Π—Π°ΠΏΠΈΡΡŒ Π΄Π°Π½Π½Ρ‹Ρ… с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ COPY β€” кстати, это ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΉ способ массовой Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π²ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΈΠ΅ΠΌΠ° JSON β€” Π² сСкционированныС Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π² PostgreSQL 12 Ρ‚ΠΎΠΆΠ΅ стала эффСктивнСС. Π‘ COPY ΠΈ Ρ‚Π°ΠΊ всС Π±Ρ‹Π»ΠΎ быстро, Π° Π² PostgreSQL 12 совсСм Π»Π΅Ρ‚Π°Π΅Ρ‚.

Благодаря этим прСимущСствам Π² PostgreSQL ΠΌΠΎΠΆΠ½ΠΎ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π½Π°Π±ΠΎΡ€Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π΅Ρ‰Π΅ большСго Ρ€Π°Π·ΠΌΠ΅Ρ€Π°, Π° ΠΈΠ·Π²Π»Π΅ΠΊΠ°Ρ‚ΡŒ ΠΈΡ… стало ΠΏΡ€ΠΎΡ‰Π΅. И Π½ΠΈΠΊΠ°ΠΊΠΈΡ… усилий с вашСй стороны. Если Ρƒ прилоТСния ΠΌΠ½ΠΎΠ³ΠΎ сСкций, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΠ½ΠΎ записываСт Π΄Π°Π½Π½Ρ‹Π΅ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… рядов, простой Π°ΠΏΠ³Ρ€Π΅ΠΉΠ΄ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ Π΅Π³ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ.

И хотя это ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠ΅ Π½Π΅ совсСм ΠΈΠ· ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ Β«Π°ΠΏΠ³Ρ€Π΅ΠΉΠ΄Π½ΡƒΠ»ΠΈ ΠΈ радуСмся», Π² PostgreSQL 12 ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ внСшниС ΠΊΠ»ΡŽΡ‡ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΡΡ‹Π»Π°ΡŽΡ‚ΡΡ Π½Π° сСкционированныС Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π° с сСкционированиСм приносила ΠΎΠ΄Π½ΠΎ ΡƒΠ΄ΠΎΠ²ΠΎΠ»ΡŒΡΡ‚Π²ΠΈΠ΅.

Запросы WITH стали Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π»ΡƒΡ‡ΡˆΠ΅

Когда Π±Ρ‹Π» ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ ΠΏΠ°Ρ‚Ρ‡ для встроСнных ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½Π½Ρ‹Ρ… Ρ‚Π°Π±Π»ΠΈΡ‡Π½Ρ‹Ρ… Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ (ΠΎΠ½ΠΈ ΠΆΠ΅ CTE, ΠΎΠ½ΠΈ ΠΆΠ΅ запросы WITH), ΠΌΠ½Π΅ Π½Π΅ Ρ‚Π΅Ρ€ΠΏΠ΅Π»ΠΎΡΡŒ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΡΡ‚Π°Ρ‚ΡŒΡŽ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΎΠ±Ρ€Π°Π΄ΠΎΠ²Π°Π»ΠΈΡΡŒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ с PostgreSQL. Π­Ρ‚ΠΎ ΠΎΠ΄Π½Π° ΠΈΠ· Ρ‚Π΅Ρ… Ρ„ΠΈΡ‡, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ускорят ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Если, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ CTE.

Π― часто Π·Π°ΠΌΠ΅Ρ‡Π°ΡŽ, Ρ‡Ρ‚ΠΎ Π½ΠΎΠ²ΠΈΡ‡ΠΊΠΈ Π² SQL Π»ΡŽΠ±ΡΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ CTE: Ссли Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈΡ… ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, прямо Ρ‡ΡƒΠ²ΡΡ‚Π²ΡƒΠ΅ΡˆΡŒ, Ρ‡Ρ‚ΠΎ пишСшь ΠΈΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ. Π›ΠΈΡ‡Π½ΠΎ я любил ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ эти запросы, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±ΠΎΠΉΡ‚ΠΈΡΡŒ Π±Π΅Π· CTE ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. БСйчас всС ΠΈΠ½Π°Ρ‡Π΅.

PostgreSQL 12 позволяСт Π²ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ CTE Π±Π΅Π· ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Ρ… эффСктов (SELECT), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· Π±Π»ΠΈΠΆΠ΅ ΠΊ ΠΊΠΎΠ½Ρ†Ρƒ запроса. Если Π±Ρ‹ я Π²Π΅Π» статистику запросов с CTE, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ я пСрСписывал, Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΈΠ· Π½ΠΈΡ… ΠΏΠΎΠΏΠ°Π»ΠΈ Π±Ρ‹ Π² эту ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡŽ. Π­Ρ‚ΠΎ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ ΠΏΠΈΡΠ°Ρ‚ΡŒ понятный ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π΅Ρ‰Π΅ ΠΈ быстро Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚.

Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, PostgreSQL 12 ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ SQL сам, Π²Π°ΠΌ Π½Π΅ придСтся Π½ΠΈΡ‡Π΅Π³ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ. И хотя Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ, Π½Π°Π²Π΅Ρ€Π½ΠΎΠ΅, ΠΌΠ½Π΅ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ запросы, Π·Π΄ΠΎΡ€ΠΎΠ²ΠΎ, Ρ‡Ρ‚ΠΎ PostgreSQL ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π°Π΄ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ запросов.

Just-in-Time (JIT) β€” Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

Π’ систСмах PostgreSQL 12 с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ LLVM JIT-компиляция Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ JIT для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, Π° Π²ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, запросы с выраТСниями (самый простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€ β€” x + y) Π² списках Π²Ρ‹Π±ΠΎΡ€Π° (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ стоят Ρƒ вас послС SELECT), Π°Π³Ρ€Π΅Π³Π°Ρ‚Π°ΠΌΠΈ, выраТСниями с прСдлоТСниями WHERE ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ JIT для ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

Π Π°Π· JIT Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ Π² PostgreSQL 12 ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡΡ сама ΠΏΠΎ сСбС, Π½ΠΎ я ΡΠΎΠ²Π΅Ρ‚ΡƒΡŽ ΠΏΠΎΡ‚Π΅ΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² PostgreSQL 11, Π³Π΄Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ появился JIT, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·ΠΌΠ΅Ρ€ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ запросов ΠΈ ΡƒΠ·Π½Π°Ρ‚ΡŒ, Π½ΡƒΠΆΠ½ΠΎ Π»ΠΈ Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ.

А ΠΊΠ°ΠΊ ΠΆΠ΅ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Π½ΠΎΠ²Ρ‹Π΅ Ρ„ΠΈΡ‡ΠΈ PostgreSQL 12?

Π’ PostgreSQL 12 ΡƒΠΉΠΌΠ° Π½ΠΎΠ²Ρ‹Ρ… классных Ρ„ΠΈΡ‡ β€” ΠΎΡ‚ возмоТности ΠΈΠ·ΡƒΡ‡Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ JSON с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ стандартных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Π° SQL/JSON Π΄ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΡ„Π°ΠΊΡ‚ΠΎΡ€Π½ΠΎΠΉ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ clientcert=verify-full, создаваСмых столбцов ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ³ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ. Π₯Π²Π°Ρ‚ΠΈΡ‚ Π½Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ пост.

Как ΠΈ PostgreSQL 10, PostgreSQL 12 повысит ΠΎΠ±Ρ‰ΡƒΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ сразу послС Π°ΠΏΠ³Ρ€Π΅ΠΉΠ΄Π°. Π£ вас, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ свой ΠΏΡƒΡ‚ΡŒ β€” протСстируйтС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ схоТих условиях Π² Ρ€Π°Π±ΠΎΡ‡Π΅ΠΉ систСмС, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ, ΠΊΠ°ΠΊ это сдСлал я с PostgreSQL 10. Π”Π°ΠΆΠ΅ Ссли PostgreSQL 12 ΡƒΠΆΠ΅ сСйчас ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Π΅Π΅, Ρ‡Π΅ΠΌ я ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π», Π½Π΅ Π»Π΅Π½ΠΈΡ‚Π΅ΡΡŒ качСствСнно Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ прилоТСния, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Π²Ρ‹ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΈΡ… Π² ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ΅Π½.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com