Массовая оптимизация запросов PostgreSQL. ΠšΠΈΡ€ΠΈΠ»Π» Π‘ΠΎΡ€ΠΎΠ²ΠΈΠΊΠΎΠ² (Π’Π΅Π½Π·ΠΎΡ€)

Π’ Π΄ΠΎΠΊΠ»Π°Π΄Π΅ прСдставлСны Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π·Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ SQL-запросов, ΠΊΠΎΠ³Π΄Π° ΠΈΡ… ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Ρ‹ Π² сутки, Π° ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… сСрвСров PostgreSQL β€” сотни.

КакиС тСхничСскиС Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π½Π°ΠΌ эффСктивно ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ объСм ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, ΠΈ ΠΊΠ°ΠΊ это ΠΎΠ±Π»Π΅Π³Ρ‡Π°Π΅Ρ‚ Тизнь ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°.


ΠšΠΎΠΌΡƒ интСрСсСн Ρ€Π°Π·Π±ΠΎΡ€ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΈ Ρ€Π°Π·Π½Ρ‹Π΅ Ρ‚Π΅Ρ…Π½ΠΈΠΊΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΉ SQL-запросов ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Ρ‚ΠΈΠΏΠΎΠ²Ρ‹Ρ… DBA-Π·Π°Π΄Π°Ρ‡ Π² PostgreSQL β€” ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с сСриСй статСй Π½Π° эту Ρ‚Π΅ΠΌΡƒ.

Массовая оптимизация запросов PostgreSQL. ΠšΠΈΡ€ΠΈΠ»Π» Π‘ΠΎΡ€ΠΎΠ²ΠΈΠΊΠΎΠ² (Π’Π΅Π½Π·ΠΎΡ€)
МСня Π·ΠΎΠ²ΡƒΡ‚ ΠšΠΈΡ€ΠΈΠ»Π» Π‘ΠΎΡ€ΠΎΠ²ΠΈΠΊΠΎΠ², я ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽ компанию Β«Π’Π΅Π½Π·ΠΎΡ€Β». ΠšΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ я ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡΡŒ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π΅ с Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π² нашСй ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ.

БСгодня я Π²Π°ΠΌ расскаТу, ΠΊΠ°ΠΊ ΠΌΡ‹ занимаСмся ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ запросов, ΠΊΠΎΠ³Π΄Π° Π²Π°ΠΌ Π½Π°Π΄ΠΎ Π½Π΅ Β«Ρ€Π°ΡΠΊΠΎΠ²Ρ‹Ρ€ΡΡ‚ΡŒΒ» ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Ρ‚ΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ запроса, Π° Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ массово. Когда запросов ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Ρ‹, ΠΈ Π²Π°ΠΌ Π½Π°Π΄ΠΎ Π½Π°ΠΉΡ‚ΠΈ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρ‹ ΠΊ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡŽ этой большой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹.

Π’ΠΎΠΎΠ±Ρ‰Π΅, Β«Π’Π΅Π½Π·ΠΎΡ€Β» для ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Π° Π½Π°ΡˆΠΈΡ… ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² β€” это Π‘Π‘Π˜Π‘ β€” нашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅: корпоративная ΡΠΎΡ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ ΡΠ΅Ρ‚ΡŒ, Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ для видСосвязи, для Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΎΠ±ΠΎΡ€ΠΎΡ‚Π° Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ ΠΈ внСшнСго, ΡƒΡ‡Π΅Ρ‚Π½Ρ‹Π΅ систСмы для Π±ΡƒΡ…Π³Π°Π»Ρ‚Π΅Ρ€ΠΈΠΈ ΠΈ склада,… Π’ΠΎ Π΅ΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ Β«ΠΌΠ΅Π³Π°ΠΊΠΎΠΌΠ±Π°ΠΉΠ½Β» для комплСксного управлСния бизнСсом, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ большС 100 Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ².

Π§Ρ‚ΠΎΠ±Ρ‹ всС ΠΎΠ½ΠΈ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ ΠΈ Ρ€Π°Π·Π²ΠΈΠ²Π°Π»ΠΈΡΡŒ β€” Ρƒ нас 10 Ρ†Π΅Π½Ρ‚Ρ€ΠΎΠ² Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΠΎ всСй странС, Π² Π½ΠΈΡ… β€” большС 1000 Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ².

Π‘ PostgreSQL ΠΌΡ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ с 2008 Π³ΠΎΠ΄Π° ΠΈ Π½Π°ΠΊΠΎΠΏΠΈΠ»ΠΈ большой объСм Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌ β€” это клиСнтскиС Π΄Π°Π½Π½Ρ‹Π΅, статистичСскиС, аналитичСскиС, Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСм β€” большС 400TB. Волько Β«Π² ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ΅Π½Π΅Β» ΠΎΠΊΠΎΠ»ΠΎ 250 сСрвСров, Π° суммарно Π‘Π”-сСрвСров, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠΌ β€” ΠΎΠΊΠΎΠ»ΠΎ 1000.

Массовая оптимизация запросов PostgreSQL. ΠšΠΈΡ€ΠΈΠ»Π» Π‘ΠΎΡ€ΠΎΠ²ΠΈΠΊΠΎΠ² (Π’Π΅Π½Π·ΠΎΡ€)

SQL β€” Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ язык. Π’Ρ‹ описываСтС Π½Π΅ Β«ΠΊΠ°ΠΊΒ» Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, Π° Β«Ρ‡Ρ‚ΠΎΒ» Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ. Π‘Π£Π‘Π” Π»ΡƒΡ‡ΡˆΠ΅ Π·Π½Π°Π΅Ρ‚ ΠΊΠ°ΠΊ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ JOIN β€” ΠΊΠ°ΠΊ ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ ваши Ρ‚Π°Π±Π»ΠΈΡ‡ΠΊΠΈ, ΠΊΠ°ΠΊΠΈΠ΅ условия Π½Π°Π»ΠΎΠΆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠΉΠ΄Π΅Ρ‚ ΠΏΠΎ индСксу, Ρ‡Ρ‚ΠΎ нСт…

НСкоторыС Π‘Π£Π‘Π” ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ подсказки: «НСт, Π²ΠΎΡ‚ эти Π΄Π²Π΅ Ρ‚Π°Π±Π»ΠΈΡ‡ΠΊΠΈ соСдиняй Π² Ρ‚Π°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈΒ», Π½ΠΎ PostgreSQL Ρ‚Π°ΠΊ Π½Π΅ ΡƒΠΌΠ΅Π΅Ρ‚. Π­Ρ‚ΠΎ осознанная позиция Π²Π΅Π΄ΡƒΡ‰ΠΈΡ… Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ²: Β«Π›ΡƒΡ‡ΡˆΠ΅ ΠΌΡ‹ Π΄ΠΎΠΏΠΈΠ»ΠΈΠΌ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ‚ΠΎΡ€ запроса, Ρ‡Π΅ΠΌ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΠΌ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊΠΈΠΌΠΈ-Ρ‚ΠΎ Ρ…ΠΈΠ½Ρ‚Π°ΠΌΠΈΒ».

Но, нСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ PostgreSQL Π½Π΅ Π΄Π°Π΅Ρ‚ «снаруТи» ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ собой, ΠΎΠ½ ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ позволяСт ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ происходит Ρƒ Π½Π΅Π³ΠΎ Β«Π²Π½ΡƒΡ‚Ρ€ΠΈΒ», ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ выполняСтС свой запрос, ΠΈ Π³Π΄Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ Ρƒ Π½Π΅Π³ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹.

Массовая оптимизация запросов PostgreSQL. ΠšΠΈΡ€ΠΈΠ»Π» Π‘ΠΎΡ€ΠΎΠ²ΠΈΠΊΠΎΠ² (Π’Π΅Π½Π·ΠΎΡ€)

Π’ΠΎΠΎΠ±Ρ‰Π΅, с ΠΊΠ°ΠΊΠΈΠΌΠΈ классичСскими ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ [ΠΊ DBA] ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ? Β«Π’ΠΎΡ‚ ΠΌΡ‹ Ρ‚ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ»ΠΈ запрос, ΠΈ Ρƒ нас всС ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ, всС повисло, Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ происходит… Π‘Π΅Π΄Π° какая-Ρ‚ΠΎ!Β»

ΠŸΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ ΠΏΠΎΡ‡Ρ‚ΠΈ всСгда ΠΎΠ΄Π½ΠΈ ΠΈ Ρ‚Π΅ ΠΆΠ΅:

  • нСэффСктивный Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ запроса
    Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ: «БСйчас я Π² SQL Π΅ΠΌΡƒ 10 Ρ‚Π°Π±Π»ΠΈΡ‡Π΅ΠΊ Ρ‡Π΅Ρ€Π΅Π· JOIN…Β» β€” ΠΈ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π΅Π³ΠΎ условия чудСсным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ эффСктивно «развяТутся», ΠΈ ΠΎΠ½ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ всС быстро. Но чудСс Π½Π΅ Π±Ρ‹Π²Π°Π΅Ρ‚, ΠΈ любая систСма ΠΏΡ€ΠΈ Ρ‚Π°ΠΊΠΎΠΉ вариативности (10 Ρ‚Π°Π±Π»ΠΈΡ† Π² ΠΎΠ΄Π½ΠΎΠΌ FROM) всСгда Π΄Π°Π΅Ρ‚ ΠΊΠ°ΠΊΡƒΡŽ-Ρ‚ΠΎ ΠΏΠΎΠ³Ρ€Π΅ΡˆΠ½ΠΎΡΡ‚ΡŒ. [ΡΡ‚Π°Ρ‚ΡŒΡ]
  • Π½Π΅Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ статистика
    ΠœΠΎΠΌΠ΅Π½Ρ‚ ΠΎΡ‡Π΅Π½ΡŒ Π°ΠΊΡ‚ΡƒΠ°Π»Π΅Π½ ΠΈΠΌΠ΅Π½Π½ΠΎ для PostgreSQL, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ большой датасСт Β«Π²Π»ΠΈΠ»ΠΈΒ» Π½Π° сСрвСр, Π΄Π΅Π»Π°Π΅Ρ‚Π΅ запрос β€” Π° ΠΎΠ½ Ρƒ вас «сСксканит» ΠΏΠΎ Ρ‚Π°Π±Π»ΠΈΡ‡ΠΊΠ΅. ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π²Ρ‡Π΅Ρ€Π° Π² Π½Π΅ΠΉ Π»Π΅ΠΆΠ°Π»ΠΎ 10 записСй, Π° сСгодня 10 ΠΌΠΈΠ»Π»ΠΈΠΎΠ½ΠΎΠ², Π½ΠΎ PostgreSQL ΠΎΠ± этом Π΅Ρ‰Π΅ Π½Π΅ Π² курсС, ΠΈ Π½Π°Π΄ΠΎ Π΅ΠΌΡƒ ΠΎΠ± этом ΠΏΠΎΠ΄ΡΠΊΠ°Π·Π°Ρ‚ΡŒ. [ΡΡ‚Π°Ρ‚ΡŒΡ]
  • Β«Π·Π°Ρ‚Ρ‹ΠΊΒ» ΠΏΠΎ рСсурсам
    Π’Ρ‹ поставили Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ ΠΈ Ρ‚ΡΠΆΠ΅Π»ΡƒΡŽ Π½Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½ΡƒΡŽ Π±Π°Π·Ρƒ поставили Π½Π° слабый сСрвСр, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚ диска, памяти, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ самого процСссора. И всС… Π“Π΄Π΅-Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠ»ΠΎΠΊ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, Π²Ρ‹ΡˆΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π²Ρ‹ ΠΏΡ€Ρ‹Π³Π½ΡƒΡ‚ΡŒ ΡƒΠΆΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅.
  • Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ
    Π‘Π»ΠΎΠΆΠ½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚, Π½ΠΎ ΠΎΠ½ΠΈ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ для Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… запросов (INSERT, UPDATE, DELETE) β€” это ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Π°Ρ большая Ρ‚Π΅ΠΌΠ°.

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΏΠ»Π°Π½Π°

