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

Π”ΠΎΠΊΠ»Π°Π΄ΡŠΡ‚ прСдставя някои ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ позволяват Π΄Π° сС слСди производитСлността Π½Π° SQL запитванията, ΠΊΠΎΠ³Π°Ρ‚ΠΎ Ρ‚Π΅ са ΠΌΠΈΠ»ΠΈΠΎΠ½ΠΈ Π½Π° Π΄Π΅Π½, Π° ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€Π°Π½ΠΈ ΡΡŠΡ€Π²ΡŠΡ€ΠΈ PostgreSQL β€” стотици.

Кои тСхничСски Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π½ΠΈ позволяват Π΅Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎ Π΄Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π²Π°ΠΌΠ΅ Ρ‚Π°ΠΊΡŠΠ² ΠΎΠ±Π΅ΠΌ информация ΠΈ ΠΊΠ°ΠΊ Ρ‚ΠΎΠ²Π° улСснява ΠΆΠΈΠ²ΠΎΡ‚Π° Π½Π° обикновСния Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ.

ΠŸΡƒΡΠ½Π΅Ρ‚Π΅ Π²ΠΈΠ΄Π΅ΠΎΡ‚ΠΎ

На ΠΊΠΎΠ³ΠΎ Π΅ интСрСсно Ρ€Π°Π·Π³Π»Π΅ΠΆΠ΄Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Ρ‚Π΅Ρ…Π½ΠΈΠΊΠΈ Π·Π° оптимизация Π½Π° SQL запроси ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π½Π° Ρ‚ΠΈΠΏΠΈΡ‡Π½ΠΈ DBA Π·Π°Π΄Π°Ρ‡ΠΈ Π² PostgreSQL β€” ΠΌΠΎΠΆΠ΅ ΡΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ° Π΄Π° сС Π·Π°ΠΏΠΎΠ·Π½Π°Π΅Ρ‚Π΅ със сСрия статии ΠΏΠΎ Ρ‚Π°Π·ΠΈ Ρ‚Π΅ΠΌΠ°.

Масова оптимизация Π½Π° заявки Π² PostgreSQL. ΠšΠΈΡ€ΠΈΠ» Π‘ΠΎΡ€ΠΎΠ²ΠΈΠΊΠΎΠ² (Π’Π΅Π½Π·ΠΎΡ€)
Казвам сС ΠšΠΈΡ€ΠΈΠ» Π‘ΠΎΡ€ΠΎΠ²ΠΈΠΊΠΎΠ², прСдставям компанията β€žΠ’Π΅Π½Π·ΠΎΡ€β€œ.. ΠšΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ спСциализацията ΠΌΠΈ Π΅ ΡΠ²ΡŠΡ€Π·Π°Π½Π° с Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° с Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ Π² Π½Π°ΡˆΠ°Ρ‚Π° компания.

ДнСс Ρ‰Π΅ Π²ΠΈ Ρ€Π°Π·ΠΊΠ°ΠΆΠ° ΠΊΠ°ΠΊ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€Π°ΠΌΠ΅ запитвания, ΠΊΠΎΠ³Π°Ρ‚ΠΎ трябва Π½Π΅ β€žΠ΄Π° Ρ€Π°Π·Π³Π»ΠΎΠ±ΠΈΠΌβ€œ производитСлността Π½Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ Π·Π°ΠΏΠΈΡ‚Π²Π°Π½Π΅, Π° Π΄Π° Ρ€Π΅ΡˆΠΈΠΌ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² масов ΠΌΠ°Ρ‰Π°Π±. ΠšΠΎΠ³Π°Ρ‚ΠΎ ΠΈΠΌΠ° ΠΌΠΈΠ»ΠΈΠΎΠ½ΠΈ запитвания, ΠΈ трябва Π΄Π° Π½Π°ΠΌΠ΅Ρ€ΠΈΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈ Π·Π° Ρ€Π΅ΡˆΠ°Π²Π°Π½Π΅ Π½Π° Ρ‚ΠΎΠ·ΠΈ сСриозСн ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ.

Π’ΡΡŠΡ‰Π½ΠΎΡΡ‚, β€žΠ’Π΅Π½Π·ΠΎΡ€β€œ Π·Π° ΠΌΠΈΠ»ΠΈΠΎΠ½ Π½Π°ΡˆΠΈΡ‚Π΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΈ β€” Ρ‚ΠΎΠ²Π° Π΅ Π‘Π‘Π˜Π‘ β€” Π½Π°ΡˆΠ΅Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅: ΠΊΠΎΡ€ΠΏΠΎΡ€Π°Ρ‚ΠΈΠ²Π½Π° социална ΠΌΡ€Π΅ΠΆΠ°, Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π° Π²ΠΈΠ΄Π΅ΠΎΠ²Ρ€ΡŠΠ·ΠΊΠΈ, Π·Π° Π²ΡŠΡ‚Ρ€Π΅ΡˆΠ΅Π½ ΠΈ външСн Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΎΠ±ΠΎΡ€ΠΎΡ‚, счСтоводни систСми ΠΈ складови… ВоСст, ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ β€žΠΌΠ΅Π³Π°-ΠΊΠΎΠΌΠ±Π°ΠΉΠ½β€œ Π·Π° комплСксно ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° бизнСса, Π² ΠΊΠΎΠΉΡ‚ΠΎ ΠΈΠΌΠ° Π½Π°Π΄ 100 Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π²ΡŠΡ‚Ρ€Π΅ΡˆΠ½ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

Π—Π° Π΄Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€Π°Ρ‚ ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎ ΠΈ Π΄Π° сС Ρ€Π°Π·Π²ΠΈΠ²Π°Ρ‚ всички Ρ‚Π΅ β€” ΠΈΠΌΠ°ΠΌΠ΅ 10 Ρ†Π΅Π½Ρ‚Ρ€ΠΎΠ²Π΅ Π·Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π² цялата страна, Π² ΠΊΠΎΠΈΡ‚ΠΎ работят Π½Π°Π΄ 1000 Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈ..

