Π—Π΄ΠΎΡ€ΠΎΠ²ΡŒΠ΅ индСксов Π² PostgreSQL Π³Π»Π°Π·Π°ΠΌΠΈ Java-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°

ΠŸΡ€ΠΈΠ²Π΅Ρ‚.

МСня Π·ΠΎΠ²ΡƒΡ‚ Ваня, ΠΈ я Java-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ. Π’Π°ΠΊ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ, Ρ‡Ρ‚ΠΎ я ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽ с PostgreSQL – занимаюсь настройкой Π‘Π”, ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ структуры, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ ΠΈ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ³Ρ€Π°ΡŽ Π² DBA ΠΏΠΎ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹ΠΌ.

Π—Π° послСднСС врСмя я ΠΏΡ€ΠΈΠ²Ρ‘Π» Π² порядок нСсколько Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ… Π² Π½Π°ΡˆΠΈΡ… микросСрвисах ΠΈ написал java-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ pg-index-health, которая ΠΎΠ±Π»Π΅Π³Ρ‡Π°Π΅Ρ‚ эту Ρ€Π°Π±ΠΎΡ‚Ρƒ, экономит ΠΌΠΎΡ‘ врСмя ΠΈ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ²Ρ‹Ρ… ошибок, допускаСмых Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌΠΈ. ИмСнно ΠΎΠ± этой Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ сСгодня ΠΈ ΠΏΠΎΠΉΠ΄Ρ‘Ρ‚ Ρ€Π΅Ρ‡ΡŒ.

Π—Π΄ΠΎΡ€ΠΎΠ²ΡŒΠ΅ индСксов Π² PostgreSQL Π³Π»Π°Π·Π°ΠΌΠΈ Java-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°

Disclaimer

Основная вСрсия PostgreSQL, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ я Ρ€Π°Π±ΠΎΡ‚Π°ΡŽ, это 10-ΠΊΠ°. ВсС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ мною SQL-запросы Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½Ρ‹ Π½Π° 11-ΠΉ вСрсии. Минимальная поддСрТиваСмая вСрсия β€” это 9.6.

ΠŸΡ€Π΅Π΄Ρ‹ΡΡ‚ΠΎΡ€ΠΈΡ

ΠΠ°Ρ‡Π°Π»ΠΎΡΡŒ всё ΠΏΠΎΡ‡Ρ‚ΠΈ Π³ΠΎΠ΄ Π½Π°Π·Π°Π΄ со странной для мСня ситуации: ΠΊΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ‚Π½ΠΎΠ΅ созданиС индСкса Π½Π° Ρ€ΠΎΠ²Π½ΠΎΠΌ мСстС Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΠΎΡΡŒ с ошибкой. Π‘Π°ΠΌ индСкс, ΠΊΠ°ΠΊ водится, Π² Π½Π΅Π²Π°Π»ΠΈΠ΄Π½ΠΎΠΌ состоянии остался Π² Π±Π°Π·Π΅. Анализ Π»ΠΎΠ³ΠΎΠ² ΠΏΠΎΠΊΠ°Π·Π°Π» Π½Π΅Ρ…Π²Π°Ρ‚ΠΊΡƒ temp_file_limit. И ΠΏΠΎΠ½Π΅ΡΠ»ΠΎΡΡŒβ€¦ ΠšΠΎΠΏΠ½ΡƒΠ² ΠΏΠΎΠ³Π»ΡƒΠ±ΠΆΠ΅, я ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ» Ρ†Π΅Π»Ρ‹ΠΉ Π²ΠΎΡ€ΠΎΡ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π‘Π” ΠΈ, засучив Ρ€ΡƒΠΊΠ°Π²Π°, с блСском Π² Π³Π»Π°Π·Π°Ρ… принялся ΠΈΡ… Ρ‡ΠΈΠ½ΠΈΡ‚ΡŒ.

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° пСрвая – дСфолтная конфигурация

НавСрноС, ΠΌΠ΅Ρ‚Π°Ρ„ΠΎΡ€Π° ΠΏΡ€ΠΎ Postgres, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π½Π° ΠΊΠΎΡ„Π΅Π²Π°Ρ€ΠΊΠ΅, всСм ΡƒΠΆΠ΅ изрядно Π½Π°Π΄ΠΎΠ΅Π»Π°, но… конфигурация ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ряд вопросов. Как ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ, стоит ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° maintenance_work_mem, temp_file_limit, statement_timeout ΠΈ lock_timeout.