… А для всСго ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ ΠΏΠ»Π°Π½! Нам Π½ΡƒΠΆΠ½ΠΎ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ происходит Π²Π½ΡƒΡ‚Ρ€ΠΈ сСрвСра.

Массовая оптимизация запросов PostgreSQL. ΠšΠΈΡ€ΠΈΠ»Π» Π‘ΠΎΡ€ΠΎΠ²ΠΈΠΊΠΎΠ² (Π’Π΅Π½Π·ΠΎΡ€)

План выполнСния запроса для PostgreSQL β€” это Π΄Π΅Ρ€Π΅Π²ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° выполнСния запроса Π² тСкстовом прСдставлСнии. ИмСнно Ρ‚ΠΎΠ³ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π°Π½Π°Π»ΠΈΠ·Π° ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠΎΠΌ Π±Ρ‹Π» ΠΏΡ€ΠΈΠ·Π½Π°Π½ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ эффСктивным.

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΡƒΠ·Π΅Π» Π΄Π΅Ρ€Π΅Π²Π° β€” опСрация: ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈΠ»ΠΈ индСкса, построСниС Π±ΠΈΡ‚ΠΎΠ²ΠΎΠΉ ΠΊΠ°Ρ€Ρ‚Ρ‹, соСдинСниС Π΄Π²ΡƒΡ… Ρ‚Π°Π±Π»ΠΈΡ†, объСдинСниС, пСрСсСчСниС ΠΈΠ»ΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π²Ρ‹Π±ΠΎΡ€ΠΎΠΊ. Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ запроса β€” ΠΏΡ€ΠΎΡ…ΠΎΠ΄ ΠΏΠΎ ΡƒΠ·Π»Π°ΠΌ этого Π΄Π΅Ρ€Π΅Π²Π°.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΠ»Π°Π½ запроса, самый простой способ β€” Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ EXPLAIN. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ со всСми Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π½Π° самом Π΄Π΅Π»Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ запрос Π½Π° Π±Π°Π·Π΅ β€” EXPLAIN (ANALYZE, BUFFERS) SELECT ....

ΠŸΠ»ΠΎΡ…ΠΎΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚: ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Π΅Π³ΠΎ выполняСтС, это происходит «здСсь ΠΈ сСйчас», поэтому ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для локальной ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ. Если ΠΆΠ΅ Π²Ρ‹ Π±Π΅Ρ€Π΅Ρ‚Π΅ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ высоконагруТСнный сСрвСр, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ стоит ΠΏΠΎΠ΄ ΡΠΈΠ»ΡŒΠ½Ρ‹ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈ Π²ΠΈΠ΄ΠΈΡ‚Π΅: «Ай! Π’ΠΎΡ‚ Ρ‚ΡƒΡ‚ Ρƒ нас ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ выполнялся запрос.Β» ΠŸΠΎΠ»Ρ‡Π°ΡΠ°, час Π½Π°Π·Π°Π΄ β€” ΠΏΠΎΠΊΠ° Π²Ρ‹ Π±Π΅Π³Π°Π»ΠΈ ΠΈ доставали этот запрос ΠΈΠ· Π»ΠΎΠ³ΠΎΠ², нСсли Π΅Π³ΠΎ снова Π½Π° сСрвСр, Ρƒ вас вСсь датасСт ΠΈ статистика измСнились. Π’Ρ‹ Π΅Π³ΠΎ выполняСтС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚Π»Π°Π΄ΠΈΡ‚ΡŒ β€” Π° ΠΎΠ½ выполняСтся быстро! И Π²Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ½ΡΡ‚ΡŒ Β«ΠΏΠΎΡ‡Π΅ΠΌΡƒΒ», ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π±Ρ‹Π»ΠΎ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ.

Массовая оптимизация запросов PostgreSQL. ΠšΠΈΡ€ΠΈΠ»Π» Π‘ΠΎΡ€ΠΎΠ²ΠΈΠΊΠΎΠ² (Π’Π΅Π½Π·ΠΎΡ€)

Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ Ρ€ΠΎΠ²Π½ΠΎ Π² Ρ‚ΠΎΡ‚ ΠΌΠΎΠΌΠ΅Π½Ρ‚, ΠΊΠΎΠ³Π΄Π° запрос выполняСтся Π½Π° сСрвСрС, ΡƒΠΌΠ½Ρ‹Π΅ люди написали ΠΌΠΎΠ΄ΡƒΠ»ΡŒ auto_explain. Он присутствуСт практичСски Π²ΠΎ всСх Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ распространСнных дистрибутивах PostgreSQL, ΠΈ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ просто Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³-Ρ„Π°ΠΉΠ»Π΅.

Если ΠΎΠ½ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ запрос выполняСтся дольшС Ρ‚ΠΎΠΉ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π²Ρ‹ Π΅ΠΌΡƒ сказали, ΠΎΠ½ Π΄Π΅Π»Π°Π΅Ρ‚ «снимок» ΠΏΠ»Π°Π½Π° этого запроса ΠΈ ΠΏΠΈΡˆΠ΅Ρ‚ ΠΈΡ… вмСстС Π² Π»ΠΎΠ³.

Массовая оптимизация запросов PostgreSQL. ΠšΠΈΡ€ΠΈΠ»Π» Π‘ΠΎΡ€ΠΎΠ²ΠΈΠΊΠΎΠ² (Π’Π΅Π½Π·ΠΎΡ€)

Π’Ρ€ΠΎΠ΄Π΅ всС Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΎ, ΠΈΠ΄Π΅ΠΌ Π² Π»ΠΎΠ³ ΠΈ Π²ΠΈΠ΄ΠΈΠΌ там… [портянка тСкста]. Но ΡΠΊΠ°Π·Π°Ρ‚ΡŒ Π½ΠΈΡ‡Π΅Π³ΠΎ ΠΏΡ€ΠΎ Π½Π΅Π³ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ, ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ Ρ„Π°ΠΊΡ‚Π°, Ρ‡Ρ‚ΠΎ это ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΉ ΠΏΠ»Π°Π½, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ выполнялся 11мс.

Π’Ρ€ΠΎΠ΄Π΅ всС Ρ…ΠΎΡ€ΠΎΡˆΠΎ β€” Π½ΠΎ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ понятно, Ρ‡Ρ‚ΠΎ Π½Π° самом Π΄Π΅Π»Π΅ происходило. ΠšΡ€ΠΎΠΌΠ΅ ΠΎΠ±Ρ‰Π΅Π³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ особо Π½ΠΈΡ‡Π΅Π³ΠΎ ΠΈ Π½Π΅ Π²ΠΈΠ΄ΠΈΠΌ. ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° Ρ‚Π°ΠΊΡƒΡŽ Β«Π»Π°Ρ‚ΡƒΡ…ΡƒΒ» plain text Π²ΠΎΠΎΠ±Ρ‰Π΅ нСнаглядно.

Но Π΄Π°ΠΆΠ΅ ΠΏΡƒΡΡ‚ΡŒ нСнаглядно, ΠΏΡƒΡΡ‚ΡŒ Π½Π΅ΡƒΠ΄ΠΎΠ±Π½ΠΎ, Π½ΠΎ Π΅ΡΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΊΠ°ΠΏΠΈΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹:

  • Π’ ΡƒΠ·Π»Π΅ указываСтся сумма ΠΏΠΎ рСсурсам всСго ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²Π° ΠΏΠΎΠ΄ Π½ΠΈΠΌ. Π’ΠΎ Π΅ΡΡ‚ΡŒ просто Ρ‚Π°ΠΊ ΡƒΠ·Π½Π°Ρ‚ΡŒ, сколько Π²ΠΎΡ‚ Ρ‚ΡƒΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ Π½Π° этом Index Scan Π±Ρ‹Π»ΠΎ ΠΏΠΎΡ‚Ρ€Π°Ρ‡Π΅Π½ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ β€” нСльзя, Ссли ΠΏΠΎΠ΄ Π½ΠΈΠΌ Π΅ΡΡ‚ΡŒ ΠΊΠ°ΠΊΠΎΠ΅-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ΅ условиС. ΠœΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ динамичСски ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, Π½Π΅Ρ‚ Π»ΠΈ Π²Π½ΡƒΡ‚Ρ€ΠΈ Β«Π΄Π΅Ρ‚Π΅ΠΉΒ» ΠΈ условных ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, CTE β€” ΠΈ Π²Ρ‹Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ это всС Β«Π² ΡƒΠΌΠ΅Β».
  • Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚: врСмя, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ указываСтся Π½Π° ΡƒΠ·Π»Π΅, β€” это врСмя ΠΎΠ΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎΠ³ΠΎ выполнСния ΡƒΠ·Π»Π°. Если этот ΡƒΠ·Π΅Π» выполнялся Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ†ΠΈΠΊΠ»Π° ΠΏΠΎ записям Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, нСсколько Ρ€Π°Π·, Ρ‚ΠΎ Π² ΠΏΠ»Π°Π½Π΅ увСличиваСтся количСство loops β€” Ρ†ΠΈΠΊΠ»ΠΎΠ² этого ΡƒΠ·Π»Π°. Но само врСмя Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΠΎΠ³ΠΎ выполнСния остаСтся Π² ΠΏΠ»Π°Π½Π΅ ΠΏΡ€Π΅ΠΆΠ½ΠΈΠΌ. Π’ΠΎ Π΅ΡΡ‚ΡŒ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Π° сколько ΠΆΠ΅ этот ΡƒΠ·Π΅Π» выполнялся всСго суммарно, Π½Π°Π΄ΠΎ ΠΎΠ΄Π½ΠΎ ΡƒΠΌΠ½ΠΎΠΆΠ°Ρ‚ΡŒ Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠ΅ β€” ΠΎΠΏΡΡ‚ΡŒ-Ρ‚Π°ΠΊΠΈ Β«Π² ΡƒΠΌΠ΅Β».

ΠŸΡ€ΠΈ Ρ‚Π°ΠΊΠΈΡ… раскладах ΠΏΠΎΠ½ΡΡ‚ΡŒ Β«ΠšΡ‚ΠΎ самоС слабоС Π·Π²Π΅Π½ΠΎ?Β» практичСски Π½Π΅Ρ€Π΅Π°Π»ΡŒΠ½ΠΎ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π΄Π°ΠΆΠ΅ сами Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Π² Β«ΠΌΠ°Π½ΡƒΠ°Π»Π΅Β» ΠΏΠΈΡˆΡƒΡ‚, Ρ‡Ρ‚ΠΎ «ПониманиС ΠΏΠ»Π°Π½Π° β€” это искусство, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π½Π°Π΄ΠΎ ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ, ΠΎΠΏΡ‹Ρ‚…Β».

Но Ρƒ нас 1000 Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ², ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΠΈΠ· Π½ΠΈΡ… этот ΠΎΠΏΡ‹Ρ‚ Π½Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡˆΡŒ Π² Π³ΠΎΠ»ΠΎΠ²Ρƒ. Π―, Ρ‚Ρ‹, ΠΎΠ½ β€” Π·Π½Π°ΡŽΡ‚, Π° ΠΊΡ‚ΠΎ-Ρ‚ΠΎ Π²ΠΎΠ½ Ρ‚Π°ΠΌ β€” ΡƒΠΆΠ΅ Π½Π΅Ρ‚. ΠœΠΎΠΆΠ΅Ρ‚, ΠΎΠ½ научится, Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈ Π½Π΅Ρ‚, Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π΅ΠΌΡƒ Π½Π°Π΄ΠΎ ΡƒΠΆΠ΅ сСйчас β€” Π° ΠΎΡ‚ΠΊΡƒΠ΄Π° Π±Ρ‹ Π΅ΠΌΡƒ Π²Π·ΡΡ‚ΡŒ этот ΠΎΠΏΡ‹Ρ‚.