Π‘ PostgreSQL Ρ€Π°Π±ΠΎΡ‚ΠΈΠΌ ΠΎΡ‚ 2008 Π³ΠΎΠ΄ΠΈΠ½Π° ΠΈ Π½Π°Ρ‚Ρ€ΡƒΠΏΠ°Ρ…ΠΌΠ΅ голям ΠΎΠ±Π΅ΠΌ ΠΎΡ‚ Ρ‚ΠΎΠ²Π°, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π²Π°ΠΌΠ΅ β€” клиСнтски Π΄Π°Π½Π½ΠΈ, статистичСски, Π°Π½Π°Π»ΠΈΡ‚ΠΈΡ‡Π½ΠΈ, Π΄Π°Π½Π½ΠΈ ΠΎΡ‚ външни ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½ΠΈ систСми β€” ΠΏΠΎΠ²Π΅Ρ‡Π΅ ΠΎΡ‚ 400TB.. Π‘Π°ΠΌΠΎ Π² β€žΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡ‚Π²ΠΎΡ‚ΠΎβ€œ ΠΈΠΌΠ°ΠΌΠ΅ ΠΎΠΊΠΎΠ»ΠΎ 250 ΡΡŠΡ€Π²ΡŠΡ€Π°, Π° ΠΎΠ±Ρ‰ΠΎ Π‘Π”-ΡΡŠΡ€Π²ΡŠΡ€ΠΈΡ‚Π΅, ΠΊΠΎΠΈΡ‚ΠΎ наблюдавамС β€” ΠΎΠΊΠΎΠ»ΠΎ 1000.

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

SQL e Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π΅Π½ Π΅Π·ΠΈΠΊ. ΠžΠΏΠΈΡΠ²Π°Ρ‚Π΅ Π½Π΅ β€žΠΊΠ°ΠΊβ€œ Π½Π΅Ρ‰ΠΎ трябва Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ, Π° β€žΠΊΠ°ΠΊΠ²ΠΎβ€œ искатС Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅. Π‘Π£Π‘Π”-Ρ‚ΠΎ ΠΏΠΎ-Π΄ΠΎΠ±Ρ€Π΅ Π·Π½Π°Π΅ ΠΊΠ°ΠΊ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈ JOIN β€” ΠΊΠ°ΠΊ Π΄Π° ΡΠ²ΡŠΡ€ΠΆΠ΅ Π²Π°ΡˆΠΈΡ‚Π΅ Ρ‚Π°Π±Π»ΠΈΡ†ΠΈ, ΠΊΠ°ΠΊΠ²ΠΈ условия Π΄Π° Π½Π°Π»ΠΎΠΆΠΈ, ΠΊΠ°ΠΊΠ²ΠΎ Ρ‰Π΅ ΠΌΠΈΠ½Π΅ ΠΏΠΎ индСкса, ΠΊΠ°ΠΊΠ²ΠΎ нС…

Някои Π‘Π£Π‘Π” ΠΏΡ€ΠΈΠ΅ΠΌΠ°Ρ‚ подсказки: β€žΠΠ΅, ΡΠ²ΡŠΡ€Π·Π²Π°ΠΉ Ρ‚Π΅Π·ΠΈ Π΄Π²Π΅ Ρ‚Π°Π±Π»ΠΈΡ†ΠΈ Π² Ρ‚Π°ΠΊΠ°Π²Π° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»Π½ΠΎΡΡ‚β€œ, Π½ΠΎ PostgreSQL Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° сС справи с Ρ‚ΠΎΠ²Π°. Π’ΠΎΠ²Π° Π΅ ΠΎΡΡŠΠ·Π½Π°Ρ‚Π° позиция Π½Π° Π²ΠΎΠ΄Π΅Ρ‰ΠΈΡ‚Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈ: β€žΠŸΠΎ-Π΄ΠΎΠ±Ρ€Π΅ Π΄Π° ΡƒΡΡŠΠ²ΡŠΡ€ΡˆΠ΅Π½ΡΡ‚Π²Π°ΠΌΠ΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ‚ΠΎΡ€Π° Π½Π° заявки, ΠΎΡ‚ΠΊΠΎΠ»ΠΊΠΎΡ‚ΠΎ Π΄Π° Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΠΌ Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈΡ‚Π΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ някакви ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠΈβ€œ.

Но, Π²ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‡Π΅ PostgreSQL Π½Π΅ позволява "ΠΎΡ‚Π²ΡŠΠ½" Π΄Π° сС управлява, Ρ‚ΠΎΠΉ прСдоставя ΠΎΡ‚Π»ΠΈΡ‡Π½Π° Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅ ΠΊΠ°ΠΊΠ²ΠΎ сС случва "Π²ΡŠΡ‚Ρ€Π΅", ΠΊΠΎΠ³Π°Ρ‚ΠΎ ΠΈΠ·ΠΏΡŠΠ»Π½ΡΠ²Π°Ρ‚Π΅ Π²Π°ΡˆΠ°Ρ‚Π° заявка ΠΈ къдС Π²ΡŠΠ·Π½ΠΈΠΊΠ²Π°Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈΡ‚Π΅.

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

ОбикновСно, с ΠΊΠ°ΠΊΠ²ΠΈ класичСски ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ сС сблъсква Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡŠΡ‚ [ΠΊ DBA]? "Π’ ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° заявка ΠΈ всичко Π½ΠΈ Π΅ Π±Π°Π²Π½ΠΎ, всичко засяда, Π½Π΅Ρ‰ΠΎ сС случва… ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌ!"