Π’ нашСм случаС maintenance_work_mem Π±Ρ‹Π» ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ 64 ΠœΠ±Π°ΠΉΡ‚Π°, Π° temp_file_limit Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΎΠΊΠΎΠ»ΠΎ 2 Π“Π±Π°ΠΉΡ‚ – Π½Π°ΠΌ банально Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π»ΠΎ памяти для создания индСкса Π½Π° большой Ρ‚Π°Π±Π»ΠΈΡ†Π΅.

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π² pg-index-health я собрал ряд ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ…, Π½Π° ΠΌΠΎΠΉ взгляд, ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ стоит Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΏΠΎΠ΄ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Π‘Π”.

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° вторая – Π΄ΡƒΠ±Π»ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ΡΡ индСксы

Наши Π±Π°Π·Ρ‹ ΠΆΠΈΠ²ΡƒΡ‚ Π½Π° SSD дисках, ΠΈ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ HA-ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ с нСсколькими Π΄Π°Ρ‚Π°-Ρ†Π΅Π½Ρ‚Ρ€Π°ΠΌΠΈ, мастСр-хостом ΠΈ n-Π½Ρ‹ΠΌ количСством Ρ€Π΅ΠΏΠ»ΠΈΠΊ. ΠœΠ΅ΡΡ‚ΠΎ Π½Π° дискС – ΠΎΡ‡Π΅Π½ΡŒ Ρ†Π΅Π½Π½Ρ‹ΠΉ рСсурс для нас; ΠΎΠ½ΠΎ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ Π²Π°ΠΆΠ½ΠΎ, Ρ‡Π΅ΠΌ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈ ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ CPU. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, с ΠΎΠ΄Π½ΠΎΠΉ стороны, Π½Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹ индСксы для быстрого чтСния, Π° с Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, ΠΌΡ‹ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΠΌ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ Π² Π‘Π” Π»ΠΈΡˆΠ½ΠΈΡ… индСксов, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΠΏΠΎΠΆΠΈΡ€Π°ΡŽΡ‚ мСсто ΠΈ Π·Π°ΠΌΠ΅Π΄Π»ΡΡŽΡ‚ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ….

И Π²ΠΎΡ‚, восстановив всС Π½Π΅Π²Π°Π»ΠΈΠ΄Π½Ρ‹Π΅ индСксы ΠΈ Π½Π°ΡΠΌΠΎΡ‚Ρ€Π΅Π²ΡˆΠΈΡΡŒ Π΄ΠΎΠΊΠ»Π°Π΄ΠΎΠ² ОлСга Π‘Π°Ρ€Ρ‚ΡƒΠ½ΠΎΠ²Π°, я Ρ€Π΅ΡˆΠΈΠ» ΡƒΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Β«Π²Π΅Π»ΠΈΠΊΡƒΡŽΒ» чистку. Оказалось, Ρ‡Ρ‚ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Π½Π΅ Π»ΡŽΠ±ΡΡ‚ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ ΠΊ Π‘Π”. ΠžΡ‡Π΅Π½ΡŒ Π½Π΅ Π»ΡŽΠ±ΡΡ‚. Из-Π·Π° этого Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ Π΄Π²Π΅ Ρ‚ΠΈΠΏΠΎΠ²Ρ‹Π΅ ошибки – Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ созданный индСкс Π½Π° ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ ΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΉ Β«Ρ€ΡƒΡ‡Π½ΠΎΠΉΒ» индСкс Π½Π° ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ столбСц. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹ – Postgres всё сдСлаСт сам. Π’Π°ΠΊΠΈΠ΅ индСксы ΠΌΠΎΠΆΠ½ΠΎ смСло ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ, ΠΈ для этого появилась диагностика duplicated_indexes.

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Ρ‚Ρ€Π΅Ρ‚ΡŒΡ – ΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°ΡŽΡ‰ΠΈΠ΅ΡΡ индСксы

Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ… Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² создаёт индСксы Π½Π° ΠΎΠ΄ΠΈΠ½ столбСц. ΠŸΠΎΡΡ‚Π΅ΠΏΠ΅Π½Π½ΠΎ, ΠΊΠ°ΠΊ слСдуСт распробовав это Π΄Π΅Π»ΠΎ Π½Π° вкус, люди Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ свои запросы ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ слоТныС индСксы, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΠ΅ Π² сСбя нСсколько столбцов. Π’Π°ΠΊ ΠΏΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ индСксы Π½Π° столбцы A, A+B, A+B+C ΠΈ Ρ‚.ΠΏ. ΠŸΠ΅Ρ€Π²Ρ‹Π΅ Π΄Π²Π° ΠΈΠ· этих индСксов ΠΌΠΎΠΆΠ½ΠΎ смСло Π²Ρ‹ΠΊΠΈΠ½ΡƒΡ‚ΡŒ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ прСфиксами Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅Π³ΠΎ. Π­Ρ‚ΠΎ Ρ‚ΠΎΠΆΠ΅ ΠΏΡ€ΠΈΠ»ΠΈΡ‡Π½ΠΎ экономит мСсто Π½Π° дискС ΠΈ для этого Π΅ΡΡ‚ΡŒ диагностика intersected_indexes.

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° чСтвСртая – внСшниС ΠΊΠ»ΡŽΡ‡ΠΈ Π±Π΅Π· индСксов