Визуализация ΠΏΠ»Π°Π½Π°

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΡ‹ поняли β€” Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒΡΡ с этими ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ, Π½Π°ΠΌ Π½ΡƒΠΆΠ½Π° Ρ…ΠΎΡ€ΠΎΡˆΠ°Ρ визуализация ΠΏΠ»Π°Π½Π°. [ΡΡ‚Π°Ρ‚ΡŒΡ]

Массовая оптимизация запросов PostgreSQL. ΠšΠΈΡ€ΠΈΠ»Π» Π‘ΠΎΡ€ΠΎΠ²ΠΈΠΊΠΎΠ² (Π’Π΅Π½Π·ΠΎΡ€)

ΠœΡ‹ пошли сначала Β«ΠΏΠΎ Ρ€Ρ‹Π½ΠΊΡƒΒ» β€” Π΄Π°Π²Π°ΠΉΡ‚Π΅-ΠΊΠ° Π² ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π΅ ΠΏΠΎΠΈΡ‰Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π²ΠΎΠΎΠ±Ρ‰Π΅ сущСствуСт.

Но, оказалось, Ρ‡Ρ‚ΠΎ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Β«ΠΆΠΈΠ²Ρ‹Ρ…Β» Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΠΎΠ»Π΅Π΅-ΠΌΠ΅Π½Π΅Π΅ Ρ€Π°Π·Π²ΠΈΠ²Π°ΡŽΡ‚ΡΡ, совсСм ΠΌΠ°Π»ΠΎ β€” Π±ΡƒΠΊΠ²Π°Π»ΡŒΠ½ΠΎ, ΠΎΠ΄Π½ΠΎ: explain.depesz.com ΠΎΡ‚ Hubert Lubaczewski. На Π²Ρ…ΠΎΠ΄ Π² ΠΏΠΎΠ»Π΅ Β«ΡΠΊΠ°Ρ€ΠΌΠ»ΠΈΠ²Π°Π΅ΡˆΡŒΒ» тСкстовоС прСдставлСниС ΠΏΠ»Π°Π½Π°, ΠΎΠ½ Ρ‚Π΅Π±Π΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ‚Π°Π±Π»ΠΈΡ‡ΠΊΡƒ с Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π½Π½Ρ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ:

  • собствСнноС врСмя ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΡƒΠ·Π»Π°
  • врСмя суммарноС ΠΏΠΎ всСму ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²Ρƒ
  • количСство записСй, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±Ρ‹Π»ΠΎ ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΎ, ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ статистичСски оТидалось
  • само Ρ‚Π΅Π»ΠΎ ΡƒΠ·Π»Π°

Π’Π°ΠΊΠΆΠ΅ Ρƒ этого сСрвиса Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π΄Π΅Π»ΠΈΡ‚ΡŒΡΡ Π°Ρ€Ρ…ΠΈΠ²ΠΎΠΌ ссылок. Π’Ρ‹ ΠΊΠΈΠ½ΡƒΠ» Ρ‚ΡƒΠ΄Π° свой ΠΏΠ»Π°Π½ ΠΈ Π³ΠΎΠ²ΠΎΡ€ΠΈΡˆΡŒ: Β«Π­ΠΉ, Вася, Π²ΠΎΡ‚ Ρ‚Π΅Π±Π΅ ссылка, Ρ‚Π°ΠΌ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π½Π΅ Ρ‚Π°ΠΊΒ».

Массовая оптимизация запросов PostgreSQL. ΠšΠΈΡ€ΠΈΠ»Π» Π‘ΠΎΡ€ΠΎΠ²ΠΈΠΊΠΎΠ² (Π’Π΅Π½Π·ΠΎΡ€)

Но Π΅ΡΡ‚ΡŒ ΠΈ нСбольшиС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹.

Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Π³Ρ€ΠΎΠΌΠ°Π΄Π½ΠΎΠ΅ количСство «копипасты». Π’Ρ‹ Π±Π΅Ρ€Π΅ΡˆΡŒ кусок Π»ΠΎΠ³Π°, Π·Π°ΡΠΎΠ²Ρ‹Π²Π°Π΅ΡˆΡŒ Ρ‚ΡƒΠ΄Π°, ΠΈ снова, ΠΈ снова.

Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, Π½Π΅Ρ‚ Π°Π½Π°Π»ΠΈΠ·Π° количСства ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… β€” Ρ‚Π΅Ρ… самых buffers, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ EXPLAIN (ANALYZE, BUFFERS), Ρ‚ΡƒΡ‚ ΠΌΡ‹ Π½Π΅ Π²ΠΈΠ΄ΠΈΠΌ. Он просто Π½Π΅ ΡƒΠΌΠ΅Π΅Ρ‚ ΠΈΡ… Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒ, ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΈ с Π½ΠΈΠΌΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ. Когда Π²Ρ‹ Ρ‡ΠΈΡ‚Π°Π΅Ρ‚Π΅ ΠΌΠ½ΠΎΠ³ΠΎ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Β«Ρ€Π°Π·Π»ΠΎΠΆΠΈΡ‚ΡŒΡΡΒ» ΠΏΠΎ диску ΠΈ ΠΊΡΡˆΡƒ Π² памяти, эта информация ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½Π°.

Π’Ρ€Π΅Ρ‚ΠΈΠΉ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ β€” ΠΎΡ‡Π΅Π½ΡŒ слабоС Ρ€Π°Π·Π²ΠΈΡ‚ΠΈΠ΅ этого ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. ΠšΠΎΠΌΠΌΠΈΡ‚Ρ‹ ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ΅Π»ΠΊΠΈΠ΅, Ρ…ΠΎΡ€ΠΎΡˆΠΎ Ссли Ρ€Π°Π· Π² ΠΏΠΎΠ»Π³ΠΎΠ΄Π°, ΠΈ ΠΊΠΎΠ΄ Π½Π° Perl’Π΅.

Массовая оптимизация запросов PostgreSQL. ΠšΠΈΡ€ΠΈΠ»Π» Π‘ΠΎΡ€ΠΎΠ²ΠΈΠΊΠΎΠ² (Π’Π΅Π½Π·ΠΎΡ€)

Но это всС Β«Π»ΠΈΡ€ΠΈΠΊΠ°Β», с этим ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΊΠ°ΠΊ-Ρ‚ΠΎ ΠΆΠΈΡ‚ΡŒ, Π½ΠΎ Π΅ΡΡ‚ΡŒ ΠΎΠ΄Π½Π° Π²Π΅Ρ‰ΡŒ, которая нас сильно ΠΎΡ‚Π²Π΅Ρ€Π½ΡƒΠ»Π° ΠΎΡ‚ этого сСрвиса. Π­Ρ‚ΠΎ ошибки Π°Π½Π°Π»ΠΈΠ·Π° Common Table Expression (CTE) ΠΈ Ρ€Π°Π·Π½Ρ‹Ρ… динамичСских ΡƒΠ·Π»ΠΎΠ² Π²Ρ€ΠΎΠ΄Π΅ InitPlan/SubPlan.

Если Π²Π΅Ρ€ΠΈΡ‚ΡŒ этой ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ΅, Ρ‚ΠΎ Ρƒ нас суммарноС врСмя выполнСния ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΡƒΠ·Π»Π° большС, Ρ‡Π΅ΠΌ ΠΎΠ±Ρ‰Π΅Π΅ врСмя выполнСния всСго запроса. ВсС просто β€” ΠΈΠ· ΡƒΠ·Π»Π° CTE Scan Π½Π΅ Π²Ρ‹Ρ‡Π»ΠΈ врСмя Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ этой CTE. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΡ‹ ΡƒΠΆΠ΅ Π½Π΅ Π·Π½Π°Π΅ΠΌ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ ΠΎΡ‚Π²Π΅Ρ‚Π°, сколько ΠΆΠ΅ заняло само сканированиС CTE.

Массовая оптимизация запросов PostgreSQL. ΠšΠΈΡ€ΠΈΠ»Π» Π‘ΠΎΡ€ΠΎΠ²ΠΈΠΊΠΎΠ² (Π’Π΅Π½Π·ΠΎΡ€)

Π’ΡƒΡ‚ ΠΌΡ‹ поняли, Ρ‡Ρ‚ΠΎ ΠΏΠΎΡ€Π° ΠΏΠΈΡΠ°Ρ‚ΡŒ своС β€” ΡƒΡ€Π°-ΡƒΡ€Π°! ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚: «БСйчас ΠΌΡ‹ своС напишСм, супСр просто Π±ΡƒΠ΄Π΅Ρ‚!Β»

Взяли Ρ‚ΠΈΠΏΠΈΡ‡Π½Ρ‹ΠΉ для web-сСрвисов стСк: ядро Π½Π° Node.js + Express, натянули Bootstrap ΠΈ для Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠΎΠΊ красивых β€” D3.js. И наши оТидания Π²ΠΏΠΎΠ»Π½Π΅ ΠΎΠΏΡ€Π°Π²Π΄Π°Π»ΠΈΡΡŒ β€” ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Π·Π° 2 Π½Π΅Π΄Π΅Π»ΠΈ:

  • собствСнный парсСр ΠΏΠ»Π°Π½Π°
    Π’ΠΎ Π΅ΡΡ‚ΡŒ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²ΠΎΠΎΠ±Ρ‰Π΅ любой ΠΏΠ»Π°Π½ Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒ ΠΈΠ· Ρ‚Π΅Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ PostgreSQL.
  • ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΉ Π°Π½Π°Π»ΠΈΠ· динамичСских ΡƒΠ·Π»ΠΎΠ² β€” CTE Scan, InitPlan, SubPlan
  • Π°Π½Π°Π»ΠΈΠ· распрСдСлСния buffers β€” Π³Π΄Π΅ страницы Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· памяти Ρ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ, Π³Π΄Π΅ ΠΈΠ· локального кэша, Π³Π΄Π΅ с диска
  • ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Π½Π°Π³Π»ΡΠ΄Π½ΠΎΡΡ‚ΡŒ
    Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π² Π»ΠΎΠ³Π΅ всС Π²ΠΎΡ‚ это Π²ΠΎΡ‚ Β«ΠΊΠΎΠΏΠ°Ρ‚ΡŒΒ», Π° Π²ΠΈΠ΄Π΅Ρ‚ΡŒ «самоС слабоС Π·Π²Π΅Π½ΠΎΒ» сразу Π½Π° ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ΅.

Массовая оптимизация запросов PostgreSQL. ΠšΠΈΡ€ΠΈΠ»Π» Π‘ΠΎΡ€ΠΎΠ²ΠΈΠΊΠΎΠ² (Π’Π΅Π½Π·ΠΎΡ€)

ΠœΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊΡƒΡŽ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ β€” сразу с подсвСткой синтаксиса. Но ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ наши Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΡƒΠΆΠ΅ Π½Π΅ с ΠΏΠΎΠ»Π½Ρ‹ΠΌ прСдставлСниСм ΠΏΠ»Π°Π½Π°, Π° с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠΊΠΎΡ€ΠΎΡ‡Π΅. Π’Π΅Π΄ΡŒ всС Ρ†ΠΈΡ„Π΅Ρ€ΠΊΠΈ ΠΌΡ‹ ΡƒΠΆΠ΅ распарсили ΠΈ Π² сторону ΠΈΡ… Π½Π°Π»Π΅Π²ΠΎ-Π½Π°ΠΏΡ€Π°Π²ΠΎ Π·Π°ΠΊΠΈΠ½ΡƒΠ»ΠΈ, Π° посСрСдинС оставили Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π²ΡƒΡŽ строчку, Ρ‡Ρ‚ΠΎ это Π·Π° ΡƒΠ·Π΅Π»: CTE Scan, гСнСрация CTE ΠΈΠ»ΠΈ Seq Scan ΠΏΠΎ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ Ρ‚Π°Π±Π»ΠΈΡ‡ΠΊΠ΅.

Π’ΠΎΡ‚ это прСдставлСниС сокращСнноС ΠΌΡ‹ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌ шаблоном ΠΏΠ»Π°Π½Π°.