ΠŸΡ€ΠΈΡ‡ΠΈΠ½ΠΈΡ‚Π΅ ΠΏΠΎΡ‡Ρ‚ΠΈ Π²ΠΈΠ½Π°Π³ΠΈ са Π΅Π΄Π½ΠΈ ΠΈ ΡΡŠΡ‰ΠΈ:

  • Π½Π΅Π΅Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π΅Π½ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΡŠΠΌ Π½Π° заявка
    Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡŠΡ‚: "Π‘Π΅Π³Π° ΠΈΠΌΠ°ΠΌ 10 Ρ‚Π°Π±Π»ΠΈΡ†ΠΈ ΠΏΡ€Π΅Π· JOIN Π² SQL…" β€” ΠΈ ΠΎΡ‡Π°ΠΊΠ²Π°, Ρ‡Π΅ условията ΠΌΡƒ прСкрасно Ρ‰Π΅ сС "Ρ€Π°Π·Π²ΡŠΡ€ΠΆΠ°Ρ‚" ΠΈ Ρ‚ΠΎΠΉ Ρ‰Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈ всичко Π±ΡŠΡ€Π·ΠΎ. Но чудСса Π½Π΅ сС случват, ΠΈ всяка систСма ΠΏΡ€ΠΈ Ρ‚Π°ΠΊΠ°Π²Π° промСнливост (10 Ρ‚Π°Π±Π»ΠΈΡ†ΠΈ Π² Π΅Π΄ΠΈΠ½ FROM) Π²ΠΈΠ½Π°Π³ΠΈ Π΄Π°Π²Π° някаква нСточност. [статия]
  • Π½Π΅Π°ΠΊΡ‚ΡƒΠ°Π»Π½Π° статистика
    ΠœΠΎΠΌΠ΅Π½Ρ‚ΡŠΡ‚ Π΅ ΠΈΠ·ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»Π½ΠΎ Π²Π°ΠΆΠ΅Π½ Ρ‚ΠΎΡ‡Π½ΠΎ Π·Π° PostgreSQL, ΠΊΠΎΠ³Π°Ρ‚ΠΎ стС "Π²Π»ΠΈΠ»ΠΈ" голям Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ Π΄Π°Π½Π½ΠΈ Π½Π° ΡΡŠΡ€Π²ΡŠΡ€Π°, ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ заявка β€” Π° Ρ‚ΠΎΠΉ "сканира" Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π°. Π—Π°Ρ‰ΠΎΡ‚ΠΎ Π²Ρ‡Π΅Ρ€Π° Π΅ ΠΈΠΌΠ°Π»ΠΎ 10 записа Π² нСя, Π° днСс 10 ΠΌΠΈΠ»ΠΈΠΎΠ½Π°, Π½ΠΎ PostgreSQL всС ΠΎΡ‰Π΅ Π½Π΅ Π΅ наясно с Ρ‚ΠΎΠ²Π°, ΠΈ трябва Π΄Π° ΠΌΡƒ ΠΊΠ°ΠΆΠ΅Ρ‚Π΅. [статия]
  • "стСсняванС" ΠΏΠΎ рСсурси
    Π‘Π»ΠΎΠΆΠΈΠ»ΠΈ стС голяма ΠΈ Π½Π°Ρ‚ΠΎΠ²Π°Ρ€Π΅Π½Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ Π½Π° слаб ΡΡŠΡ€Π²ΡŠΡ€, ΠΊΠΎΠΉΡ‚ΠΎ няма Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΎ дисково пространство, ΠΏΠ°ΠΌΠ΅Ρ‚ ΠΈΠ»ΠΈ производитСлност Π½Π° самия процСсор. И Ρ‚ΠΎΠ²Π° Π΅ всичко… НякъдС ΠΈΠΌΠ° Ρ‚Π°Π²Π°Π½ Π½Π° производитСлността, Π½Π°Π΄ ΠΊΠΎΠΉΡ‚ΠΎ Π²Π΅Ρ‡Π΅ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° скочитС.
  • Π±Π»ΠΎΠΊΠΈΡ€Π°Π½Π΅
    Π‘Π»ΠΎΠΆΠ΅Π½ ΠΌΠΎΠΌΠ΅Π½Ρ‚, Π½ΠΎ Ρ‚Π΅ са Π½Π°ΠΉ-Π°ΠΊΡ‚ΡƒΠ°Π»Π½ΠΈ Π·Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€Π°Ρ‰ΠΈ заявки (INSERT, UPDATE, DELETE) β€” Ρ‚ΠΎΠ²Π° Π΅ ΠΎΡ‚Π΄Π΅Π»Π½Π° голяма Ρ‚Π΅ΠΌΠ°.

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

… А Π·Π° всичко останало Π½ΠΈ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ ΠΏΠ»Π°Π½! Врябва Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠ°ΠΊΠ²ΠΎ сС случва Π²ΡŠΡ‚Ρ€Π΅ Π² ΡΡŠΡ€Π²ΡŠΡ€Π°.

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

ΠŸΠ»Π°Π½ΡŠΡ‚ Π·Π° изпълнСниС Π½Π° заявката Π·Π° PostgreSQL Π΅ Π΄ΡŠΡ€Π²ΠΎ Π½Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΡŠΠΌΠ° Π·Π° изпълнСниС Π½Π° заявката Π² тСкстово прСдставянС. Π’ΠΎΠ²Π° Π΅ ΠΈΠΌΠ΅Π½Π½ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΡŠΠΌΡŠΡ‚, ΠΊΠΎΠΉΡ‚ΠΎ Π² Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π° Π΅ ΠΏΡ€ΠΈΠ·Π½Π°Ρ‚ ΠΎΡ‚ планиращия Π·Π° Π½Π°ΠΉ-Π΅Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π΅Π½.

ВсСки възСл ΠΎΡ‚ Π΄ΡŠΡ€Π²ΠΎΡ‚ΠΎ Π΅ опСрация: ΠΈΠ·Π²Π»ΠΈΡ‡Π°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΎΡ‚ Ρ‚Π°Π±Π»ΠΈΡ†Π° ΠΈΠ»ΠΈ индСкс, ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° Π±ΠΈΡ‚ΠΎΠ²Π° ΠΊΠ°Ρ€Ρ‚Π°, ΡΠ²ΡŠΡ€Π·Π²Π°Π½Π΅ Π½Π° Π΄Π²Π΅ Ρ‚Π°Π±Π»ΠΈΡ†ΠΈ, обСдиняванС, прСсичанС ΠΈΠ»ΠΈ ΠΈΠ·ΠΊΠ»ΡŽΡ‡Π²Π°Π½Π΅ Π½Π° ΠΈΠ·Π²Π°Π΄ΠΊΠΈ. Π˜Π·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° заявката Π΅ ΠΏΡ€Π΅ΠΌΠΈΠ½Π°Π²Π°Π½Π΅ ΠΏΡ€Π΅Π· Π²ΡŠΠ·Π»ΠΈΡ‚Π΅ Π½Π° Ρ‚ΠΎΠ²Π° Π΄ΡŠΡ€Π²ΠΎ.