Postgres позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ограничСния внСшнСго ΠΊΠ»ΡŽΡ‡Π° Π±Π΅Π· указания ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰Π΅Π³ΠΎ индСкса. Π’ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… ситуациях это Π½Π΅ являСтся ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ, ΠΈ Π΄Π°ΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ сСбя Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ ΠΏΡ€ΠΎΡΠ²Π»ΡΡ‚ΡŒβ€¦ Π”ΠΎ ΠΏΠΎΡ€Ρ‹ Π΄ΠΎ врСмСни…

Π’Π°ΠΊ Π±Ρ‹Π»ΠΎ ΠΈ Ρƒ нас: просто Π² ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ job’а, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰Π°ΡΡΡ ΠΏΠΎ Ρ€Π°ΡΠΏΠΈΡΠ°Π½ΠΈΡŽ ΠΈ ΠΎΡ‡ΠΈΡ‰Π°ΡŽΡ‰Π°Ρ Π±Π°Π·Ρƒ ΠΎΡ‚ тСстовых Π·Π°ΠΊΠ°Π·ΠΎΠ², стала Β«ΡΠΊΠ»Π°Π΄Ρ‹Π²Π°Ρ‚ΡŒΒ» Π½Π°ΠΌ мастСр хост. CPU ΠΈ IO ΡƒΠ»Π΅Ρ‚Π°Π»ΠΈ Π² ΠΏΠΎΠ»ΠΊΡƒ, запросы Ρ‚ΠΎΡ€ΠΌΠΎΠ·ΠΈΠ»ΠΈ ΠΈ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π»ΠΈΡΡŒ ΠΏΠΎ Ρ‚Π°ΠΉΠΌΠ°ΡƒΡ‚Ρƒ, сСрвис пятисотил. Быстрый Π°Π½Π°Π»ΠΈΠ· pg_stat_activity ΠΏΠΎΠΊΠ°Π·Π°Π», Ρ‡Ρ‚ΠΎ зависали запросы Π²ΠΈΠ΄Π°:

delete from <table> where id in (…)

ΠŸΡ€ΠΈ этом индСкс ΠΏΠΎ id Π² Ρ†Π΅Π»Π΅Π²ΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Π΅, СстСствСнно, Π±Ρ‹Π», ΠΈ записСй ΡƒΠ΄Π°Π»ΡΠ»ΠΎΡΡŒ ΠΏΠΎ ΡƒΡΠ»ΠΎΠ²ΠΈΡŽ совсСм Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ. Казалось, Ρ‡Ρ‚ΠΎ всё Π΄ΠΎΠ»ΠΆΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, Π½ΠΎ, ΡƒΠ²Ρ‹, Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΎ.