Массовая оптимизация запросов PostgreSQL. ΠšΠΈΡ€ΠΈΠ»Π» Π‘ΠΎΡ€ΠΎΠ²ΠΈΠΊΠΎΠ² (Π’Π΅Π½Π·ΠΎΡ€)

Π§Ρ‚ΠΎ Π΅Ρ‰Π΅ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΡƒΠ΄ΠΎΠ±Π½ΠΎ? Π‘Ρ‹Π»ΠΎ Π±Ρ‹ ΡƒΠ΄ΠΎΠ±Π½ΠΎ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, какая доля Π½Π° ΠΊΠ°ΠΊΠΎΠΉ ΡƒΠ·Π΅Π» ΠΎΡ‚ ΠΎΠ±Ρ‰Π΅Π³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Ρƒ нас распрСдСляСтся β€” ΠΈ просто Β«ΠΏΡ€ΠΈΠΊΠ»Π΅ΠΈΠ»ΠΈΒ» сбоку pie chart.

Наводим Π½Π° ΡƒΠ·Π΅Π» ΠΈ Π²ΠΈΠ΄ΠΈΠΌ β€” Ρƒ нас, оказываСтся Seq Scan ΠΎΡ‚ всСго Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ занял мСньшС Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚ΠΈ, Π° ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ 3/4 Ρƒ нас занял CTE Scan. УТас! Π­Ρ‚ΠΎ малСнькоС Π·Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ ΠΏΠΎ ΠΏΠΎΠ²ΠΎΠ΄Ρƒ Β«ΡΠΊΠΎΡ€ΠΎΡΡ‚Ρ€Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈΒ» CTE Scan, Ссли Π²Ρ‹ ΠΈΡ… Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Π² своих запросах. Они Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ быстрыС β€” ΠΎΠ½ΠΈ ΠΏΡ€ΠΎΠΈΠ³Ρ€Ρ‹Π²Π°ΡŽΡ‚ Π΄Π°ΠΆΠ΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌΡƒ Ρ‚Π°Π±Π»ΠΈΡ‡Π½ΠΎΠΌΡƒ ΡΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ. [ΡΡ‚Π°Ρ‚ΡŒΡ] [ΡΡ‚Π°Ρ‚ΡŒΡ]

Но ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Ρ‚Π°ΠΊΠΈΠ΅ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡ‹ Π±Ρ‹Π²Π°ΡŽΡ‚ поинтСрСснСС, послоТнСС, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ сразу Π½Π°Π²ΠΎΠ΄ΠΈΠΌ Π½Π° сСгмСнт, ΠΈ Π²ΠΈΠ΄ΠΈΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‡Ρ‚ΠΎ большС ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρ‹ всСго Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ Seq Scan «съСл». Π”Π° Π΅Ρ‰Π΅ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ‚Π°ΠΌ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ Filter Π±Ρ‹Π», ΠΊΡƒΡ‡Π° записСй ΠΎΡ‚Π±Ρ€ΠΎΡˆΠ΅Π½ΠΎ ΠΏΠΎ нСму… МоТно Π²ΠΎΡ‚ эту ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ прямо ΠΊΠΈΠ΄Π°Ρ‚ΡŒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ ΠΈ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ: «Вася, Ρƒ тСбя Ρ‚ΡƒΡ‚ Π²ΠΎΠΎΠ±Ρ‰Π΅ всС ΠΏΠ»ΠΎΡ…ΠΎ! Π Π°Π·Π±Π΅Ρ€ΠΈΡΡŒ, посмотри β€” Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π½Π΅ Ρ‚Π°ΠΊ!Β»

Массовая оптимизация запросов PostgreSQL. ΠšΠΈΡ€ΠΈΠ»Π» Π‘ΠΎΡ€ΠΎΠ²ΠΈΠΊΠΎΠ² (Π’Π΅Π½Π·ΠΎΡ€)

ЕстСствСнно, Π±Π΅Π· Β«Π³Ρ€Π°Π±Π»Π΅ΠΉΒ» Π½Π΅ обошлось.

ΠŸΠ΅Ρ€Π²ΠΎΠ΅ Π½Π° Ρ‡Ρ‚ΠΎ «наступили» β€” это ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° округлСния. ВрСмя ΡƒΠ·Π»Π° ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π² ΠΏΠ»Π°Π½Π΅ указываСтся с Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ Π΄ΠΎ 1мкс. И ΠΊΠΎΠ³Π΄Π° количСство Ρ†ΠΈΠΊΠ»ΠΎΠ² ΡƒΠ·Π»Π° ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Π΅Ρ‚, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, 1000 β€” послС выполнСния PostgreSQL ΠΏΠΎΠ΄Π΅Π»ΠΈΠ» «с Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ Π΄ΠΎΒ», Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ расчСтС ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΎΠ±Ρ‰Π΅Π΅ врСмя Β«Π³Π΄Π΅-Ρ‚ΠΎ ΠΌΠ΅ΠΆΠ΄Ρƒ 0.95мс ΠΈ 1.05мс». Когда счСт ΠΈΠ΄Π΅Ρ‚ Π½Π° микросСкунды β€” Π΅Ρ‰Π΅ Π½ΠΈΡ‡Π΅Π³ΠΎ, Π° Π²ΠΎΡ‚ ΠΊΠΎΠ³Π΄Π° ΡƒΠΆΠ΅ Π½Π° [ΠΌΠΈΠ»Π»ΠΈ]сСкунды β€” приходится ΠΏΡ€ΠΈ «развязывании» рСсурсов ΠΏΠΎ ΡƒΠ·Π»Π°ΠΌ ΠΏΠ»Π°Π½Π° Β«ΠΊΡ‚ΠΎ Ρƒ ΠΊΠΎΠ³ΠΎ сколько ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΠ»Β» эту ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ.

Массовая оптимизация запросов PostgreSQL. ΠšΠΈΡ€ΠΈΠ»Π» Π‘ΠΎΡ€ΠΎΠ²ΠΈΠΊΠΎΠ² (Π’Π΅Π½Π·ΠΎΡ€)

Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚, Π±ΠΎΠ»Π΅Π΅ слоТный, это распрСдСлСниС рСсурсов (Ρ‚Π΅Ρ… самых buffers) ΠΏΠΎ динамичСским ΡƒΠ·Π»Π°ΠΌ. Π­Ρ‚ΠΎ стоило Π½Π°ΠΌ ΠΊ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ 2 нСдСлям Π½Π° ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ Π΅Ρ‰Π΅ плюсом Π½Π΅Π΄Π΅Π»ΠΈ 4.

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ Ρ‚Π°ΠΊΡƒΡŽ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ достаточно просто β€” Π΄Π΅Π»Π°Π΅ΠΌ CTE ΠΈ Π² Π½Π΅ΠΉ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ якобы Ρ‡ΠΈΡ‚Π°Π΅ΠΌ. На самом Π΄Π΅Π»Π΅, PostgreSQL Β«ΡƒΠΌΠ½Ρ‹ΠΉΒ» ΠΈ Π½ΠΈΡ‡Π΅Π³ΠΎ прямо Ρ‚Π°ΠΌ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚. ΠŸΠΎΡ‚ΠΎΠΌ ΠΌΡ‹ ΠΈΠ· Π½Π΅Π΅ Π±Π΅Ρ€Π΅ΠΌ ΠΏΠ΅Ρ€Π²ΡƒΡŽ запись, Π° ΠΊ Π½Π΅ΠΉ β€” сто ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΈΠ· Ρ‚ΠΎΠΉ ΠΆΠ΅ самой CTE.

Массовая оптимизация запросов PostgreSQL. ΠšΠΈΡ€ΠΈΠ»Π» Π‘ΠΎΡ€ΠΎΠ²ΠΈΠΊΠΎΠ² (Π’Π΅Π½Π·ΠΎΡ€)

Π‘ΠΌΠΎΡ‚Ρ€ΠΈΠΌ ΠΏΠ»Π°Π½ ΠΈ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅ΠΌ β€” странно, Ρƒ нас 3 buffers (страницы Π΄Π°Π½Π½Ρ‹Ρ…) Π±Ρ‹Π»ΠΈ Β«ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½Ρ‹Β» Π² Seq Scan, Π΅Ρ‰Π΅ 1 Π² CTE Scan, ΠΈ Π΅Ρ‰Π΅ 2 Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ CTE Scan. Π’ΠΎ Π΅ΡΡ‚ΡŒ Ссли всС просто ΠΏΡ€ΠΎΡΡƒΠΌΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρƒ нас получится 6, Π½ΠΎ ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ‡ΠΊΠΈ-Ρ‚ΠΎ ΠΌΡ‹ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π»ΠΈ всСго 3! CTE Scan вСдь Π½ΠΈΡ‡Π΅Π³ΠΎ Π½ΠΈΠΎΡ‚ΠΊΡƒΠ΄Π° Π½Π΅ Ρ‡ΠΈΡ‚Π°Π΅Ρ‚, Π° Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ прямо с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ процСсса. Π’ΠΎ Π΅ΡΡ‚ΡŒ здСсь явно Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π½Π΅ Ρ‚Π°ΠΊ!

На самом-Ρ‚ΠΎ Π΄Π΅Π»Π΅ получаСтся, Ρ‡Ρ‚ΠΎ здСсь всС Ρ‚Π΅ 3 страницы Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ Π·Π°ΠΏΡ€ΠΎΡˆΠ΅Π½Ρ‹ Ρƒ Seq Scan, сначала 1 попросил 1-ΠΉ CTE Scan, Π° ΠΏΠΎΡ‚ΠΎΠΌ 2-ΠΉ, ΠΈ Π΅ΠΌΡƒ Π΄ΠΎΡ‡ΠΈΡ‚Π°Π»ΠΈ Π΅Ρ‰Π΅ 2. Π’ΠΎ Π΅ΡΡ‚ΡŒ всСго Π±Ρ‹Π»ΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½ΠΎ 3 страницы Π΄Π°Π½Π½Ρ‹Ρ…, Π° Π½Π΅ 6.

Массовая оптимизация запросов PostgreSQL. ΠšΠΈΡ€ΠΈΠ»Π» Π‘ΠΎΡ€ΠΎΠ²ΠΈΠΊΠΎΠ² (Π’Π΅Π½Π·ΠΎΡ€)

И эта ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΈΠ²Π΅Π»Π° нас ΠΊ пониманию, Ρ‡Ρ‚ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠ»Π°Π½Π° β€” это ΡƒΠΆΠ΅ Π½Π΅ Π΄Π΅Ρ€Π΅Π²ΠΎ, Π° просто ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ацикличСский Π³Ρ€Π°Ρ„. И Ρƒ нас ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»Π°ΡΡŒ Π²ΠΎΡ‚ такая ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΡ‹ ΠΏΠΎΠ½ΠΈΠΌΠ°Π»ΠΈ Β«Ρ‡Ρ‚ΠΎ-ΠΎΡ‚ΠΊΡƒΠ΄Π° Π²ΠΎΠΎΠ±Ρ‰Π΅ ΠΏΡ€ΠΈΡˆΠ»ΠΎΒ». Π’ΠΎ Π΅ΡΡ‚ΡŒ Π²ΠΎΡ‚ здСсь ΠΌΡ‹ создали CTE ΠΈΠ· pg_class, ΠΈ Π΄Π²Π° Ρ€Π°Π·Π° Π΅Π΅ попросили, ΠΈ практичСски всС врСмя Ρƒ нас ΡƒΡˆΠ»ΠΎ ΠΏΠΎ Π²Π΅Ρ‚ΠΊΠ΅, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ просили Π΅Π΅ 2ΠΉ Ρ€Π°Π·. ΠŸΠΎΠ½ΡΡ‚Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ 101-ю запись β€” это Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΠΎΡ€ΠΎΠΆΠ΅, Ρ‡Π΅ΠΌ просто 1-ю ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ‡ΠΊΠΈ.

Массовая оптимизация запросов PostgreSQL. ΠšΠΈΡ€ΠΈΠ»Π» Π‘ΠΎΡ€ΠΎΠ²ΠΈΠΊΠΎΠ² (Π’Π΅Π½Π·ΠΎΡ€)