Π—Π° Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΠΏΠ»Π°Π½Π° Π½Π° заявката, Π½Π°ΠΉ-простият Π½Π°Ρ‡ΠΈΠ½ Π΅ Π΄Π° ΠΈΠ·ΠΏΡŠΠ»Π½ΠΈΡ‚Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° EXPLAIN. Π—Π° Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ с всички Ρ€Π΅Π°Π»Π½ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΈ, Π²ΡΡŠΡ‰Π½ΠΎΡΡ‚ ΠΈΠ·ΠΏΡŠΠ»Π½ΡΠ²Π°Ρ‚Π΅ заявката Π½Π° Π±Π°Π·Π°Ρ‚Π° β€” EXPLAIN (ANALYZE, BUFFERS) SELECT ....

Π›ΠΎΡˆ ΠΌΠΎΠΌΠ΅Π½Ρ‚: ΠΊΠΎΠ³Π°Ρ‚ΠΎ Π³ΠΎ ΠΈΠ·ΠΏΡŠΠ»Π½ΡΠ²Π°Ρ‚Π΅, Ρ‚ΠΎΠ²Π° сС случва Β«Ρ‚ΡƒΠΊ ΠΈ сСга», ΠΊΠΎΠ΅Ρ‚ΠΎ Π³ΠΎ ΠΏΡ€Π°Π²ΠΈ подходящо само Π·Π° Π»ΠΎΠΊΠ°Π»Π½Π° ΠΎΡ‚Π»Π°Π΄ΠΊΠ°. Ако ΠΎΠ±Π°Ρ‡Π΅ Π²Π·Π΅ΠΌΠ΅Ρ‚Π΅ някой силно Π½Π°Ρ‚ΠΎΠ²Π°Ρ€Π΅Π½ ΡΡŠΡ€Π²ΡŠΡ€, ΠΊΠΎΠΉΡ‚ΠΎ Π΅ ΠΏΠΎΠ΄ силСн ΠΏΠΎΡ‚ΠΎΠΊ ΠΎΡ‚ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π² Π΄Π°Π½Π½ΠΈΡ‚Π΅, ΠΈ Π²ΠΈΠ΄ΠΈΡ‚Π΅: «О, Π½Π΅! Π’ΡƒΠΊ ΠΈΠΌΠ°ΠΌΠ΅ Π±Π°Π²Π½ΠΎ изпълнСниС назаявка.Β» Половин час, час Π½Π°Π·Π°Π΄ β€” Π΄ΠΎΠΊΠ°Ρ‚ΠΎ Ρ‚ΠΈΡ‡Π°Ρ…Ρ‚Π΅ ΠΈ ΠΈΠ·Π²Π»ΠΈΡ‡Π°Ρ…Ρ‚Π΅ Ρ‚Π°Π·ΠΈ заявка ΠΎΡ‚ Π»ΠΎΠ³ΠΎΠ²Π΅Ρ‚Π΅, носСхтС я ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π½Π° ΡΡŠΡ€Π²ΡŠΡ€Π°, всичкитС Π²ΠΈ Π½Π°Π±ΠΎΡ€ΠΈ ΠΎΡ‚ Π΄Π°Π½Π½ΠΈ ΠΈ статистики сС ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ…Π°. Π˜Π·ΠΏΡŠΠ»Π½ΡΠ²Π°Ρ‚Π΅ я, Π·Π° Π΄Π° ΠΎΡ‚Π»Π°Π΄ΠΈΡ‚Π΅ β€” ΠΈ тя сС изпълнява Π±ΡŠΡ€Π·ΠΎ! И Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π΅Ρ‚Π΅ Β«Π·Π°Ρ‰ΠΎΒ», Π·Π°Ρ‰ΠΎ Π±Π°Π²Π½ΠΎ. Π΄Π° ΠΈΠΌΠ° Π—Π° Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π΅Ρ‚Π΅ ΠΊΠ°ΠΊΠ²ΠΎ Ρ‚ΠΎΡ‡Π½ΠΎ сС Π΅ случвало Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°, ΠΊΠΎΠ³Π°Ρ‚ΠΎ заявката сС изпълнява Π½Π° ΡΡŠΡ€Π²ΡŠΡ€Π°, ΡƒΠΌΠ½ΠΈΡ‚Π΅ Ρ…ΠΎΡ€Π° написаха

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

ΠΌΠΎΠ΄ΡƒΠ» auto_explain . Π’ΠΎΠΉ ΠΏΡ€ΠΈΡΡŠΡΡ‚Π²Π° практичСски във всички Π½Π°ΠΉ-разпространСни дистрибуции Π½Π° PostgreSQL ΠΈ ΠΌΠΎΠΆΠ΅ просто Π΄Π° сС Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π° Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ Ρ„Π°ΠΉΠ»Π°.Ако Ρ€Π°Π·Π±Π΅Ρ€Π΅, Ρ‡Π΅ някоя заявка сС изпълнява ΠΏΠΎ-дълго ΠΎΡ‚ Π»ΠΈΠΌΠΈΡ‚Π°, ΠΊΠΎΠΉΡ‚ΠΎ стС ΠΌΡƒ Π·Π°Π΄Π°Π»ΠΈ, Ρ‚ΠΎΠΉ ΠΏΡ€Π°Π²ΠΈ

«снимка» Π½Π° ΠΏΠ»Π°Π½Π° Π½Π° Ρ‚Π°Π·ΠΈ заявка ΠΈ записва Π³ΠΈ Π·Π°Π΅Π΄Π½ΠΎ Π² Π»ΠΎΠ³ ИзглСТда всичко Π΅ Π΄ΠΎΠ±Ρ€Π΅, ΠΎΡ‚ΠΈΠ²Π°ΠΌΠ΅ Π² Π»ΠΎΠ³ΠΎΠ²Π΅Ρ‚Π΅ ΠΈ Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅ там… [портянка тСкст]. Но Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΊΠ°ΠΆΠ΅ΠΌ Π½ΠΈΡ‰ΠΎ Π·Π° Π½Π΅Π³ΠΎ, освСн Ρ„Π°ΠΊΡ‚Π°, Ρ‡Π΅ Ρ‚ΠΎΠ²Π° Π΅ ΠΎΡ‚Π»ΠΈΡ‡Π΅Π½ ΠΏΠ»Π°Π½, Π·Π°Ρ‰ΠΎΡ‚ΠΎ Π΅ изпълняван 11 мс..

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