На ΠΏΠΎΠΌΠΎΡ‰ΡŒ ΠΏΡ€ΠΈΡˆΡ‘Π» чудСсный explain analyze ΠΈ рассказал, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠΌΠΈΠΌΠΎ удалСния записСй Π² Ρ†Π΅Π»Π΅Π²ΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Π΅, Π΅Ρ‰Ρ‘ ΠΈΠ΄Ρ‘Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ссылочной цСлостности, ΠΈ Π½Π° ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· связанных Ρ‚Π°Π±Π»ΠΈΡ† эта ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° сваливаСтся Π² sequential scan ΠΈΠ·-Π·Π° отсутствия подходящСго индСкса. Π’Π°ΠΊ Ρ€ΠΎΠ΄ΠΈΠ»Π°ΡΡŒ диагностика foreign_keys_without_index.

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° пятая – null value Π² индСксах

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Postgres Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ null значСния Π² btree-индСксы, Π½ΠΎ ΠΎΠ½ΠΈ Ρ‚Π°ΠΌ, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ я усСрдно ΡΡ‚Π°Ρ€Π°ΡŽΡΡŒ эти null’ы Π²Ρ‹ΠΊΠΈΠ΄Ρ‹Π²Π°Ρ‚ΡŒ (диагностика indexes_with_null_values), создавая частичныС индСксы Π½Π° nullable-столбцы ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ where <A> is not null. Π’Π°ΠΊΠΈΠΌ способом ΠΌΠ½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Π½Π°ΡˆΠΈΡ… индСксов с 1877 ΠœΠ±Π°ΠΉΡ‚ Π΄ΠΎ 16 ΠšΠ±Π°ΠΉΡ‚. А Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· сСрвисов Ρ€Π°Π·ΠΌΠ΅Ρ€ Π‘Π” суммарно ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΠ»ΡΡ Π½Π° 16% (Π½Π° 4.3 Π“Π‘Π°ΠΉΡ‚ Π² Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Ρ‹Ρ… Ρ†ΠΈΡ„Ρ€Π°Ρ…) Π·Π° счёт ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ null Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈΠ· индСксов. Колоссальная экономия дискового пространства ΠΏΡ€ΠΈ вСсьма нСслоТных Π΄ΠΎΡ€Π°Π±ΠΎΡ‚ΠΊΠ°Ρ…. πŸ™‚

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΡˆΠ΅ΡΡ‚Π°Ρ – отсутствиС ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½Ρ‹Ρ… ΠΊΠ»ΡŽΡ‡Π΅ΠΉ

Π’ силу особСнностСй ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° MVCC Π² Postgres’С Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° такая ситуация, ΠΊΠ°ΠΊ bloat, ΠΊΠΎΠ³Π΄Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ вашСй Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ быстро растёт Π·Π° счёт большого количСства ΠΌΠ΅Ρ€Ρ‚Π²Ρ‹Ρ… записСй. Π― Π½Π°ΠΈΠ²Π½ΠΎ ΠΏΠΎΠ»Π°Π³Π°Π», Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ это Π½Π΅ Π³Ρ€ΠΎΠ·ΠΈΡ‚, ΠΈ Ρ‡Ρ‚ΠΎ с нашСй Π±Π°Π·ΠΎΠΉ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Π½Π΅ случится, вСдь ΠΌΡ‹, ΠΎΠ³ΠΎ-Π³ΠΎ!!!, Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΆΠ΅ разработчики… Каким Π³Π»ΡƒΠΏΡ‹ΠΌ ΠΈ Π½Π°ΠΈΠ²Π½Ρ‹ΠΌ я был…

Π’ ΠΎΠ΄ΠΈΠ½ прСкрасный дСнь ΠΎΠ΄Π½Π° чудСсная миграция взяла ΠΈ ΠΎΠ±Π½ΠΎΠ²ΠΈΠ»Π° всС записи Π² большой ΠΈ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅ΠΉΡΡ Ρ‚Π°Π±Π»ΠΈΡ†Π΅. ΠœΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ +100 Π“Π±Π°ΠΉΡ‚ ΠΊ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π½Π° Ρ€ΠΎΠ²Π½ΠΎΠΌ мСстС. Π‘Ρ‹Π»ΠΎ чСртовски ΠΎΠ±ΠΈΠ΄Π½ΠΎ, Π½ΠΎ наши Π·Π»ΠΎΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π½Π° этом Π½Π΅ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ»ΠΈΡΡŒ. ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Ρ‡Π΅Ρ€Π΅Π· 15 часов Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΡΡ Π°Π²Ρ‚ΠΎΠ²Π°ΠΊΡƒΡƒΠΌ Π½Π° этой Ρ‚Π°Π±Π»ΠΈΡ†Π΅, стало понятно, Ρ‡Ρ‚ΠΎ физичСскоС мСсто Π½Π΅ вСрнётся. ΠžΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ сСрвис ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ VACUUM FULL ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠ³Π»ΠΈ, поэтому Π±Ρ‹Π»ΠΎ принято Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ pg_repack. И Ρ‚ΡƒΡ‚ Π²Ρ‹ΡΡΠ½ΠΈΠ»ΠΎΡΡŒ, Ρ‡Ρ‚ΠΎ pg_repack Π½Π΅ ΡƒΠΌΠ΅Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π±Π΅Π· ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π° ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠ³ΠΎ ограничСния ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, Π° Π½Π° нашСй Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π° Π½Π΅ оказалось. Π’Π°ΠΊ Ρ€ΠΎΠ΄ΠΈΠ»Π°ΡΡŒ диагностика tables_without_primary_key.