ΠœΡ‹ Π½Π° ΠΊΠ°ΠΊΠΎΠ΅-Ρ‚ΠΎ врСмя Π²Ρ‹Π΄ΠΎΡ…Π½ΡƒΠ»ΠΈ. Π‘ΠΊΠ°Π·Π°Π»ΠΈ: Β«Π’Π΅ΠΏΠ΅Ρ€ΡŒ, НСо, Ρ‚Ρ‹ знаСшь ΠΊΡƒΠ½Π³-Ρ„Ρƒ! Π’Π΅ΠΏΠ΅Ρ€ΡŒ наш ΠΎΠΏΡ‹Ρ‚ Ρƒ тСбя прямо Π½Π° экранС. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρ‚Ρ‹ моТСшь ΠΈΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ.Β» [ΡΡ‚Π°Ρ‚ΡŒΡ]

ΠšΠΎΠ½ΡΠΎΠ»ΠΈΠ΄Π°Ρ†ΠΈΡ Π»ΠΎΠ³ΠΎΠ²

Наши 1000 Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΎΠ±Π»Π΅Π³Ρ‡Π΅Π½Π½ΠΎ Π²Π·Π΄ΠΎΡ…Π½ΡƒΠ»ΠΈ. Но ΠΌΡ‹-Ρ‚ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Π»ΠΈ, Ρ‡Ρ‚ΠΎ Ρƒ нас Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Β«Π±ΠΎΠ΅Π²Ρ‹Ρ…Β» сСрвСров сотни, ΠΈ вСсь этот «копипаст» со стороны Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² совсСм Π½Π΅ ΡƒΠ΄ΠΎΠ±Π΅Π½. ΠœΡ‹ поняли, Ρ‡Ρ‚ΠΎ Π½Π°Π΄ΠΎ это самим ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ.

Массовая оптимизация запросов PostgreSQL. ΠšΠΈΡ€ΠΈΠ»Π» Π‘ΠΎΡ€ΠΎΠ²ΠΈΠΊΠΎΠ² (Π’Π΅Π½Π·ΠΎΡ€)

Π’ΠΎΠΎΠ±Ρ‰Π΅, Π΅ΡΡ‚ΡŒ ΡˆΡ‚Π°Ρ‚Π½Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΌΠ΅Π΅Ρ‚ ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ статистику, ΠΏΡ€Π°Π²Π΄Π°, Π΅Π³ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ Π½ΡƒΠΆΠ½ΠΎ Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³Π΅ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ β€” это ΠΌΠΎΠ΄ΡƒΠ»ΡŒ pg_stat_statements. Но ΠΎΠ½ нас Π½Π΅ устроил.

Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΎΠ΄Π½ΠΈΠΌ ΠΈ Ρ‚Π΅ΠΌ ΠΆΠ΅ запросам ΠΏΠΎ Ρ€Π°Π·Π½Ρ‹ΠΌ схСмам Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΎΠ΄Π½ΠΎΠΉ Π±Π°Π·Ρ‹ ΠΎΠ½ присваиваСт Ρ€Π°Π·Π½Ρ‹Π΅ QueryId. Π’ΠΎ Π΅ΡΡ‚ΡŒ Ссли сначала ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ SET search_path = '01'; SELECT * FROM user LIMIT 1;, Π° ΠΏΠΎΡ‚ΠΎΠΌ SET search_path = '02'; ΠΈ Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ запрос, Ρ‚ΠΎ Π² статистикС этого модуля Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°Π·Π½Ρ‹Π΅ записи, ΠΈ я Π½Π΅ смогу ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΠΎΠ±Ρ‰ΡƒΡŽ статистику ΠΈΠΌΠ΅Π½Π½ΠΎ Π² Ρ€Π°Π·Ρ€Π΅Π·Π΅ этого профиля запроса, Π±Π΅Π· ΡƒΡ‡Π΅Ρ‚Π° схСм.

Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π°ΠΌ помСшал Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ β€” отсутствиС ΠΏΠ»Π°Π½ΠΎΠ². Π’ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΠ»Π°Π½Π° β€” Π½Π΅Ρ‚, Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ сам запрос. ΠœΡ‹ Π²ΠΈΠ΄ΠΈΠΌ Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΡ€ΠΌΠΎΠ·ΠΈΠ»ΠΎ, Π½ΠΎ Π½Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅ΠΌ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ. И Ρ‚ΡƒΡ‚ ΠΌΡ‹ возвращаСмся ΠΊ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅ быстроизмСняСмого датасСта.

И послСдний ΠΌΠΎΠΌΠ΅Π½Ρ‚ β€” отсутствиС Β«Ρ„Π°ΠΊΡ‚ΠΎΠ²Β». Π’ΠΎ Π΅ΡΡ‚ΡŒ нСльзя Π°Π΄Ρ€Π΅ΡΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌΡƒ экзСмпляру выполнСния запроса β€” Π΅Π³ΠΎ Π½Π΅Ρ‚, Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ агрСгированная статистика. Π‘ этим Ρ…ΠΎΡ‚ΡŒ ΠΈ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, просто ΠΎΡ‡Π΅Π½ΡŒ слоТно.

Массовая оптимизация запросов PostgreSQL. ΠšΠΈΡ€ΠΈΠ»Π» Π‘ΠΎΡ€ΠΎΠ²ΠΈΠΊΠΎΠ² (Π’Π΅Π½Π·ΠΎΡ€)

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΡ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ с «копипастой» Π±ΠΎΡ€ΠΎΡ‚ΡŒΡΡ ΠΈ Π½Π°Ρ‡Π°Π»ΠΈ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ»Π»Π΅ΠΊΡ‚ΠΎΡ€.

ΠšΠΎΠ»Π»Π΅ΠΊΡ‚ΠΎΡ€ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΏΠΎ SSH, «натягиваСт» с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ сСртификата Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π½ΠΎΠ΅ соСдинСниС Π΄ΠΎ сСрвСра с Π±Π°Π·ΠΎΠΉ ΠΈ tail -F «цСпляСтся» ΠΊ Π½Π΅ΠΌΡƒ Π½Π° Π»ΠΎΠ³-Ρ„Π°ΠΉΠ». Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π² этой сСссии ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΏΠΎΠ»Π½ΠΎΠ΅ Β«Π·Π΅Ρ€ΠΊΠ°Π»ΠΎΒ» всСго Π»ΠΎΠ³-Ρ„Π°ΠΉΠ»Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ сСрвСр. Нагрузка Π½Π° сам сСрвСр ΠΏΡ€ΠΈ этом минимальна, вСдь ΠΌΡ‹ Ρ‚Π°ΠΌ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ парсим, просто Π·Π΅Ρ€ΠΊΠ°Π»ΠΈΡ€ΡƒΠ΅ΠΌ Ρ‚Ρ€Π°Ρ„ΠΈΠΊ.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ ΡƒΠΆΠ΅ Π½Π°Ρ‡Π°Π»ΠΈ ΠΏΠΈΡΠ°Ρ‚ΡŒ интСрфСйс Π½Π° Node.js, Ρ‚ΠΎ Π½Π° Π½Π΅ΠΌ ΠΆΠ΅ ΠΈ ΠΊΠΎΠ»Π»Π΅ΠΊΡ‚ΠΎΡ€ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΠ»ΠΈ ΠΏΠΈΡΠ°Ρ‚ΡŒ. И эта тСхнология сСбя ΠΎΠΏΡ€Π°Π²Π΄Π°Π»Π°, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ со слабоформатированными тСкстовыми Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΈ являСтся Π»ΠΎΠ³, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ JavaScript ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎ. А сама инфраструктура Node.js Π² качСствС backend-ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ позволяСт Π»Π΅Π³ΠΊΠΎ ΠΈ ΡƒΠ΄ΠΎΠ±Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с сСтСвыми соСдинСниями, Π΄Π° ΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅ с ΠΊΠ°ΠΊΠΈΠΌΠΈ-Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ….

БоотвСтствСнно, ΠΌΡ‹ «натягиваСм» Π΄Π²Π° соСдинСния: ΠΏΠ΅Ρ€Π²ΠΎΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Β«ΡΠ»ΡƒΡˆΠ°Ρ‚ΡŒΒ» сам Π»ΠΎΠ³ ΠΈ Π΅Π³ΠΎ ΠΊ сСбС Π·Π°Π±ΠΈΡ€Π°Ρ‚ΡŒ, Π° Π²Ρ‚ΠΎΡ€ΠΎΠ΅ β€” Ρ‡Ρ‚ΠΎΠ±Ρ‹ пСриодичСски Ρƒ Π±Π°Π·Ρ‹ ΡΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ‚ΡŒ. «А Π²ΠΎΡ‚ Π² Π»ΠΎΠ³Π΅ ΠΏΡ€ΠΈΠ»Π΅Ρ‚Π΅Π»ΠΎ, Ρ‡Ρ‚ΠΎ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π° Ρ‚Π°Π±Π»ΠΈΡ‡ΠΊΠ° с oid 123Β», Π½ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ это Π½Π΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ Π½ΠΈ ΠΎ Ρ‡Π΅ΠΌ, ΠΈ Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎ Π±Ρ‹ ΡΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ Ρƒ Π±Π°Π·Ρ‹ «А Ρ‡Ρ‚ΠΎ ΠΆΠ΅ всС-Ρ‚Π°ΠΊΠΈ Ρ‚Π°ΠΊΠΎΠ΅ OID = 123?Β» И Ρ‚Π°ΠΊ ΠΌΡ‹ пСриодичСски ΡΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅ΠΌ Ρƒ Π±Π°Π·Ρ‹ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Ρƒ сСбя Π΅Ρ‰Π΅ Π½Π΅ Π·Π½Π°Π΅ΠΌ.

Массовая оптимизация запросов PostgreSQL. ΠšΠΈΡ€ΠΈΠ»Π» Π‘ΠΎΡ€ΠΎΠ²ΠΈΠΊΠΎΠ² (Π’Π΅Π½Π·ΠΎΡ€)

Β«Π›ΠΈΡˆΡŒ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚Ρ‹ Π½Π΅ ΡƒΡ‡Π΅Π», Π΅ΡΡ‚ΡŒ Π²ΠΈΠ΄ слоноподобных ΠΏΡ‡Π΅Π»!..Β» ΠœΡ‹ Π½Π°Ρ‡ΠΈΠ½Π°Π»ΠΈ Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ эту систСму, ΠΊΠΎΠ³Π΄Π° Ρ…ΠΎΡ‚Π΅Π»ΠΈ ΠΎΡ‚ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΡ‚ΡŒ 10 сСрвСров. НаиболСС ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½Ρ‹Ρ… Π² нашСм ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠΈ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π»ΠΈ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Π±Ρ‹Π»ΠΎ слоТно Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒΡΡ. Но Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΆΠ΅ ΠΊΠ²Π°Ρ€Ρ‚Π°Π»Π° ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Π½Π° ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ ΡΠΎΡ‚Π½ΡŽ β€” ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ систСма «зашла», всС Π·Π°Ρ…ΠΎΡ‚Π΅Π»ΠΈ, всСм ΡƒΠ΄ΠΎΠ±Π½ΠΎ.

ВсС это Π½Π°Π΄ΠΎ ΡΠΊΠ»Π°Π΄Ρ‹Π²Π°Ρ‚ΡŒ, Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊ большой, Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ. БобствСнно, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠΌ, с Ρ‡Π΅ΠΌ ΡƒΠΌΠ΅Π΅ΠΌ Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒΡΡ β€” Ρ‚ΠΎ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π² качСствС Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° Π΄Π°Π½Π½Ρ‹Ρ… Ρ‚ΠΎΠΆΠ΅ PostgreSQL. А Π½ΠΈΡ‡Π΅Π³ΠΎ быстрСС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Β«Π»ΠΈΡ‚ΡŒΒ» Π² Π½Π΅Π³ΠΎ Π΄Π°Π½Π½Ρ‹Π΅, Ρ‡Π΅ΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ COPY ΠΏΠΎΠΊΠ° Π½Π΅Ρ‚Ρƒ.