ИзглСТда всичко Π΅ Π½Π°Ρ€Π΅Π΄ β€” Π½ΠΎ Π½ΠΈΡ‰ΠΎ Π½Π΅ Π΅ ясно ΠΊΠ°ΠΊΠ²ΠΎ наистина сС Π΅ случвало. ОсвСн ΠΎΠ±Ρ‰ΠΎΡ‚ΠΎ Π²Ρ€Π΅ΠΌΠ΅, ΠΏΠΎΡ‡Ρ‚ΠΈ Π½ΠΈΡ‰ΠΎ Π½Π΅ Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅. Π—Π°Ρ‰ΠΎΡ‚ΠΎ Π΄Π° сС Π³Π»Π΅Π΄Π° Π½Π° Ρ‚Π°ΠΊΠ°Π²Π° Β«Π»Π°Ρ‚ΡƒΡ…Π°Β» 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 ΠΎΡ‚ възСла CTE Scan.Π—Π°Ρ‚ΠΎΠ²Π° Π²Π΅Ρ‡Π΅ Π½Π΅ Π·Π½Π°Π΅ΠΌ правилния ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€, ΠΊΠΎΠ»ΠΊΠΎ Π²Ρ€Π΅ΠΌΠ΅ ΠΎΡ‚Π½Π΅ самото сканиранС CTE.

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

Π’ΡƒΠΊ Ρ€Π°Π·Π±Ρ€Π°Ρ…ΠΌΠ΅, Ρ‡Π΅ Π΅ Π²Ρ€Π΅ΠΌΠ΅ Π΄Π° напишСм нашС β€” ΡƒΡ€Π°-ΡƒΡ€Π°! ВсСки Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΊΠ°Π·Π²Π°: β€žΠ‘Π΅Π³Π° Ρ‰Π΅ напишСм нашС, Ρ‰Π΅ бъдС супСр лСсно!β€œ

Π’Π·Π΅Ρ…ΠΌΠ΅ Ρ‚ΠΈΠΏΠΈΡ‡Π΅Π½ стСк Π·Π° ΡƒΠ΅Π± услуги: ядро Π½Π° Node.js + Express, слоТихмС Bootstrap ΠΈ Π·Π° красивитС Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΈ β€” D3.js. И Π½Π°ΡˆΠΈΡ‚Π΅ очаквания сС ΠΎΠΏΡ€Π°Π²Π΄Π°Ρ…Π° β€” ΠΏΡŠΡ€Π²ΠΈΡΡ‚ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ…ΠΌΠ΅ Π·Π° 2 сСдмици:

  • собствСн парсСр Π½Π° ΠΏΠ»Π°Π½Π°
    Π’ΠΎΠ²Π° ΠΎΠ·Π½Π°Ρ‡Π°Π²Π°, Ρ‡Π΅ сСга ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π°ΠΌΠ΅ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ всСки ΠΏΠ»Π°Π½, ΠΊΠΎΠΉΡ‚ΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π° PostgreSQL.
  • ΠΊΠΎΡ€Π΅ΠΊΡ‚Π΅Π½ Π°Π½Π°Π»ΠΈΠ· Π½Π° Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π½ΠΈΡ‚Π΅ възли β€” CTE Scan, InitPlan, SubPlan
  • Π°Π½Π°Π»ΠΈΠ· Π½Π° Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° buffers β€” къдС сС Ρ‡Π΅Ρ‚Π°Ρ‚ страницитС с Π΄Π°Π½Π½ΠΈ ΠΎΡ‚ ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π°, къдС ΠΎΡ‚ локалния кСш, къдС ΠΎΡ‚ диска
  • ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ…ΠΌΠ΅ Π·Π°Π±Π΅Π»Π΅ΠΆΠΈΡ‚Π΅Π»Π½Π° визуализация
    Π—Π° Π΄Π° Π½Π΅ β€žΠΊΠΎΠΏΠ°Π΅ΠΌβ€œ всичко Ρ‚ΠΎΠ²Π° Π² Π»ΠΎΠ³ΠΎΠ²Π΅Ρ‚Π΅, Π° Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ β€žΠ½Π°ΠΉ-слабата Π²Ρ€ΡŠΠ·ΠΊΠ°β€œ Π²Π΅Π΄Π½Π°Π³Π° Π½Π° ΠΊΠ°Ρ€Ρ‚ΠΈΠ½Π°Ρ‚Π°.

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

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ…ΠΌΠ΅ ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»Π½ΠΎ Ρ‚Π°ΠΊΠ°Π²Π° ΠΊΠ°Ρ€Ρ‚ΠΈΠ½Π° β€” Π²Π΅Π΄Π½Π°Π³Π° с подсвСтка Π½Π° синтаксиса. Но ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ Π½Π°ΡˆΠΈΡ‚Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈ работят Π½Π΅ с пълно прСдставянС Π½Π° ΠΏΠ»Π°Π½Π°, Π° с Ρ‚ΠΎΠ²Π°, ΠΊΠΎΠ΅Ρ‚ΠΎ Π΅ ΠΏΠΎ-ΠΊΡ€Π°Ρ‚ΠΊΠΎ. ВсСки Π½ΠΎΠΌΠ΅Ρ€ Π²Π΅Ρ‡Π΅ смС Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π°Π»ΠΈ ΠΈ отстранили, Π° посрСдата оставихмС само ΠΏΡŠΡ€Π²ΠΈΡ Ρ€Π΅Π΄, ΠΊΠΎΠΉΡ‚ΠΎ ΠΏΠΎΠΊΠ°Π·Π²Π° какъв Π΅ Π²ΡŠΠ·Π΅Π»ΡŠΡ‚: CTE Scan, гСнСрация Π½Π° CTE ΠΈΠ»ΠΈ Seq Scan ΠΏΠΎ някаква Ρ‚Π°Π±Π»ΠΈΡ†Π°.

Π’ΠΎΠ²Π° опростСно прСдставянС Π½Π°Ρ€ΠΈΡ‡Π°ΠΌΠ΅ шаблон Π½Π° ΠΏΠ»Π°Π½Π°.

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