Π’ вСрсии Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ 0.1.5 добавилась Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎ bloat’у Ρ‚Π°Π±Π»ΠΈΡ† ΠΈ индСксов ΠΈ своСврСмСнно Ρ€Π΅Π°Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° Π½Π΅Π³ΠΎ.

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ сСмь ΠΈ восСмь – Π½Π΅Ρ…Π²Π°Ρ‚ΠΊΠ° индСксов ΠΈ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ индСксы

Π”Π²Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ диагностики β€” tables_with_missing_indexes ΠΈ unused_indexes – Π² своём Ρ„ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠΌ Π²ΠΈΠ΄Π΅ появились ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅Π΄Π°Π²Π½ΠΎ. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΈΡ… нСльзя Π±Ρ‹Π»ΠΎ просто Ρ‚Π°ΠΊ Π²Π·ΡΡ‚ΡŒ ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ.

Как я ΡƒΠΆΠ΅ писал, ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ с нСсколькими Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°ΠΌΠΈ, ΠΈ Ρ‡ΠΈΡ‚Π°ΡŽΡ‰Π°Ρ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… хостах ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΠ°Π»ΡŒΠ½ΠΎ разная. Π’ ΠΈΡ‚ΠΎΠ³Π΅ получаСтся ситуация, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈ индСксы Π½Π° ΠΊΠ°ΠΊΠΈΡ…-Ρ‚ΠΎ хостах практичСски Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ, ΠΈ для Π°Π½Π°Π»ΠΈΠ·Π° Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ статистику со всСх хостов Π² кластСрС. Π‘Π±Ρ€Π°ΡΡ‹Π²Π°Ρ‚ΡŒ статистику Ρ‚ΠΎΠΆΠ΅ Π½ΡƒΠΆΠ½ΠΎ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ хостС Π² кластСрС, нСльзя ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° мастСрС.

Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ» Π½Π°ΠΌ ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ нСсколько дСсятков Π³ΠΈΠ³Π°Π±Π°ΠΉΡ‚ Π·Π° счёт удалСния индСксов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ использовались, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π½Π΅Π΄ΠΎΡΡ‚Π°ΡŽΡ‰ΠΈΠ΅ индСксы Π½Π° Ρ€Π΅Π΄ΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹.

Π’ качСствС Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ

РазумССтся, практичСски для всСх диагностик ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ список ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ быстро Π²Π½Π΅Π΄Ρ€ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π² вашСм ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΠ² появлСниС Π½ΠΎΠ²Ρ‹Ρ… ошибок, ΠΈ Π·Π°Ρ‚Π΅ΠΌ постСпСнно ΠΈΡΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ старыС.

Π§Π°ΡΡ‚ΡŒ диагностик ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΡƒΠΆΠ΅ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… тСстах сразу послС Π½Π°ΠΊΠ°Ρ‚Π° ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΉ Π‘Π”. И это, ΠΏΠΎΠΆΠ°Π»ΡƒΠΉ, ΠΎΠ΄Π½Π° ΠΈΠ· самых ΠΌΠΎΡ‰Π½Ρ‹Ρ… возмоТностСй ΠΌΠΎΠ΅ΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π² Π΄Π΅ΠΌΠΎ.

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π½Π° Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΈΠ»ΠΈ ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ индСксы, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π½Π° bloat, ΠΈΠΌΠ΅Π΅Ρ‚ смысл Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ Π‘Π”. Π‘ΠΎΠ±Ρ€Π°Π½Π½Ρ‹Π΅ значСния ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ записаны Π² ClickHouse ΠΈΠ»ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½Ρ‹ Π² систСму ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π°.

Π― ΠΎΡ‡Π΅Π½ΡŒ надСюсь, Ρ‡Ρ‚ΠΎ pg-index-health Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»Π΅Π·Π½Π° ΠΈ вострСбована. Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΡΠΏΠΎΡΠΎΠ±ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·Π²ΠΈΡ‚ΠΈΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, сообщая ΠΎΠ± ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°Ρ… ΠΈ прСдлагая Π½ΠΎΠ²Ρ‹Π΅ диагностики.

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

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