Но просто Β«Π»ΠΈΡ‚ΡŒΒ» Π΄Π°Π½Π½Ρ‹Π΅ β€” Π½Π΅ совсСм наша тСхнология. ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ссли Ρƒ вас Π½Π° сотнС сСрвСров происходит ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ 50k запросов Π² сСкунду, Ρ‚ΠΎ это Π²Π°ΠΌ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ 100-150GB Π»ΠΎΠ³ΠΎΠ² Π² дСнь. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π½Π°ΠΌ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π±Π°Π·Ρƒ Π°ΠΊΠΊΡƒΡ€Π°Ρ‚Π½ΠΎ Β«ΠΏΠΈΠ»ΠΈΡ‚ΡŒΒ».

Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΌΡ‹ сдСлали сСкционированиС ΠΏΠΎ дням, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ, ΠΏΠΎ Π±ΠΎΠ»ΡŒΡˆΠΎΠΌΡƒ счСту, Π½ΠΈΠΊΠΎΠ³ΠΎ Π½Π΅ интСрСсуСт коррСляция ΠΌΠ΅ΠΆΠ΄Ρƒ сутками. Какая Ρ€Π°Π·Π½ΠΈΡ†Π°, Ρ‡Ρ‚ΠΎ Ρƒ тСбя Π±Ρ‹Π»ΠΎ Π²Ρ‡Π΅Ρ€Π°, Ссли сСгодня Π½ΠΎΡ‡ΡŒΡŽ Ρ‚Ρ‹ Π²Ρ‹ΠΊΠ°Ρ‚ΠΈΠ» Π½ΠΎΠ²ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ прилоТСния β€” ΠΈ ΡƒΠΆΠ΅ какая-Ρ‚ΠΎ новая статистика.

Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, ΠΌΡ‹ Π½Π°ΡƒΡ‡ΠΈΠ»ΠΈΡΡŒ (Π²Ρ‹Π½ΡƒΠΆΠ΄Π΅Π½Ρ‹ Π±Ρ‹Π»ΠΈ) ΠΎΡ‡Π΅Π½ΡŒ-ΠΎΡ‡Π΅Π½ΡŒ быстро ΠΏΠΈΡΠ°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ COPY. Π’ΠΎ Π΅ΡΡ‚ΡŒ Π½Π΅ просто COPY, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ быстрСС, Ρ‡Π΅ΠΌ INSERT, Π° Π΅Ρ‰Π΅ быстрСС.

Массовая оптимизация запросов PostgreSQL. ΠšΠΈΡ€ΠΈΠ»Π» Π‘ΠΎΡ€ΠΎΠ²ΠΈΠΊΠΎΠ² (Π’Π΅Π½Π·ΠΎΡ€)

Π’Ρ€Π΅Ρ‚ΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ β€” ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΠΎΡ‚ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€ΠΎΠ², соотвСтствСнно, ΠΈ ΠΎΡ‚ Foreign Keys. Π’ΠΎ Π΅ΡΡ‚ΡŒ Ρƒ нас Π½Π΅Ρ‚ совсСм ссылочной цСлостности. ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ссли Ρƒ вас Π΅ΡΡ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ†Π°, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π΅ΡΡ‚ΡŒ ΠΏΠ°Ρ€Π° FK, ΠΈ Π²Ρ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚Π΅ Π² структурС Π‘Π”, Ρ‡Ρ‚ΠΎ Β«Π²ΠΎΡ‚ запись ΠΈΠ· Π»ΠΎΠ³Π° ссылаСтся ΠΏΠΎ FK, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π° Π³Ρ€ΡƒΠΏΠΏΡƒ записСй», Ρ‚ΠΎ ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Π΅Π΅ вставляСтС, PostgreSQL Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ остаСтся, ΠΊΡ€ΠΎΠΌΠ΅ ΠΊΠ°ΠΊ Π²Π·ΡΡ‚ΡŒ ΠΈ чСстно Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ SELECT 1 FROM master_fk1_table WHERE ... с Ρ‚Π΅ΠΌ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ ΠΏΡ‹Ρ‚Π°Π΅Ρ‚Π΅ΡΡŒ Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ β€” просто для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ эта запись Ρ‚Π°ΠΌ присутствуСт, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π½Π΅ Β«ΠΎΠ±Π»Π°ΠΌΡ‹Π²Π°Π΅Ρ‚Π΅Β» своСй вставкой этот Foreign Key.

ΠœΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ вмСсто ΠΎΠ΄Π½ΠΎΠΉ записи Π² Ρ†Π΅Π»Π΅Π²ΡƒΡŽ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΈ Π΅Π΅ индСксы, Π΅Ρ‰Π΅ плюсом чтСния ΠΈΠ· всСх Ρ‚Π°Π±Π»ΠΈΡ†, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½Π° ссылаСтся. А Π½Π°ΠΌ это совсСм Π½Π΅ Π½Π°Π΄ΠΎ β€” наша Π·Π°Π΄Π°Ρ‡Π° Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ большС ΠΈ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ быстрСС с наимСньшСй Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉ. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ FK β€” Π΄ΠΎΠ»ΠΎΠΉ!

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ β€” агрСгация ΠΈ Ρ…ΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. Π˜Π·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ Ρƒ нас Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Π² Π‘Π” β€” вСдь ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΆΠ΅ сразу, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΈΠ»Π΅Ρ‚Π°Π΅Ρ‚ запись, ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π² ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ Ρ‚Π°Π±Π»ΠΈΡ‡ΠΊΠ΅ «плюс ΠΎΠ΄ΠΈΠ½Β» прямо Π² Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€Π΅. Π₯ΠΎΡ€ΠΎΡˆΠΎ, ΡƒΠ΄ΠΎΠ±Π½ΠΎ, Π½ΠΎ ΠΏΠ»ΠΎΡ…ΠΎ Ρ‚Π΅ΠΌ ΠΆΠ΅ β€” вставляСтС ΠΎΠ΄Π½Ρƒ запись, Π° Π²Ρ‹Π½ΡƒΠΆΠ΄Π΅Π½Ρ‹ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π΅Ρ‰Π΅ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹. ΠŸΡ€ΠΈΡ‡Π΅ΠΌ, ΠΌΠ°Π»ΠΎ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ β€” Π΅Ρ‰Π΅ ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·.

А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Ρƒ вас Π΅ΡΡ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ‡ΠΊΠ°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π²Ρ‹ просто считаСтС количСство запросов, ΠΏΡ€ΠΎΡˆΠ΅Π΄ΡˆΠΈΡ… ΠΏΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌΡƒ хосту: +1, +1, +1, ..., +1. А Π²Π°ΠΌ это, Π² ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅, Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ β€” это всС ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡΡƒΠΌΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² памяти Π½Π° ΠΊΠΎΠ»Π»Π΅ΠΊΡ‚ΠΎΡ€Π΅ ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π² Π±Π°Π·Ρƒ Π·Π° ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· +10.

Π”Π°, Ρƒ вас Π² случаС ΠΊΠ°ΠΊΠΈΡ…-Ρ‚ΠΎ Π½Π΅ΠΏΠΎΠ»Π°Π΄ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Β«Ρ€Π°Π·Π²Π°Π»ΠΈΡ‚ΡŒΡΡΒ» логичСская Ρ†Π΅Π»ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ, Π½ΠΎ это практичСски Π½Π΅Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ кСйс β€” ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρƒ вас Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ сСрвСр, Π½Π° Π½Π΅ΠΌ Π±Π°Ρ‚Π°Ρ€Π΅ΠΉΠΊΠ° Π² ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π΅, Ρƒ вас ΠΆΡƒΡ€Π½Π°Π» Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ, ΠΆΡƒΡ€Π½Π°Π» Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмС… Π’ ΠΎΠ±Ρ‰Π΅ΠΌ, Π½Π΅ стоит ΠΎΠ½ΠΎ Ρ‚ΠΎΠ³ΠΎ. НС стоит Ρ‚Π° потСря ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ Π·Π° счСт Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€ΠΎΠ²/FK, Ρ‚Π΅Ρ… расходов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ нСсСтС ΠΏΡ€ΠΈ этом.

Π’ΠΎ ΠΆΠ΅ самоС ΠΈ с Ρ…ΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ. Π›Π΅Ρ‚ΠΈΡ‚ ΠΊ Π²Π°ΠΌ Π½Π΅ΠΊΠΈΠΉ запрос, Π²Ρ‹ ΠΎΡ‚ Π½Π΅Π³ΠΎ вычисляСтС Π² Π‘Π” Π½Π΅ΠΊΠΈΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, ΠΏΠΈΡˆΠ΅Ρ‚Π΅ Π² Π±Π°Π·Ρƒ ΠΈ всСм ΠΏΠΎΡ‚ΠΎΠΌ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚Π΅ Π΅Π³ΠΎ. ВсС Ρ…ΠΎΡ€ΠΎΡˆΠΎ, ΠΏΠΎΠΊΠ° Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ записи ΠΊ Π²Π°ΠΌ Π½Π΅ ΠΏΡ€ΠΈΠ΄Π΅Ρ‚ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΆΠ΅Π»Π°ΡŽΡ‰ΠΈΠΉ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΆΠ΅ β€” ΠΈ Ρƒ вас Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ°, Π° это ΡƒΠΆΠ΅ ΠΏΠ»ΠΎΡ…ΠΎ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Ссли Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΡŽ ΠΊΠ°ΠΊΠΈΡ…-Ρ‚ΠΎ ID вынСсти Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° (ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π±Π°Π·Ρ‹), Π»ΡƒΡ‡ΡˆΠ΅ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ.

Нам просто идСально подошло ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ MD5 ΠΎΡ‚ тСкста β€” запроса, ΠΏΠ»Π°Π½Π°, шаблона,… ΠœΡ‹ вычисляСм Π΅Π³ΠΎ Π½Π° сторонС ΠΊΠΎΠ»Π»Π΅ΠΊΡ‚ΠΎΡ€Π°, ΠΈ «льСм» Π² Π±Π°Π·Ρƒ ΡƒΠΆΠ΅ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ ID. Π”Π»ΠΈΠ½Π° MD5 ΠΈ посуточноС сСкционированиС ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π½Π°ΠΌ Π½Π΅ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡ‚ΡŒΡΡ ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… коллизиях.

Массовая оптимизация запросов PostgreSQL. ΠšΠΈΡ€ΠΈΠ»Π» Π‘ΠΎΡ€ΠΎΠ²ΠΈΠΊΠΎΠ² (Π’Π΅Π½Π·ΠΎΡ€)

Но Ρ‡Ρ‚ΠΎΠ±Ρ‹ это всС Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ быстро, Π½Π°ΠΌ понадобилось ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ саму ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ записи.

Как ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΠΈΡˆΡƒΡ‚ Π΄Π°Π½Π½Ρ‹Π΅? Π£ нас Π΅ΡΡ‚ΡŒ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ датасСт, ΠΌΡ‹ Π΅Π³ΠΎ раскладываСм Π½Π° нСсколько Ρ‚Π°Π±Π»ΠΈΡ†, Π° ΠΏΠΎΡ‚ΠΎΠΌ COPY β€” сначала Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ, ΠΏΠΎΡ‚ΠΎΠΌ Π²ΠΎ Π²Ρ‚ΠΎΡ€ΡƒΡŽ, Π² Ρ‚Ρ€Π΅Ρ‚ΡŒΡŽβ€¦ НСудобно, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π²Ρ€ΠΎΠ΄Π΅ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ Π΄Π°Π½Π½Ρ‹Ρ… пишСм Π·Π° Ρ‚Ρ€ΠΈ шага ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ. НСприятно. МоТно Π»ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ быстрСС? МоТно!

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

Массовая оптимизация запросов PostgreSQL. ΠšΠΈΡ€ΠΈΠ»Π» Π‘ΠΎΡ€ΠΎΠ²ΠΈΠΊΠΎΠ² (Π’Π΅Π½Π·ΠΎΡ€)

Π’ΠΎ Π΅ΡΡ‚ΡŒ Ρƒ ΠΊΠΎΠ»Π»Π΅ΠΊΡ‚ΠΎΡ€Π° всСгда Π΅ΡΡ‚ΡŒ стрим, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ я ΠΌΠΎΠ³Ρƒ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹Π΅ ΠΌΠ½Π΅ Π΄Π°Π½Π½Ρ‹Π΅. Но Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Π°Π·Π° эти Π΄Π°Π½Π½Ρ‹Π΅ ΡƒΠ²ΠΈΠ΄Π΅Π»Π°, Π° ΠΊΡ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π½Π΅ висСл Π² Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, оТидая, ΠΏΠΎΠΊΠ° эти Π΄Π°Π½Π½Ρ‹Π΅ Π·Π°ΠΏΠΈΡˆΡƒΡ‚ΡΡ, COPY Π½Π°Π΄ΠΎ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Ρ‚ΡŒ с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ΠΈΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ. Для нас Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ эффСктивным получился ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ порядка 100мс β€” Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ ΠΈ сразу снова ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ Π½Π° Ρ‚Ρƒ ΠΆΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ. А Ссли Ρƒ нас ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚ ΠΏΡ€ΠΈ ΠΊΠ°ΠΊΠΈΡ…-Ρ‚ΠΎ ΠΏΠΈΠΊΠ°Ρ…, Ρ‚ΠΎ ΠΌΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ ΠΏΡƒΠ»ΠΈΠ½Π³ Π΄ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€Π΅Π΄Π΅Π»Π°.

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΡ‹ выяснили, Ρ‡Ρ‚ΠΎ для Ρ‚Π°ΠΊΠΎΠ³ΠΎ профиля Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ любая агрСгация, ΠΊΠΎΠ³Π΄Π° записи ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡ‚ΡΡ Π² ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ β€” это Π·Π»ΠΎ. ΠšΠ»Π°ΡΡΠΈΡ‡Π΅ΡΠΊΠΎΠ΅ Π·Π»ΠΎ β€” это INSERT ... VALUES ΠΈ дальшС 1000 записСй. ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π² этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ Ρƒ вас Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΠΈΠΊ записи ΠΏΠΎ Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŽ, ΠΈ всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅, ΠΏΡ‹Ρ‚Π°ΡŽΡ‰ΠΈΠ΅ΡΡ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½Π° диск, Π±ΡƒΠ΄ΡƒΡ‚ ΠΆΠ΄Π°Ρ‚ΡŒ.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ Ρ‚Π°ΠΊΠΈΡ… Π°Π½ΠΎΠΌΠ°Π»ΠΈΠΉ, просто Π½Π΅ Π°Π³Ρ€Π΅Π³ΠΈΡ€ΡƒΠΉΡ‚Π΅ Π½ΠΈΡ‡Π΅Π³ΠΎ, Π½Π΅ Π±ΡƒΡ„Π΅Ρ€ΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅ Π²ΠΎΠΎΠ±Ρ‰Π΅. И Ссли буфСризация Π½Π° диск всС-Ρ‚Π°ΠΊΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ (ΠΊ ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, Stream API Π² Node.js позволяСт это ΡƒΠ·Π½Π°Ρ‚ΡŒ) β€” ΠΎΡ‚Π»ΠΎΠΆΠΈΡ‚Π΅ это соСдинСниС. Π’ΠΎΡ‚ ΠΊΠΎΠ³Π΄Π° Π²Π°ΠΌ ΠΏΡ€ΠΈΠ΄Π΅Ρ‚ событиС, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΎ снова свободно β€” ΠΏΠΈΡˆΠΈΡ‚Π΅ Π² Π½Π΅Π³ΠΎ ΠΈΠ· накопившСйся ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ. А ΠΏΠΎΠΊΠ° ΠΎΠ½ΠΎ занято β€” Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠΈΠ· ΠΏΡƒΠ»Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅, свободноС, ΠΈ ΠΏΠΈΡˆΠΈΡ‚Π΅ Π² Π½Π΅Π³ΠΎ.

Π”ΠΎ внСдрСния Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° ΠΊ записи Π΄Π°Π½Π½Ρ‹Ρ… Ρƒ нас Π±Ρ‹Π»ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ 4K write ops, Π° Ρ‚Π°ΠΊΠΈΠΌ способом сократили Π½Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ Π² 4 Ρ€Π°Π·Π°. БСйчас выросли Π΅Ρ‰Π΅ Π² 6 Ρ€Π°Π· Π·Π° счСт Π½ΠΎΠ²Ρ‹Ρ… Π½Π°Π±Π»ΡŽΠ΄Π°Π΅ΠΌΡ‹Ρ… Π±Π°Π· β€” Π΄ΠΎ 100MB/s. И Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ Ρ…Ρ€Π°Π½ΠΈΠΌ Π»ΠΎΠ³ΠΈ Π·Π° послСдниС 3 мСсяца Π² объСмС ΠΎΠΊΠΎΠ»ΠΎ 10-15TB, надСясь, Ρ‡Ρ‚ΠΎ ΡƒΠΆ Π·Π° Ρ‚Ρ€ΠΈ-Ρ‚ΠΎ мСсяца Π»ΡŽΠ±ΡƒΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ любой Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ способСн Ρ€Π΅ΡˆΠΈΡ‚ΡŒ.

ПонимаСм ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹

Но просто ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ всС эти Π΄Π°Π½Π½Ρ‹Π΅ β€” Ρ…ΠΎΡ€ΠΎΡˆΠΎ, ΠΏΠΎΠ»Π΅Π·Π½ΠΎ, умСстно, Π½ΠΎ ΠΌΠ°Π»ΠΎ β€” ΠΈΡ… Π½Π°Π΄ΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ. ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ это ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Ρ‹ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΏΠ»Π°Π½ΠΎΠ² Π·Π° сутки.

Массовая оптимизация запросов PostgreSQL. ΠšΠΈΡ€ΠΈΠ»Π» Π‘ΠΎΡ€ΠΎΠ²ΠΈΠΊΠΎΠ² (Π’Π΅Π½Π·ΠΎΡ€)

Но ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Ρ‹ β€” это нСуправляСмо, Π½Π°Π΄ΠΎ сначала ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ «помСньшС». И, Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, Π½Π°Π΄ΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊ это «помСньшС» Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ.

ΠœΡ‹ Π²Ρ‹Π΄Π΅Π»ΠΈΠ»ΠΈ для сСбя Ρ‚Ρ€ΠΈ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°:

  • ΠΊΡ‚ΠΎ этот запрос прислал
    Π’ΠΎ Π΅ΡΡ‚ΡŒ ΠΈΠ· ΠΊΠ°ΠΊΠΎΠ³ΠΎ прилоТСния ΠΎΠ½ Β«ΠΏΡ€ΠΈΠ»Π΅Ρ‚Π΅Π»Β»: web-интСрфСйс, backend, платСТная систСма ΠΈΠ»ΠΈ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΅Ρ‰Π΅.
  • Π³Π΄Π΅ это ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ
    На ΠΊΠ°ΠΊΠΎΠΌ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌ сСрвСрС. ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ссли Ρƒ вас ΠΏΠΎΠ΄ ΠΎΠ΄Π½ΠΈΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ стоит нСсколько сСрвСров, ΠΈ Π²Π½Π΅Π·Π°ΠΏΠ½ΠΎ ΠΎΠ΄ΠΈΠ½ Β«Π·Π°Ρ‚ΡƒΠΏΠΈΠ»Β» (ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ «диск сгнил», Β«ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΏΡ€ΠΎΡ‚Π΅ΠΊΠ»Π°Β», Π΅Ρ‰Π΅ какая-Ρ‚ΠΎ Π±Π΅Π΄Π°), Ρ‚ΠΎ Π½Π°Π΄ΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ Π°Π΄Ρ€Π΅ΡΠΎΠ²Π°Ρ‚ΡŒΡΡ Π΄ΠΎ сСрвСра.
  • ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΏΡ€ΠΎΡΠ²Π»ΡΠ»Π°ΡΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ‚ΠΎΠΌ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΌ ΠΏΠ»Π°Π½Π΅

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ Β«ΠΊΡ‚ΠΎΒ» прислал Π½Π°ΠΌ запрос, ΠΌΡ‹ ΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ ΡˆΡ‚Π°Ρ‚Π½Ρ‹ΠΌ срСдством β€” установкой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ сСссии: SET application_name = '{bl-host}:{bl-method}'; β€” посыдаСм имя хоста бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΈΠ΄Π΅Ρ‚ запрос, ΠΈ имя ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΈΠ»ΠΈ прилоТСния, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π΅Π³ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Π»ΠΎ.

ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π»ΠΈ «хозяина» запроса, Π΅Π³ΠΎ Π½Π°Π΄ΠΎ вывСсти Π² Π»ΠΎΠ³ β€” для этого ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ log_line_prefix = ' %m [%p:%v] [%d] %r %a'. ΠšΠΎΠΌΡƒ интСрСсно, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π² ΠΌΠ°Π½ΡƒΠ°Π»Π΅, Ρ‡Ρ‚ΠΎ это всС Π·Π½Π°Ρ‡ΠΈΡ‚. ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π² Π»ΠΎΠ³Π΅ Π²ΠΈΠ΄ΠΈΠΌ:

  • врСмя
  • ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ процСсса ΠΈ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ
  • имя Π±Π°Π·Ρ‹
  • IP Ρ‚ΠΎΠ³ΠΎ, ΠΊΡ‚ΠΎ прислал этот запрос
  • ΠΈ имя ΠΌΠ΅Ρ‚ΠΎΠ΄Π°

Массовая оптимизация запросов PostgreSQL. ΠšΠΈΡ€ΠΈΠ»Π» Π‘ΠΎΡ€ΠΎΠ²ΠΈΠΊΠΎΠ² (Π’Π΅Π½Π·ΠΎΡ€)

Π”Π°Π»ΡŒΡˆΠ΅ ΠΌΡ‹ поняли, Ρ‡Ρ‚ΠΎ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ интСрСсно ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠΎΡ€Ρ€Π΅Π»ΡΡ†ΠΈΡŽ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ запросу ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ сСрвСрами. НСчасто получаСтся ситуация, ΠΊΠΎΠ³Π΄Π° Ρƒ вас ΠΎΠ΄Π½ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ Β«Π»Π°ΠΆΠ°Π΅Ρ‚Β» ΠΈ Ρ‚ΡƒΡ‚, ΠΈ Ρ‚Π°ΠΌ. Но Π΄Π°ΠΆΠ΅ Ссли ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ β€” посмотритС Π½Π° любой ΠΈΠ· этих сСрвСров.

Π’Π°ΠΊ Π²ΠΎΡ‚, Ρ€Π°Π·Ρ€Π΅Π·Π° Β«ΠΎΠ΄ΠΈΠ½ сСрвСр β€” ΠΎΠ΄ΠΈΠ½ дСнь» Π½Π°ΠΌ оказалось достаточно для любого Π°Π½Π°Π»ΠΈΠ·Π°.

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ аналитичСский Ρ€Π°Π·Ρ€Π΅Π· β€” это Ρ‚ΠΎΡ‚ самый «шаблон» β€” сокращСнная Ρ„ΠΎΡ€ΠΌΠ° прСдставлСния ΠΏΠ»Π°Π½Π°, очищСнная ΠΎΡ‚ всСх числСнных ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ. Π’Ρ‚ΠΎΡ€ΠΎΠΉ Ρ€Π°Π·Ρ€Π΅Π· β€” ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄, Π° Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ β€” это ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ ΡƒΠ·Π΅Π» ΠΏΠ»Π°Π½Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹Π·Π²Π°Π» Ρƒ нас ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹.

Когда ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅ΡˆΠ»ΠΈ ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… экзСмпляров ΠΊ шаблонам, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ сразу Π΄Π²Π° прСимущСства:

  • ΠΊΡ€Π°Ρ‚Π½ΠΎΠ΅ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΠ΅ количСства ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² для Π°Π½Π°Π»ΠΈΠ·Π°
    ΠŸΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ΡΡ Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ ΡƒΠΆΠ΅ Π½Π΅ ΠΏΠΎ тысячам запросов ΠΈΠ»ΠΈ ΠΏΠ»Π°Π½ΠΎΠ², Π° ΠΏΠΎ дСсяткам шаблонов.
  • Ρ‚Π°ΠΉΠΌΠ»Π°ΠΉΠ½
    Π’ΠΎ Π΅ΡΡ‚ΡŒ, ΠΎΠ±ΠΎΠ±Ρ‰ΠΈΠ² Β«Ρ„Π°ΠΊΡ‚Ρ‹Β» Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Ρ‚ΠΎ Ρ€Π°Π·Ρ€Π΅Π·Π°, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ ΠΈΡ… появлСниС Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ дня. И Ρ‚ΡƒΡ‚ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ссли Ρƒ вас ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ шаблон происходит, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ€Π°Π· Π² час, Π° Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹ β€” Ρ€Π°Π· Π² сутки, стоит Π·Π°Π΄ΡƒΠΌΠ°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ пошло Π½Π΅ Ρ‚Π°ΠΊ β€” ΠΊΠ΅ΠΌ ΠΈ Π·Π°Ρ‡Π΅ΠΌ ΠΎΠ½ Π²Ρ‹Π·Π²Π°Π½, ΠΌΠΎΠΆΠ΅Ρ‚, Π΅Π³ΠΎ ΠΈ Π±Ρ‹Ρ‚ΡŒ Ρ‚ΡƒΡ‚ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ. Π­Ρ‚ΠΎ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ нСчисловой, чисто Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ, способ Π°Π½Π°Π»ΠΈΠ·Π°.

Массовая оптимизация запросов PostgreSQL. ΠšΠΈΡ€ΠΈΠ»Π» Π‘ΠΎΡ€ΠΎΠ²ΠΈΠΊΠΎΠ² (Π’Π΅Π½Π·ΠΎΡ€)

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

ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π²Ρ‹, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚Π΅ Π½Π° страницу Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΠΈ ΠΏΠΎ хосту, смотритС β€” Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ слишком ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ диску Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π½Π°Ρ‡Π°Π»ΠΎ. Диск Π½Π° сСрвСрС Π½Π΅ справляСтся β€” Π° ΠΊΡ‚ΠΎ с Π½Π΅Π³ΠΎ Ρ‡ΠΈΡ‚Π°Π΅Ρ‚?

И Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎ Π»ΡŽΠ±ΠΎΠΌΡƒ столбцу ΠΈ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ, с Ρ‡Π΅ΠΌ Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ прямо сСйчас Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒΡΡ β€” с Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉ Π½Π° процСссор ΠΈΠ»ΠΈ Π½Π° диск, ΠΈΠ»ΠΈ с ΠΎΠ±Ρ‰ΠΈΠΌ количСством запросов… ΠžΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ, посмотрСли Β«Ρ‚ΠΎΠΏΠΎΠ²Ρ‹Π΅Β», ΠΏΠΎΡ‡ΠΈΠ½ΠΈΠ»ΠΈ β€” Π²Ρ‹ΠΊΠ°Ρ‚ΠΈΠ»ΠΈ Π½ΠΎΠ²ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ прилоТСния.
[видСолСкция]

И сразу Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ прилоТСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ходят с ΠΎΠ΄Π½ΠΈΠΌ ΠΈ Ρ‚Π΅ΠΌ ΠΆΠ΅ шаблоном ΠΎΡ‚ запроса Ρ‚ΠΈΠΏΠ° SELECT * FROM users WHERE login = 'Vasya'. Π€Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄, бэкСнд, процСссинг… И Π²Ρ‹ Π·Π°Π΄ΡƒΠΌΡ‹Π²Π°Π΅Ρ‚Π΅ΡΡŒ, Π·Π°Ρ‡Π΅ΠΌ Π±Ρ‹ процСссингу Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, Ссли ΠΎΠ½ с Π½ΠΈΠΌ Π½Π΅ взаимодСйствуСт.

ΠžΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ способ β€” ΠΎΡ‚ прилоТСния сразу ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚. НапримСр, Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄ β€” это, это, Π²ΠΎΡ‚ это, Π° Π΅Ρ‰Π΅ Π²ΠΎΡ‚ это Ρ€Π°Π· Π² час (ΠΊΠ°ΠΊ Ρ€Π°Π· Ρ‚Π°ΠΉΠΌΠ»Π°ΠΉΠ½ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚). И сразу Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ вопрос β€” Π²Ρ€ΠΎΠ΄Π΅ Π±Ρ‹ Π½Π΅ Π΄Π΅Π»ΠΎ Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄Π° Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Ρ€Π°Π· Π² час…

Массовая оптимизация запросов PostgreSQL. ΠšΠΈΡ€ΠΈΠ»Π» Π‘ΠΎΡ€ΠΎΠ²ΠΈΠΊΠΎΠ² (Π’Π΅Π½Π·ΠΎΡ€)

Π§Π΅Ρ€Π΅Π· ΠΊΠ°ΠΊΠΎΠ΅-Ρ‚ΠΎ врСмя ΠΌΡ‹ поняли, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚ Π°Π³Ρ€Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ статистики Π² Ρ€Π°Π·Ρ€Π΅Π·Π΅ ΡƒΠ·Π»ΠΎΠ² ΠΏΠ»Π°Π½Π°. ΠœΡ‹ Π²Ρ‹Ρ‡Π»Π΅Π½ΠΈΠ»ΠΈ ΠΈΠ· ΠΏΠ»Π°Π½ΠΎΠ² Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ ΡƒΠ·Π»Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΄Π΅Π»Π°ΡŽΡ‚ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ самих Ρ‚Π°Π±Π»ΠΈΡ† (Ρ‡ΠΈΡ‚Π°ΡŽΡ‚/ΠΏΠΈΡˆΡƒΡ‚ ΠΈΡ… ΠΏΠΎ индСксу ΠΈΠ»ΠΈ Π½Π΅Ρ‚). По сути, ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ добавляСтся всСго ΠΎΠ΄ΠΈΠ½ аспСкт β€” сколько записСй этот ΡƒΠ·Π΅Π» Π½Π°ΠΌ принСс, Π° сколько отбросил (Rows Removed by Filter).

Π£ вас Π½Π΅Ρ‚ подходящСго индСкса Π½Π° Ρ‚Π°Π±Π»ΠΈΡ‡ΠΊΠ΅, Π²Ρ‹ Π΄Π΅Π»Π°Π΅Ρ‚Π΅ ΠΊ Π½Π΅ΠΉ запрос, ΠΎΠ½ ΠΏΡ€ΠΎΠ»Π΅Ρ‚Π°Π΅Ρ‚ ΠΌΠΈΠΌΠΎ индСкса, ΠΏΠ°Π΄Π°Π΅Ρ‚ Π² Seq Scan… всС записи, ΠΊΡ€ΠΎΠΌΠ΅ ΠΎΠ΄Π½ΠΎΠΉ Π²Ρ‹ ΠΎΡ‚Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Π°Π»ΠΈ. А Π·Π°Ρ‡Π΅ΠΌ Π²Π°ΠΌ Π·Π° сутки 100M ΠΎΡ‚Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… записСй, Π½Π΅ Π»ΡƒΡ‡ΡˆΠ΅ Π»ΠΈ индСкс Π½Π°ΠΊΠ°Ρ‚ΠΈΡ‚ΡŒ?

Массовая оптимизация запросов PostgreSQL. ΠšΠΈΡ€ΠΈΠ»Π» Π‘ΠΎΡ€ΠΎΠ²ΠΈΠΊΠΎΠ² (Π’Π΅Π½Π·ΠΎΡ€)

Π Π°Π·ΠΎΠ±Ρ€Π°Π² всС ΠΏΠ»Π°Π½Ρ‹ ΠΏΠΎ ΡƒΠ·Π»Π°ΠΌ, ΠΌΡ‹ поняли, Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚ΠΈΠΏΠΎΠ²Ρ‹Π΅ структуры Π² ΠΏΠ»Π°Π½Π°Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ с ΠΎΡ‡Π΅Π½ΡŒ большой Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒΡŽ выглядят ΠΏΠΎΠ΄ΠΎΠ·Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ. И Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎ Π±Ρ‹ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ ΠΏΠΎΠ΄ΡΠΊΠ°Π·Π°Ρ‚ΡŒ: Β«Π”Ρ€ΡƒΠ³, Π²ΠΎΡ‚ Ρ‚ΡƒΡ‚ Ρ‚Ρ‹ сначала Ρ‡ΠΈΡ‚Π°Π΅ΡˆΡŒ ΠΏΠΎ индСксу, ΠΏΠΎΡ‚ΠΎΠΌ ΡΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΡˆΡŒ, Π° ΠΏΠΎΡ‚ΠΎΠΌ ΠΎΡ‚Ρ€Π΅Π·Π°Π΅ΡˆΡŒΒ» β€” ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Ρ‚Π°ΠΌ ΠΎΠ΄Π½Π° запись.

ВсС ΠΊΡ‚ΠΎ писал запросы, с Ρ‚Π°ΠΊΠΈΠΌ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ΠΎΠΌ, навСрняка, ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°Π»ΠΈΡΡŒ: Β«Π”Π°ΠΉ ΠΌΠ½Π΅ послСдний Π·Π°ΠΊΠ°Π· ΠΏΠΎ ВасС, Π΅Π³ΠΎ Π΄Π°Ρ‚ΡƒΒ» И Ссли Ρƒ вас индСкса ΠΏΠΎ Π΄Π°Ρ‚Π΅ Π½Π΅Ρ‚Ρƒ, ΠΈΠ»ΠΈ Π² использовавшСмся индСксС Π½Π΅Ρ‚ Π΄Π°Ρ‚Ρ‹, Ρ‚ΠΎ Π²ΠΎΡ‚ Ρ€ΠΎΠ²Π½ΠΎ Π½Π° Ρ‚Π°ΠΊΠΈΠ΅ Β«Π³Ρ€Π°Π±Π»ΠΈΒ» ΠΈ наступитС.

Но ΠΌΡ‹ ΠΆΠ΅ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ это Β«Π³Ρ€Π°Π±Π»ΠΈΒ» β€” Ρ‚Π°ΠΊ ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π±Ρ‹ сразу Π½Π΅ ΠΏΠΎΠ΄ΡΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ, Ρ‡Ρ‚ΠΎ Π΅ΠΌΡƒ стоит ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ. БоотвСтствСнно, открывая сСйчас ΠΏΠ»Π°Π½, наш Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сразу Π²ΠΈΠ΄ΠΈΡ‚ ΠΊΡ€Π°ΡΠΈΠ²ΡƒΡŽ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ с подсказками, Π³Π΄Π΅ Π΅ΠΌΡƒ сразу говорят: Β«Π£ тСбя ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Ρ‚ΡƒΡ‚ ΠΈ Ρ‚ΡƒΡ‚, Π° Ρ€Π΅ΡˆΠ°ΡŽΡ‚ΡΡ ΠΎΠ½ΠΈ Ρ‚Π°ΠΊ ΠΈ Ρ‚Π°ΠΊ.Β»

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅, объСм Ρ‚ΠΎΠ³ΠΎ ΠΎΠΏΡ‹Ρ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π² Π½Π°Ρ‡Π°Π»Π΅ ΠΈ сСйчас, ΡƒΠΏΠ°Π» Π² Ρ€Π°Π·Ρ‹. Π’ΠΎΡ‚ Ρ‚Π°ΠΊΠΎΠΉ инструмСнт Ρƒ нас получился.

Массовая оптимизация запросов PostgreSQL. ΠšΠΈΡ€ΠΈΠ»Π» Π‘ΠΎΡ€ΠΎΠ²ΠΈΠΊΠΎΠ² (Π’Π΅Π½Π·ΠΎΡ€)

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