Какво ΠΎΡ‰Π΅ Π±ΠΈ Π±ΠΈΠ»ΠΎ ΡƒΠ΄ΠΎΠ±Π½ΠΎ? ЩСшС Π΄Π° Π΅ ΡƒΠ΄ΠΎΠ±Π½ΠΎ Π΄Π° Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅ ΠΊΠ°ΠΊΠ²Π° част ΠΎΡ‚ ΠΎΠ±Ρ‰ΠΎΡ‚ΠΎ Π²Ρ€Π΅ΠΌΠ΅ сС разпрСдСля Π½Π° ΠΊΠΎΠΉ възСл β€” ΠΈ просто β€žΠΏΡ€ΠΈΠΊΠ»Π΅ΠΈΡ…ΠΌΠ΅β€œ отстрани Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠ° с ΠΏΠ°ΠΉ.

НавСТдамС курсора Π½Π° възСла ΠΈ Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅ β€” ΠΎΠΊΠ°Π·Π²Π° сС, Ρ‡Π΅ Seq Scan ΠΎΡ‚Π½Π΅Π» ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ ΠΎΡ‚ Ρ‡Π΅Ρ‚Π²ΡŠΡ€Ρ‚ ΠΎΡ‚ всичкото Π²Ρ€Π΅ΠΌΠ΅, Π° останалитС 3/4 ΠΎΡ‚ΠΈΠ΄Π΅ Π·Π° CTE Scan. УТас! Π’ΠΎΠ²Π° Π΅ ΠΌΠ°Π»ΠΊΠΎ Π·Π°Π±Π΅Π»Π΅ΠΆΠΊΠ° относно β€žΡΠΊΠΎΡ€ΠΎΡΡ‚Ρ‚Π°β€œ Π½Π° CTE Scan, Π°ΠΊΠΎ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ Π³ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ Π² своитС запитвания. Π’Π΅ Π½Π΅ са ΠΌΠ½ΠΎΠ³ΠΎ Π±ΡŠΡ€Π·ΠΈ β€” Π΄ΠΎΡ€ΠΈ губят Π½Π° ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎΡ‚ΠΎ сканиранС Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†ΠΈ. [статия] [статия]

Но ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ Ρ‚Π°ΠΊΠΈΠ²Π° Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΈ са ΠΏΠΎ-интСрСсни, ΠΏΠΎ-слоТни, ΠΊΠΎΠ³Π°Ρ‚ΠΎ Π½Π°Π²Π΅Π΄Π΅ΠΌ курсора Π½Π° сСгмСнта ΠΈ Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‡Π΅ ΠΏΠΎΠ²Π΅Ρ‡Π΅ ΠΎΡ‚ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π°Ρ‚Π° ΠΎΡ‚ всичкото Π²Ρ€Π΅ΠΌΠ΅ Π΅ β€žΠΈΠ·ΡΠ»β€œ някакъв Seq Scan. И Π²ΡŠΡ‚Ρ€Π΅ имашС някакъв Filter, ΠΊΡƒΠΏ записи бяха ΠΎΡ‚Ρ…Π²ΡŠΡ€Π»Π΅Π½ΠΈ ΠΎΡ‚ Π½Π΅Π³ΠΎ... МоТСм Π΄Π° ΠΈΠ·ΠΏΡ€Π°Ρ‚ΠΈΠΌ Ρ‚Π°Π·ΠΈ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½Π° Π½Π°ΠΏΡ€Π°Π²ΠΎ Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ΠΈ Π΄Π° ΠΊΠ°ΠΆΠ΅ΠΌ: β€žΠ’Π°ΡΡ, ΠΏΡ€ΠΈ Ρ‚Π΅Π± всичко Π΅ Π·Π»Π΅! Π Π°Π·Π±Π΅Ρ€ΠΈ, ΠΏΠΎΠ³Π»Π΅Π΄Π½ΠΈ β€” Π½Π΅Ρ‰ΠΎ Π½Π΅ Π΅ Π½Π°Ρ€Π΅Π΄!β€œ

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

ЕстСствСно, Π½Π΅ ΠΌΠΈΠ½Π°Ρ…ΠΌΠ΅ Π±Π΅Π· β€žΠ³Ρ€Π°Π±Π»ΠΈβ€œ.

ΠŸΡŠΡ€Π²ΠΎΡ‚ΠΎ, ΠΊΠΎΠ΅Ρ‚ΠΎ "Π½Π°Ρ‚ΡŠΠΊΠ½Π°Ρ…ΠΌΠ΅", Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡŠΡ‚ с Π·Π°ΠΊΡ€ΡŠΠ³Π»Π΅Π½ΠΈΡΡ‚Π°. Π’Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ Π½Π° възСла Π·Π° всСки ΠΎΡ‚Π΄Π΅Π»Π΅Π½ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ Π² ΠΏΠ»Π°Π½Π° сС посочва с точност Π΄ΠΎ 1 мкс. И ΠΊΠΎΠ³Π°Ρ‚ΠΎ броят Π½Π° Ρ†ΠΈΠΊΠ»ΠΈ Π½Π° възСла надвишава, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, 1000 β€” слСд ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ PostgreSQL Π΄Π΅Π»ΠΈ "с точност Π΄ΠΎ", Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ изчислСниС ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ ΠΎΠ±Ρ‰ΠΎΡ‚ΠΎ Π²Ρ€Π΅ΠΌΠ΅ "някъдС ΠΌΠ΅ΠΆΠ΄Ρƒ 0.95 мс ΠΈ 1.05 мс". ΠšΠΎΠ³Π°Ρ‚ΠΎ Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ сС ΠΈΠ·ΠΌΠ΅Ρ€Π²Π° Π² микросСкунди β€” ΠΎ, Π½ΠΈΡ‰ΠΎ особСно, Π½ΠΎ ΠΊΠΎΠ³Π°Ρ‚ΠΎ Π²Π΅Ρ‡Π΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ Π·Π° [ΠΌΠΈΠ»ΠΈ]сСкунди β€” ΠΏΡ€ΠΈ "разпрСдСлянС" Π½Π° рСсурситС ΠΏΠΎ Π²ΡŠΠ·Π»ΠΈΡ‚Π΅ Π½Π° ΠΏΠ»Π°Π½Π°, трябва Π΄Π° Π²Π·Π΅ΠΌΠ΅ΠΌ ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄ Ρ‚Π΅Π·ΠΈ Π΄Π°Π½Π½ΠΈ Π·Π° "ΠΊΠΎΠ»ΠΊΠΎ ΠΊΠΎΠΉ Π΅ ΠΈΠ·Ρ€Π°Π·Ρ…ΠΎΠ΄Π²Π°Π»".

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

Вторият ΠΌΠΎΠΌΠ΅Π½Ρ‚, ΠΏΠΎ-слоТСн, Π΅ Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° рСсурситС (Ρ‚Π΅Π·ΠΈ Π±ΡƒΡ„Π΅Ρ€ΠΈ) ΠΏΠΎ Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π½ΠΈΡ‚Π΅ възли. Π’ΠΎΠ²Π° Π½ΠΈ ΠΎΡ‚Π½Π΅ Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΈ 4 сСдмици ΠΏΡ€Π΅Π· ΠΏΡŠΡ€Π²ΠΈΡ‚Π΅ 2 сСдмици Π½Π° ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠ°.

Π”Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π΅ Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΎ просто β€” ΠΏΡ€Π°Π²ΠΈΠΌ CTE ΠΈ Π² нСя Π½Π΅Ρ‰ΠΎ ΡƒΠΆ Ρ‡Π΅Ρ‚Π΅ΠΌ. Π’ΡΡŠΡ‰Π½ΠΎΡΡ‚, PostgreSQL Π΅ "ΡƒΠΌΠ΅Π½" ΠΈ Π½Π΅ Ρ‰Π΅ Ρ‡Π΅Ρ‚Π΅ Π½ΠΈΡ‰ΠΎ Ρ‚Π°ΠΌ Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»Π½ΠΎ, Π²Π·ΠΈΠΌΠ°ΠΌΠ΅ ΠΏΡŠΡ€Π²ΠΈΡ запис ΠΎΡ‚ нСя, Π° към Π½Π΅Π³ΠΎ β€” стотния ΠΎΡ‚ ΡΡŠΡ‰Π°Ρ‚Π° CTE.

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

Π“Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΠ»Π°Π½Π° ΠΈ Ρ€Π°Π·Π±ΠΈΡ€Π°ΠΌΠ΅ β€” странно, ΠΈΠΌΠ°ΠΌΠ΅ 3 Π±ΡƒΡ„Π΅Ρ€Π° (Π΄Π°Π½Π½ΠΈ) Π±ΠΈΠ»ΠΈ "ΠΈΠ·Ρ€Π°Π·Ρ…ΠΎΠ΄Π²Π°Π½ΠΈ" Π² 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 ΠΊΠ°Ρ‚ΠΎ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ° Π·Π° Π±Π΅ΠΊΠ΅Π½Π΄ позволява лСсно ΠΈ ΡƒΠ΄ΠΎΠ±Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π° с ΠΌΡ€Π΅ΠΆΠΎΠ²ΠΈ съСдинСния ΠΈ Π²ΡŠΠΎΠ±Ρ‰Π΅ с ΠΊΠ°ΠΊΠ²ΠΈΡ‚ΠΎ ΠΈ Π΄Π° Π΅ ΠΏΠΎΡ‚ΠΎΡ†ΠΈ Π΄Π°Π½Π½ΠΈ.

Π‘ΡŠΠΎΡ‚Π²Π΅Ρ‚Π½ΠΎ, Π½ΠΈΠ΅ "ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°ΠΌΠ΅" Π΄Π²Π΅ ΡΠ²ΡŠΡ€Π·Π°Π½ΠΈΡ: ΠΏΡŠΡ€Π²ΠΎΡ‚ΠΎ, Π·Π° Π΄Π° "ΡΠ»ΡƒΡˆΠ°ΠΌΠ΅" самия Π»ΠΎΠ³ ΠΈ Π΄Π° Π³ΠΎ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€Π°ΠΌΠ΅, Π° Π²Ρ‚ΠΎΡ€ΠΎΡ‚ΠΎ β€” Π·Π° Π΄Π° ΠΏΠΈΡ‚Π°ΠΌΠ΅ Π±Π°Π·Π°Ρ‚Π° ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ΠΈΡ‡Π½ΠΎ. "А Π΅Ρ‚ΠΎ Π² Π»ΠΎΠ³Π° Π΄ΠΎΠΉΠ΄Π΅, Ρ‡Π΅ Π΅ Π±Π»ΠΎΠΊΠΈΡ€Π°Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π° с 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 трябва Π΄Π° сС ΠΏΡ€Π΅ΠΊΡŠΡΠ²Π° с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° пСриодичност. Π—Π° нас Π½Π°ΠΉ-СфСктивният ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ сС ΠΎΠΊΠ°Π·Π° ΠΎΠΊΠΎΠ»ΠΎ 100ms β€” затварямС ΠΈ Π²Π΅Π΄Π½Π°Π³Π° ΠΎΡ‚Π½ΠΎΠ²ΠΎ отварямС Π½Π° ΡΡŠΡ‰Π°Ρ‚Π° Ρ‚Π°Π±Π»ΠΈΡ†Π°. А Π°ΠΊΠΎ Π² някакви ΠΏΠΈΠΊΠΎΠ²Π΅ Π½Π΅Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΎ Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅, ΠΏΡ€Π°Π²ΠΈΠΌ ΠΏΡƒΠ» Π΄ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ ΠΏΡ€Π΅Π΄Π΅Π».

Π”ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΎ установихмС, Ρ‡Π΅ Π·Π° Ρ‚Π°ΠΊΡŠΠ² ΠΏΡ€ΠΎΡ„ΠΈΠ» Π½Π° Π½Π°Ρ‚ΠΎΠ²Π°Ρ€Π²Π°Π½Π΅ всяка агрСгация, ΠΏΡ€ΠΈ която записитС сС ΡΡŠΠ±ΠΈΡ€Π°Ρ‚ Π² ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ β€” Π΅ Π·Π»ΠΎ. ΠšΠ»Π°ΡΠΈΡ‡Π΅ΡΠΊΠΎΡ‚ΠΎ Π·Π»ΠΎ Π΅ INSERT ... VALUES ΠΈ слСд Ρ‚ΠΎΠ²Π° 1000 записа. Π—Π°Ρ‰ΠΎΡ‚ΠΎ Π² Ρ‚ΠΎΠ·ΠΈ ΠΌΠΎΠΌΠ΅Π½Ρ‚ възниква ΠΏΠΈΠΊ Π½Π° запис ΠΏΠΎ носитСля, ΠΈ всички останали, ΠΊΠΎΠΈΡ‚ΠΎ сС ΠΎΠΏΠΈΡ‚Π²Π°Ρ‚ Π΄Π° записват Π½Π° диска, Ρ‰Π΅ Ρ‡Π°ΠΊΠ°Ρ‚.

Π—Π° Π΄Π° сС ΠΈΠ·Π±Π΅Π³Π½Π°Ρ‚ Ρ‚Π°ΠΊΠΈΠ²Π° Π°Π½ΠΎΠΌΠ°Π»ΠΈΠΈ, просто Π½Π΅ Π°Π³Ρ€Π΅Π³ΠΈΡ€Π°ΠΉΡ‚Π΅ Π½ΠΈΡ‰ΠΎ, Π½Π΅ Π±ΡƒΡ„Π΅Ρ€ΠΈΠ·ΠΈΡ€Π°ΠΉΡ‚Π΅ ΠΈΠ·ΠΎΠ±Ρ‰ΠΎ. И Π°ΠΊΠΎ всС ΠΏΠ°ΠΊ възникнС буфСризация Π½Π° диска (Π·Π° щастиС, Stream API Π² Node.js позволява Π΄Π° сС установи Ρ‚ΠΎΠ²Π°) β€” ΠΎΡ‚Π»ΠΎΠΆΠ΅Ρ‚Π΅ Ρ‚ΠΎΠ²Π° ΡΠ²ΡŠΡ€Π·Π²Π°Π½Π΅. Π•Ρ‚ΠΎ ΠΊΠΎΠ³Π°Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅, Ρ‡Π΅ ΠΎΡ‚Π½ΠΎΠ²ΠΎ Π΅ свободно β€” записвайтС Π² Π½Π΅Π³ΠΎ ΠΎΡ‚ Π½Π°Ρ‚Ρ€ΡƒΠΏΠ°Π½Π°Ρ‚Π° опашка. А Π΄ΠΎΠΊΠ°Ρ‚ΠΎ Π΅ Π·Π°Π΅Ρ‚ΠΎ β€” Π²Π·Π΅ΠΌΠ΅Ρ‚Π΅ слСдващото, свободно ΠΎΡ‚ ΠΏΡƒΠ»Π°, ΠΈ записвайтС Π² Π½Π΅Π³ΠΎ.

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

Π Π°Π·Π±ΠΈΡ€Π°ΠΌΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈΡ‚Π΅

Но просто ΡΡŠΠ±ΠΈΡ€Π°Π½Π΅ Π½Π° всички Ρ‚Π΅Π·ΠΈ Π΄Π°Π½Π½ΠΈ Π΅ Π΄ΠΎΠ±Ρ€Π΅, ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΠΈ умСстно, Π½ΠΎ Π½Π΅Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΎ β€” трябва Π΄Π° Π³ΠΈ Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ. Π—Π°Ρ‰ΠΎΡ‚ΠΎ става Π²ΡŠΠΏΡ€ΠΎΡ Π·Π° ΠΌΠΈΠ»ΠΈΠΎΠ½ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΏΠ»Π°Π½ΠΎΠ²Π΅ Π½Π° Π΄Π΅Π½.

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

Но ΠΌΠΈΠ»ΠΈΠΎΠ½ΠΈΡ‚Π΅ са нСпосилни, ΠΏΡŠΡ€Π²ΠΎ трябва Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ "ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ". И Π½Π° ΠΏΡŠΡ€Π²ΠΎ място, трябва Π΄Π° Ρ€Π΅ΡˆΠΈΠΌ ΠΊΠ°ΠΊ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‰Π΅ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΈΡ€Π°ΠΌΠ΅ Ρ‚ΠΎΠ²Π° "ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ".

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ…ΠΌΠ΅ Ρ‚Ρ€ΠΈ основни ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° Π·Π° сСбС си:

  • ΠΊΠΎΠΉ Ρ‚ΠΎΠ·ΠΈ Π·Π°ΠΏΠΈΡ‚ Π΅ ΠΈΠ·ΠΏΡ€Π°Ρ‚Π΅Π½ ΠΎΡ‚
    Π’.Π΅. ΠΎΡ‚ ΠΊΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΅ "пристигнал": ΡƒΠ΅Π±-интСрфСйс, Π±Π΅ΠΊΠ΅Π½Π΄, ΠΏΠ»Π°Ρ‚Π΅ΠΆΠ½Π° систСма ΠΈΠ»ΠΈ Π½Π΅Ρ‰ΠΎ Π΄Ρ€ΡƒΠ³ΠΎ.
  • ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ Ρ‚ΠΎΠ²Π° сС Π΅ случило
    На ΠΊΠΎΠΉ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π΅Π½ ΡΡŠΡ€Π²ΡŠΡ€. Π—Π°Ρ‰ΠΎΡ‚ΠΎ Π°ΠΊΠΎ ΠΏΠΎΠ΄ Π΅Π΄Π½ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠΌΠ°Ρ‚Π΅ няколко ΡΡŠΡ€Π²ΡŠΡ€Π° ΠΈ извСднъТ Π΅Π΄ΠΈΠ½ "Π·Π°Π±Π°Π²ΠΈ" (ΠΏΠΎΡ€Π°Π΄ΠΈ "Π³Π½ΠΈΠ΅Π½Π΅ Π½Π° диска", "ΠΏΡ€ΠΎΡ‚ΠΈΡ‡Π°Π½Π΅ Π½Π° ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π°" ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³Π° Π±Π΅Π΄Π°), трябва Π΄Π° адрСсиратС ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ Π΄ΠΎ ΡΡŠΡ€Π²ΡŠΡ€Π°.
  • ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡŠΡ‚ сС Π΅ проявил Π² ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π΅Π½ ΠΏΠ»Π°Π½

Π—Π° Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ "ΠΊΠΎΠΉ" Π½ΠΈ Π΅ ΠΈΠ·ΠΏΡ€Π°Ρ‚ΠΈΠ» Π·Π°ΠΏΠΈΡ‚Π²Π°Π½Π΅Ρ‚ΠΎ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ стандартСн инструмСнт β€” Π·Π°Π΄Π°Π²Π°ΠΌΠ΅ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° Π½Π° сСсията: 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

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster