Slide 1

Slide 1 text

͸͡ΊͯͷPostgreSQL
 ϞχλϦϯάೖ໳ PostgreSQLΧϯϑΝϨϯε2019

Slide 2

Slide 2 text

͸͡Ίʹ ࣭໰Ͱ͢ʂPostgreSQLΛಋೖͨ͠ޙ
 ϞχλϦϯάΛߦͳ͍ͬͯ·͔͢ʁ

Slide 3

Slide 3 text

͸͡Ίʹ σʔλϕʔε͸ಋೖ͢Δ͚ͩͰऴΘΓͰ ͸͋Γ·ͤΜɻ

Slide 4

Slide 4 text

͸͡Ίʹ ো֐ݕ஌΍ো֐ൃੜՕॴͷಛఆ౳Λ
 ߦ͏ͨΊɺϞχλϦϯά͕ඞཁͰ͢ɻ

Slide 5

Slide 5 text

͸͡Ίʹ ຊηογϣϯͰ͸ɺϞχλϦϯάΛ
 ߦ͏ͨΊͷ৘ใΛ͝঺հ͠·͢ɻ

Slide 6

Slide 6 text

͸͡Ίʹ ຊηογϣϯ࡞੒ʹ͋ͨΓɺҎԼͷॻ੶͓ΑͼεϥΠυΛࢀߟʹ͍ͯ͠·͢ɻ ીࠜ ૖େཧࣄ: PostgreSQLͷ಺෦ߏ଄ͱPostgreSQLͷ؂ࢹͷجຊ
 https://speakerdeck.com/soudai/postgresql-architecture-and- performance-monitoring

Slide 7

Slide 7 text

͓͜ͱΘΓ ࢲ͸ΦϯϓϨϛε؀ڥͰ͔ͭΫϩʔζυωοτϫʔΫͰͷ PostgreSQLߏஙͷΈΛܦݧ͍ͯ͠ΔͨΊɺΫϥ΢υ؀ڥ౳ͷ ϞχλϦϯάπʔϧʹ͍ͭͯ஌ݟ͕ෆ଍͍ͯ͠·͢ɻ ͦͷͨΊɺ౰ηογϣϯͰ͸͍ܰ঺հͷΈ࣮ࢪͱ͍ͤͯͨ͞ ͖ͩ·͢ɻ ·ͨɺίϚϯυ͸શͯRHEL7(CentOS7)Ͱ
 ֬ೝ͍ͯ͠·͢ɻ

Slide 8

Slide 8 text

ΞδΣϯμ ࣗݾ঺հ PostgreSQLͷ಺෦ߏ଄ʹ͍ͭͯ PostgreSQLͷ౷ܭ৘ใ ϞχλϦϯάͰศརͳExtensionͨͪ ऴΘΓʹ

Slide 9

Slide 9 text

ΞδΣϯμ ࣗݾ঺հ PostgreSQLͷ಺෦ߏ଄ʹ͍ͭͯ PostgreSQLͷ౷ܭ৘ใ ϞχλϦϯάͰศརͳExtensionͨͪ ऴΘΓʹ

Slide 10

Slide 10 text

ࣗݾ঺հ ໊લ: ࣉ಺ େً(ͯΒ͏ͪ ͍͖ͨ) ॴଐ: ೔ຊPostgreSQLϢʔβձ
 ؔ੢ࢧ෦௕ Twitter/GitHub: @ester41 ࢓ࣄ: อकɾઃܭɾ։ൃͳͲSE࡞ۀશൠ

Slide 11

Slide 11 text

ΞδΣϯμ ࣗݾ঺հ PostgreSQLͷ಺෦ߏ଄ʹ͍ͭͯ PostgreSQLͷ౷ܭ৘ใ ϞχλϦϯάͰศརͳExtensionͨͪ ऴΘΓʹ

Slide 12

Slide 12 text

PostgreSQLͷ಺෦ߏ଄ʹ͍ͭͯ • ϞχλϦϯάΛߦ͏ʹ͸ɺ·ͣॳΊʹPostgreSQL ͷ಺෦ߏ଄ʹ͍ͭͯཧղ͕ඞཁͱͳΓ·͢ɻ • σʔλϕʔεͷϓϩηεߏ੒ɺϝϞϦʔߏ੒ɺσ ʔλߏ੒ɺΫΤϦղੳॱংʹ͍ͭͯ
 ཧղ͠·͠ΐ͏ɻ

Slide 13

Slide 13 text

PostgreSQLͷ಺෦ߏ଄ʹ͍ͭͯ (ϓϩηεߏ੒) postgres (όοΫΤϯυϓϩηε) postgres (ϥΠλʔ) postgres (νΣοΫϙΠϯλʔ) postgres (౷ܭ৘ใίϨΫλʔ) postgres (ࣗಈόΩϡʔϜϥϯνϟʔ) postgres (ࣗಈόΩϡʔϜϫʔΧʔ) postgres (WALϥΠλʔ) postgres (Ϛελʔαʔόʔϓϩηε) WALόοϑΝʔ WALϑΝΠϧ σʔλϑΝΠϧ ڞ༗όοϑΝʔ ౷ܭ৘ใ ىಈ࣌ʹϓϩηεΛϑΥʔΫ ઀ଓཁٻ͝ͱʹϓϩηεΛϑΥʔΫ ࣗಈόΩϡʔϜΛܖػʹϓϩηεΛϑΥʔΫ

Slide 14

Slide 14 text

PostgreSQLͷ಺෦ߏ଄ʹ͍ͭͯ (ϓϩηεߏ੒) postgres (όοΫΤϯυϓϩηε) postgres (ϥΠλʔ) postgres (νΣοΫϙΠϯλʔ) postgres (౷ܭ৘ใίϨΫλʔ) postgres (ࣗಈόΩϡʔϜϥϯνϟʔ) postgres (ࣗಈόΩϡʔϜϫʔΧʔ) postgres (WALϥΠλʔ) postgres (Ϛελʔαʔόʔϓϩηε) WALόοϑΝʔ WALϑΝΠϧ σʔλϑΝΠϧ ڞ༗όοϑΝʔ ౷ܭ৘ใ ىಈ࣌ʹϓϩηεΛϑΥʔΫ ઀ଓཁٻ͝ͱʹϓϩηεΛϑΥʔΫ ࣗಈόΩϡʔϜΛܖػʹϓϩηεΛϑΥʔΫ શͯͷϓϩηεΛ औΓ·ͱΊΔϓϩηεɻ ͜Ε͕ఀࢭ͢Δͱ PostgreSQLશମ͕ఀࢭ͠·͢ɻ

Slide 15

Slide 15 text

PostgreSQLͷ಺෦ߏ଄ʹ͍ͭͯ (ϓϩηεߏ੒) postgres (όοΫΤϯυϓϩηε) postgres (ϥΠλʔ) postgres (νΣοΫϙΠϯλʔ) postgres (౷ܭ৘ใίϨΫλʔ) postgres (ࣗಈόΩϡʔϜϥϯνϟʔ) postgres (ࣗಈόΩϡʔϜϫʔΧʔ) postgres (WALϥΠλʔ) postgres (Ϛελʔαʔόʔϓϩηε) WALόοϑΝʔ WALϑΝΠϧ σʔλϑΝΠϧ ڞ༗όοϑΝʔ ౷ܭ৘ใ ىಈ࣌ʹϓϩηεΛϑΥʔΫ ઀ଓཁٻ͝ͱʹϓϩηεΛϑΥʔΫ ࣗಈόΩϡʔϜΛܖػʹϓϩηεΛϑΥʔΫ ڞ༗ϝϞϦʔ্ͷWALόοϑΝʔΛ WALϑΝΠϧʹॻ͖ग़͢ϓϩηεɻ ※WAL: τϥϯβΫγϣϯϩά(Write Ahead Logging)

Slide 16

Slide 16 text

PostgreSQLͷ಺෦ߏ଄ʹ͍ͭͯ (ϓϩηεߏ੒) postgres (όοΫΤϯυϓϩηε) postgres (ϥΠλʔ) postgres (νΣοΫϙΠϯλʔ) postgres (౷ܭ৘ใίϨΫλʔ) postgres (ࣗಈόΩϡʔϜϥϯνϟʔ) postgres (ࣗಈόΩϡʔϜϫʔΧʔ) postgres (WALϥΠλʔ) postgres (Ϛελʔαʔόʔϓϩηε) WALόοϑΝʔ WALϑΝΠϧ σʔλϑΝΠϧ ڞ༗όοϑΝʔ ౷ܭ৘ใ ىಈ࣌ʹϓϩηεΛϑΥʔΫ ઀ଓཁٻ͝ͱʹϓϩηεΛϑΥʔΫ ࣗಈόΩϡʔϜΛܖػʹϓϩηεΛϑΥʔΫ ڞ༗ϝϞϦʔ্ͷڞ༗όοϑΝʔ಺ͷ ߋ৽͞ΕͨϖʔδΛରԠ͢Δ σʔλϑΝΠϧͷϒϩοΫʹ ॻ͖ग़͢ϓϩηεɻ

Slide 17

Slide 17 text

PostgreSQLͷ಺෦ߏ଄ʹ͍ͭͯ (ϓϩηεߏ੒) postgres (όοΫΤϯυϓϩηε) postgres (ϥΠλʔ) postgres (νΣοΫϙΠϯλʔ) postgres (౷ܭ৘ใίϨΫλʔ) postgres (ࣗಈόΩϡʔϜϥϯνϟʔ) postgres (ࣗಈόΩϡʔϜϫʔΧʔ) postgres (WALϥΠλʔ) postgres (Ϛελʔαʔόʔϓϩηε) WALόοϑΝʔ WALϑΝΠϧ σʔλϑΝΠϧ ڞ༗όοϑΝʔ ౷ܭ৘ใ ىಈ࣌ʹϓϩηεΛϑΥʔΫ ઀ଓཁٻ͝ͱʹϓϩηεΛϑΥʔΫ ࣗಈόΩϡʔϜΛܖػʹϓϩηεΛϑΥʔΫ શͯͷμʔςΟϖʔδ(ϑΝΠϧγεςϜʹ ॻ͖໭͢ඞཁͷ͋ΔσʔλΛ࣋ͬͨϖʔδ) ΛσʔλϑΝΠϧʹ൓ө͢Δϓϩηεɻ νΣοΫϙΠϯτͱݺ͹ΕΔɺ Ϋϥογϡ࣌ʹϦΧόϦॲཧΛߦ͏ Օॴ୯ҐͰࣗಈతʹ࣮ߦ͠·͢ɻ

Slide 18

Slide 18 text

PostgreSQLͷ಺෦ߏ଄ʹ͍ͭͯ (ϓϩηεߏ੒) postgres (όοΫΤϯυϓϩηε) postgres (ϥΠλʔ) postgres (νΣοΫϙΠϯλʔ) postgres (౷ܭ৘ใίϨΫλʔ) postgres (ࣗಈόΩϡʔϜϥϯνϟʔ) postgres (ࣗಈόΩϡʔϜϫʔΧʔ) postgres (WALϥΠλʔ) postgres (Ϛελʔαʔόʔϓϩηε) WALόοϑΝʔ WALϑΝΠϧ σʔλϑΝΠϧ ڞ༗όοϑΝʔ ౷ܭ৘ใ ىಈ࣌ʹϓϩηεΛϑΥʔΫ ઀ଓཁٻ͝ͱʹϓϩηεΛϑΥʔΫ ࣗಈόΩϡʔϜΛܖػʹϓϩηεΛϑΥʔΫ σʔλϕʔεͷ׆ಈঢ়گʹؔ͢Δ౷ܭ ৘ใΛҰఆִؒͰऩू͢Δϓϩηεɻ

Slide 19

Slide 19 text

PostgreSQLͷ಺෦ߏ଄ʹ͍ͭͯ (ϓϩηεߏ੒) postgres (όοΫΤϯυϓϩηε) postgres (ϥΠλʔ) postgres (νΣοΫϙΠϯλʔ) postgres (౷ܭ৘ใίϨΫλʔ) postgres (ࣗಈόΩϡʔϜϥϯνϟʔ) postgres (ࣗಈόΩϡʔϜϫʔΧʔ) postgres (WALϥΠλʔ) postgres (Ϛελʔαʔόʔϓϩηε) WALόοϑΝʔ WALϑΝΠϧ σʔλϑΝΠϧ ڞ༗όοϑΝʔ ౷ܭ৘ใ ىಈ࣌ʹϓϩηεΛϑΥʔΫ ઀ଓཁٻ͝ͱʹϓϩηεΛϑΥʔΫ ࣗಈόΩϡʔϜΛܖػʹϓϩηεΛϑΥʔΫ ࣗಈόΩϡʔϜΛ ੍ޚɾ࣮ߦ͢Δϓϩηεɻ όΩϡʔϜʹ͍ͭͯ͸ ޙ΄Ͳղઆ͠·͢ɻ

Slide 20

Slide 20 text

PostgreSQLͷ಺෦ߏ଄ʹ͍ͭͯ (ϓϩηεߏ੒) postgres (όοΫΤϯυϓϩηε) postgres (ϥΠλʔ) postgres (νΣοΫϙΠϯλʔ) postgres (౷ܭ৘ใίϨΫλʔ) postgres (ࣗಈόΩϡʔϜϥϯνϟʔ) postgres (ࣗಈόΩϡʔϜϫʔΧʔ) postgres (WALϥΠλʔ) postgres (Ϛελʔαʔόʔϓϩηε) WALόοϑΝʔ WALϑΝΠϧ σʔλϑΝΠϧ ڞ༗όοϑΝʔ ౷ܭ৘ใ ىಈ࣌ʹϓϩηεΛϑΥʔΫ ઀ଓཁٻ͝ͱʹϓϩηεΛϑΥʔΫ ࣗಈόΩϡʔϜΛܖػʹϓϩηεΛϑΥʔΫ ΫϥΠΞϯτ͔Β઀ଓཁٻΛ ड͚ͨ࣌ʹੜ੒͞ΕΔϓϩηεɻ SQLͷ࣮ߦ͸͜ͷϓϩηε಺Ͱ ߦΘΕ·͢ɻ

Slide 21

Slide 21 text

PostgreSQLͷ಺෦ߏ଄ʹ͍ͭͯ (ϝϞϦʔߏ੒) ϓϩηεϝϞϦʔ όοΫΤϯυϓϩηε Ұ࣌όοϑΝʔ (temp_buffers) ࡞ۀϝϞϦʔ (work_mem) ϝϯςφϯε༻࡞ۀϝϞϦʔ (maintenance_work_mem) ڞ༗ϝϞϦʔ WALόοϑΝʔ (wal_buffers) ڞ༗όοϑΝʔ (shard_buffers) σʔλϑΝΠϧ WALϑΝΠϧ WALϥΠλʔϓϩηε όΩϡʔϜϫʔΧʔϓϩηε ۭ͖ྖҬϚοϓ ՄࢹੑϚοϓ ϥΠλʔ/ νΣοΫϙΠϯλʔϓϩηε

Slide 22

Slide 22 text

PostgreSQLͷ಺෦ߏ଄ʹ͍ͭͯ (ϝϞϦʔߏ੒) ϓϩηεϝϞϦʔ όοΫΤϯυϓϩηε Ұ࣌όοϑΝʔ (temp_buffers) ࡞ۀϝϞϦʔ (work_mem) ϝϯςφϯε༻࡞ۀϝϞϦʔ (maintenance_work_mem) ڞ༗ϝϞϦʔ WALόοϑΝʔ (wal_buffers) ڞ༗όοϑΝʔ (shard_buffers) σʔλϑΝΠϧ WALϑΝΠϧ WALϥΠλʔϓϩηε όΩϡʔϜϫʔΧʔϓϩηε ۭ͖ྖҬϚοϓ ՄࢹੑϚοϓ ϥΠλʔ/ νΣοΫϙΠϯλʔϓϩηε Ұ࣌ςʔϒϧʹΞΫηε͢Δ৔߹ʹ ࢖༻͞ΕΔྖҬɻ ઃఆ͞ΕͨྖҬΛ্ݶͱ͠ɺ ඞཁʹԠͯ͡ϝϞϦΛ֬อ͠·͢ɻ

Slide 23

Slide 23 text

PostgreSQLͷ಺෦ߏ଄ʹ͍ͭͯ (ϝϞϦʔߏ੒) ϓϩηεϝϞϦʔ όοΫΤϯυϓϩηε Ұ࣌όοϑΝʔ (temp_buffers) ࡞ۀϝϞϦʔ (work_mem) ϝϯςφϯε༻࡞ۀϝϞϦʔ (maintenance_work_mem) ڞ༗ϝϞϦʔ WALόοϑΝʔ (wal_buffers) ڞ༗όοϑΝʔ (shard_buffers) σʔλϑΝΠϧ WALϑΝΠϧ WALϥΠλʔϓϩηε όΩϡʔϜϫʔΧʔϓϩηε ۭ͖ྖҬϚοϓ ՄࢹੑϚοϓ ϥΠλʔ/ νΣοΫϙΠϯλʔϓϩηε ฒͼସ͑ૢ࡞(ORDER BY, DISTINCT, Ϛʔδ݁߹)ͱ ϋογϡςʔϒϧ(ΠϯσοΫεͳͲ)ૢ࡞ʹ ࢖༻͞ΕΔྖҬɻ ෳࡶͳΫΤϦʹͳΔͱɺ࡞ۀϝϞϦʔ͕ ෳ਺ੜ੒͞Ε·͢ɻ

Slide 24

Slide 24 text

PostgreSQLͷ಺෦ߏ଄ʹ͍ͭͯ (ϝϞϦʔߏ੒) ϓϩηεϝϞϦʔ όοΫΤϯυϓϩηε Ұ࣌όοϑΝʔ (temp_buffers) ࡞ۀϝϞϦʔ (work_mem) ϝϯςφϯε༻࡞ۀϝϞϦʔ (maintenance_work_mem) ڞ༗ϝϞϦʔ WALόοϑΝʔ (wal_buffers) ڞ༗όοϑΝʔ (shard_buffers) σʔλϑΝΠϧ WALϑΝΠϧ WALϥΠλʔϓϩηε όΩϡʔϜϫʔΧʔϓϩηε ۭ͖ྖҬϚοϓ ՄࢹੑϚοϓ ϥΠλʔ/ νΣοΫϙΠϯλʔϓϩηε อकૢ࡞(VACUUM, CREATE INDEXͳͲ)Ͱ ࢖༻͞ΕΔྖҬɻ

Slide 25

Slide 25 text

PostgreSQLͷ಺෦ߏ଄ʹ͍ͭͯ (ϝϞϦʔߏ੒) ϓϩηεϝϞϦʔ όοΫΤϯυϓϩηε Ұ࣌όοϑΝʔ (temp_buffers) ࡞ۀϝϞϦʔ (work_mem) ϝϯςφϯε༻࡞ۀϝϞϦʔ (maintenance_work_mem) ڞ༗ϝϞϦʔ WALόοϑΝʔ (wal_buffers) ڞ༗όοϑΝʔ (shard_buffers) σʔλϑΝΠϧ WALϑΝΠϧ WALϥΠλʔϓϩηε όΩϡʔϜϫʔΧʔϓϩηε ۭ͖ྖҬϚοϓ ՄࢹੑϚοϓ ϥΠλʔ/ νΣοΫϙΠϯλʔϓϩηε σΟεΫʹॻ͖ࠐ·Ε͍ͯͳ͍ WALΛΩϟογϡ͢ΔྖҬɻ

Slide 26

Slide 26 text

PostgreSQLͷ಺෦ߏ଄ʹ͍ͭͯ (ϝϞϦʔߏ੒) ϓϩηεϝϞϦʔ όοΫΤϯυϓϩηε Ұ࣌όοϑΝʔ (temp_buffers) ࡞ۀϝϞϦʔ (work_mem) ϝϯςφϯε༻࡞ۀϝϞϦʔ (maintenance_work_mem) ڞ༗ϝϞϦʔ WALόοϑΝʔ (wal_buffers) ڞ༗όοϑΝʔ (shard_buffers) σʔλϑΝΠϧ WALϑΝΠϧ WALϥΠλʔϓϩηε όΩϡʔϜϫʔΧʔϓϩηε ۭ͖ྖҬϚοϓ ՄࢹੑϚοϓ ϥΠλʔ/ νΣοΫϙΠϯλʔϓϩηε ςʔϒϧ΍ΠϯσοΫεσʔλΛ Ωϟογϡ͢ΔྖҬɻ

Slide 27

Slide 27 text

PostgreSQLͷ಺෦ߏ଄ʹ͍ͭͯ (ϝϞϦʔߏ੒) ϓϩηεϝϞϦʔ όοΫΤϯυϓϩηε Ұ࣌όοϑΝʔ (temp_buffers) ࡞ۀϝϞϦʔ (work_mem) ϝϯςφϯε༻࡞ۀϝϞϦʔ (maintenance_work_mem) ڞ༗ϝϞϦʔ WALόοϑΝʔ (wal_buffers) ڞ༗όοϑΝʔ (shard_buffers) σʔλϑΝΠϧ WALϑΝΠϧ WALϥΠλʔϓϩηε όΩϡʔϜϫʔΧʔϓϩηε ۭ͖ྖҬϚοϓ ՄࢹੑϚοϓ ϥΠλʔ/ νΣοΫϙΠϯλʔϓϩηε ςʔϒϧ্ͷར༻ՄೳͳྖҬΛ ؅ཧ͢ΔྖҬɻ όΩϡʔϜॲཧ΍ɺ σʔλͷ௥Ճɾߋ৽࣌ʹ ࢖༻͞Ε·͢ɻ

Slide 28

Slide 28 text

PostgreSQLͷ಺෦ߏ଄ʹ͍ͭͯ (ϝϞϦʔߏ੒) ϓϩηεϝϞϦʔ όοΫΤϯυϓϩηε Ұ࣌όοϑΝʔ (temp_buffers) ࡞ۀϝϞϦʔ (work_mem) ϝϯςφϯε༻࡞ۀϝϞϦʔ (maintenance_work_mem) ڞ༗ϝϞϦʔ WALόοϑΝʔ (wal_buffers) ڞ༗όοϑΝʔ (shard_buffers) σʔλϑΝΠϧ WALϑΝΠϧ WALϥΠλʔϓϩηε όΩϡʔϜϫʔΧʔϓϩηε ۭ͖ྖҬϚοϓ ՄࢹੑϚοϓ ϥΠλʔ/ νΣοΫϙΠϯλʔϓϩηε ςʔϒϧσʔλͷՄࢹঢ়ଶΛ ؅ཧ͢ΔྖҬɻ όΩϡʔϜॲཧ΍ɺ INDEX ONLY SCAN࣌ʹ ࢖༻͞Ε·͢ɻ

Slide 29

Slide 29 text

σΟεΫྖҬ ΞʔΧΠϒWALྖҬ WALྖҬ PostgreSQLͷ಺෦ߏ଄ʹ͍ͭͯ (σʔλߏ੒) σʔλϕʔεྖҬ ςʔϒϧϑΝΠϧ WALϑΝΠϧ ΞʔΧΠϒϑΝΠϧ TOASTϑΝΠϧ ΠϯσοΫεϑΝΠϧ ۭ͖ྖҬϚοϓϑΝΠϧ ՄࢹੑϚοϓϑΝΠϧ ௨ৗ16MBͷWALϑΝΠϧΛ ॥؀ར༻͠·͢ɻ ΞʔΧΠϒϞʔυΛ༗ޮʹ ͢Δ͜ͱͰɺ॥؀ར༻͞Ε ΔWALϑΝΠϧΛอଘ͠· ͢ɻϙΠϯτΠϯλΠϜϦΧ όϦʔͰ࢖༻͠·͢ɻ ςʔϒϧϑΝΠϧɾTOAST ϑΝΠϧɾΠϯσοΫεϑ ΝΠϧʹ͍ͭͯ͸࣍ϖʔδ͔ Βղઆ͠·͢ɻ

Slide 30

Slide 30 text

PostgreSQLͷ಺෦ߏ଄ʹ͍ͭͯ (σʔλߏ੒ ʔ ςʔϒϧϑΝΠϧ) ςʔϒϧϑΝΠϧ ϖʔδ(8KB) ΞΠςϜIDσʔλ1 (4όΠτ) ΞΠςϜIDσʔλ2 (4όΠτ) … ۭ͖ྖҬ ΞΠςϜIDσʔλn (4όΠτ) ΞΠςϜσʔλn(Մม) … ϖʔδϔομʔ (24όΠτ) ΞΠςϜσʔλ1(Մม) ΞΠςϜσʔλ2(Մม) ϖʔδ (8KB) … ςʔϒϧϑΝΠϧ͸ɺ௨ৗ8KBͷϖʔδ͔Βߏ੒͞Ε·͢ɻ ϖʔδ಺ʹσʔλ͕ऩ·Βͳ͘ͳΔͱɺϖʔδ͕৽͘͠ੜ੒͞Ε·͢ɻ

Slide 31

Slide 31 text

PostgreSQLͷ಺෦ߏ଄ʹ͍ͭͯ (σʔλߏ੒ ʔ TOASTϑΝΠϧ) TOASTͱ͸ɺʮաେଐੑ֨ೲٕ๏(The Oversized-Attribute Storage Technique)ʯͷུশͰɺ ඇৗʹେ͖ͳྻͷσʔλ(ΞΠςϜσʔλ)Λ֨ೲ͢ΔͨΊͷٕ๏Ͱ͢ɻ ΞΠςϜσʔλʹ͸TOASTྖҬͷΞΫηεϙΠϯλ͕֨ೲ͞Ε·͢ɻ ςʔϒϧϑΝΠϧ ϖʔδ ΞΠςϜIDσʔλ ϖʔδϔομʔ ۭ͖ྖҬ ΞΠςϜσʔλ TOASTϑΝΠϧ ڊେͳσʔλ1 ڊେͳσʔλ2 ڊେͳσʔλ3 … ΞΠςϜσʔλ͕ϖʔδ αΠζͷ1/4αΠζΛ௒ ͑Δ৔߹ɺTOAST͕࢖ ༻͞Ε·͢ɻ

Slide 32

Slide 32 text

PostgreSQLͷ಺෦ߏ଄ʹ͍ͭͯ (σʔλߏ੒ ʔ ΠϯσοΫεϑΝΠϧ) ΠϯσοΫε͸ɺϖʔδΛϊʔυͱ͢Δ࿦ཧతͳπϦʔߏ଄Λ࣋ͪ·͢ɻ ΠϯσοΫεϑΝΠϧ͸ςʔϒϧϑΝΠϧͱ΄΅ಉ͡ߏ੒ͱͳ͍ͬͯ·͕͢ɺ ֤ϖʔδͷ຤ඌʹΠϯσοΫεΞΫηεϝιουಛ༗ͷσʔλΛอ࣋͢ΔྖҬ͕ଘࡏ͠·͢ɻ ΠϯσοΫε͸ϝλϖʔδɺϧʔτϖʔδɺΠϯλʔφϧϖʔδɺϦʔϑϖʔδͷ4ͭͰߏ੒͠·͢ɻ Ϧʔϑϖʔδʹ͸ɺΧϥϜͷ஋ͱςʔϒϧϖʔδͷΞυϨε͕֨ೲ͞Ε͍ͯ·͢ɻ ΠϯσοΫεϑΝΠϧ ϧʔτ ϖʔδ ϝλ ϖʔδ Πϯλʔφϧ ϖʔδ Ϧʔϑʔ ϖʔδ Πϯλʔφϧ ϖʔδ Πϯλʔφϧ ϖʔδ Ϧʔϑʔ ϖʔδ Ϧʔϑʔ ϖʔδ Ϧʔϑʔ ϖʔδ Ϧʔϑʔ ϖʔδ Ϧʔϑʔ ϖʔδ

Slide 33

Slide 33 text

PostgreSQLͷ಺෦ߏ଄ʹ͍ͭͯ (ΫΤϦͷ࣮ߦॱং) σʔλϕʔεͷϞχλϦϯάΛߦ͏ͨΊʹ͸ΫΤϦͷ࣮ߦॱংʹ͍ͭͯཧղ͢Δඞཁ͕͋Γ·͢ɻ ॲཧ଎౓͕஗͍ݪҼͷ੾Γ෼͚౳ʹ࢖༻Ͱ͖·͢ɻ ౷ܭ৘ใ ϧʔϧఆٛ CREATE RULE۟ Ͱఆٛ SQLจ ໰͍߹ΘͤπϦʔ ໰͍߹ΘͤπϦʔ ࣮ߦܭը ౷ܭ৘ใίϨΫλ Ͱੜ੒ ύʔαʔ (ࣈ۟ղੳ / ߏจղੳ) ϦϥΠλʔ (VIEW΍ϧʔϧͰॻ͖׵͑) ϓϥϯφʔ / ΦϓςΟϚΠβ (࣮ߦܭըͷੜ੒ / ࠷దԽ) ΤάθΩϡʔλʔ (ΫΤϦͷ࣮ߦ)

Slide 34

Slide 34 text

PostgreSQLͷ಺෦ߏ଄ʹ͍ͭͯ (σʔλͷߋ৽) PostgreSQL͸௥هܕΞʔΩςΫνϟΛ࠾༻͍ͯ͠·͢ɻ ௥هܕΞʔΩςΫνϟ͸ɺچϨίʔυΛ࡟আͤͣʹ৽ϨίʔυΛ௥Ճ͢ΔํࣜͰ͢ɻ ςʔϒϧ Ϩίʔυ1 Ϩίʔυ2 Ϩίʔυ3 ςʔϒϧ Ϩίʔυ1 Ϩίʔυ2 Ϩίʔυ3 Ϩίʔυ2 Ϩίʔυ2Λߋ৽ چϨίʔυʹ࡟আ ϑϥάΛཱͯΔ ৽ϨίʔυΛ ௥Ճ͢Δ

Slide 35

Slide 35 text

PostgreSQLͷ಺෦ߏ଄ʹ͍ͭͯ (VACUUM) ௥هܕΞʔΩςΫνϟ͸ߋ৽Λߦ͑͹ߦ͏΄ͲɺෆཁϨίʔυ͕૿Ճ͍͖ͯ͠·͢ɻ PostgreSQL͸ɺچϨίʔυʹࢀর͍ͯ͠ΔผτϥϯβΫγϣϯ͕ແ͘ͳΔͱɺ ࡟আϑϥάཱ͕ͯΒΕͨϨίʔυͷྖҬΛճऩ͢Δػೳ(VACUUM)Λ࣮ߦ͠·͢ɻ ςʔϒϧ Ϩίʔυ1 Ϩίʔυ2 Ϩίʔυ3 ςʔϒϧ Ϩίʔυ1 ۭ͖ྖҬ Ϩίʔυ3 Ϩίʔυ2 VACUUM࣮ߦ Ϩίʔυ2

Slide 36

Slide 36 text

ςʔϒϧ PostgreSQLͷ಺෦ߏ଄ʹ͍ͭͯ (HOTͱFILLFACTOR) ߋ৽Λߦ͏ͱɺΠϯσοΫε͕֨ೲ͍ͯ͠ΔΞυϨε΋มΘͬͯ͠·͍·͢ɻ ߋ৽ͷͨͼʹΠϯσοΫε΋มߋΛߦ͏ͱɺஶ͍͠ੑೳྼԽ͕ى͜Γ·͢ɻ HOT(Heap Only Tuple)͸ɺΠϯσοΫε͕ுΒΕ͍ͯͳ͍ΧϥϜΛߋ৽͢Δ࣌ͷߴ଎Խٕज़ͱͳΓ·͢ɻ FILLFACTOR͸ɺϖʔδͷۭ͖ྖҬΛ؅ཧ͢ΔػೳٴͼύϥϝʔλʔͰ͢ɻ σϑΥϧτ஋͸ɺςʔϒϧͷ৔߹͸"100%"(ۭ͖ແ͠)ɺΠϯσοΫεͷ৔߹͸"90%"ͱͳ͍ͬͯ·͢ɻ ςʔϒϧ Ϩίʔυ1 Ϩίʔυ2 ΠϯσοΫε Ϩίʔυ2 ΠϯσοΫε΋ ߋ৽ • HOT͕ແޮͳ৔߹ Ϩίʔυ1 Ϩίʔυ2 ΠϯσοΫε Ϩίʔυ2 ΠϯσοΫε͸ߋ৽ ͤͣɺ৽Ϩίʔυͷ ΞυϨεΛ௥Ճ • HOT͕༗ޮͳ৔߹

Slide 37

Slide 37 text

ΞδΣϯμ ࣗݾ঺հ PostgreSQLͷ಺෦ߏ଄ʹ͍ͭͯ PostgreSQLͷ౷ܭ৘ใ ϞχλϦϯάͰศརͳExtensionͨͪ ऴΘΓʹ

Slide 38

Slide 38 text

ϞχλϦϯά͸ԿΛߦ͏ͷ͔ σʔλϕʔε͸ɺΞϓϦέʔγϣϯΛࢧ͑Δେ੾ͳϛυϧ΢ΣΞͰ͢ɻ ਖ਼͘͠ಈ࡞͠ͳ͔ͬͨΓੑೳྼԽͰϨεϙϯε͕஗͘ͳΔ͜ͱͰར༻ऀͷෆຬ͕ൃੜ͢ΔͨΊɺ ༧ஹΛൃݟ͠໰୊͕ൃੜ͠ͳ͍Α͏ʹϞχλϦϯάΛߦ͏ඞཁ͕͋Γ·͢ɻ PostgreSQLͷϞχλϦϯά͸2ͭͷ؍఺͕ඞཁͱͳΓ·͢ɻ ϓϩηεىಈঢ়ଶ΍σΟεΫ༰ྔͱ͍ͬͨɺσʔλϕʔεશମʹ͔͔ΘΔϞχλϦϯά ੑೳྼԽΛࣄલʹݕ஌͢ΔͨΊͷϞχλϦϯά(ϩάɾύϑΥʔϚϯε) ϓϩηε͕μϝ ੑೳ͕μϝ ෆຬʂʂʂ

Slide 39

Slide 39 text

PostgreSQLͷ౷ܭ৘ใ (σʔλϕʔεશମʹ͔͔ΘΔ৘ใ) ϓϩηεىಈঢ়ଶͷϞχλϦϯάํ๏ ϓϩηεىಈঢ়ଶͷϞχλϦϯάํ๏͸ɺೋ௨Γͷํ๏͕ଘࡏ͠·͢ɻ 1. psίϚϯυͰ֬ೝΛߦ͏ํ๏
 ҎԼͷίϚϯυͷ݁Ռ͕1Ҏ্ͷ৔߹ɺਖ਼ৗͱΈͳ͠·͢ɻ
 
 2. pg_isreadyίϚϯυͰ֬ೝΛߦ͏ํ๏
 ҎԼͷίϚϯυͷऴྃεςʔλε͕0ͷ৔߹ɺਖ਼ৗͱΈͳ͠·͢ɻ $ ps aux | grep postmaster | wc -l $ /usr/pgsql-11/bin/pg_isready -h localhost -p 15432 -d noa <ϗετ໊>:<ϙʔτ൪߸> - ઀ଓΛड͚෇͚͍ͯ·͢ $ echo $? 0 σΟεΫ࢖༻཰ͷϞχλϦϯάํ๏ ඪ४ͷػೳͰϞχλϦϯά͢Δํ๏͸͋Γ·ͤΜɻ dfίϚϯυ΍duίϚϯυɺͦͷ΄͔ͷπʔϧͰ֬ೝΛߦ͏ඞཁ͕͋Γ·͢ɻ

Slide 40

Slide 40 text

PostgreSQLͷ౷ܭ৘ใ (ੑೳྼԽΛࣄલʹݕ஌͢ΔͨΊͷ౷ܭ৘ใ) PostgreSQLͷ౷ܭ৘ใίϨΫλΛ༻͍ͯϞχλϦϯάΛߦ͍·͢ɻ ౷ܭ৘ใίϨΫλ͸༷ʑͳ৘ใʹΞΫηεͰ͖ΔVIEWΛఏڙ͍ͯ͠·͢ɻ ౷ܭ৘ใίϨΫλʹ͍ͭͯ͸ɺެࣜυΩϡϝϯτΛࢀর͍ͯͩ͘͠͞ɻ https://www.postgresql.jp/document/current/html/monitoring-stats.html VIEW໊ ղઆ pg_stat_activity ঢ়ଶ΍ݱࡏͷ໰͍߹Θͤ౳ͷϓϩηεͷݱࡏͷ׆ಈঢ়گʹؔ࿈ͨ͠৘ใΛදࣔ͠·͢ɻ ෛՙͷߴ͍ɾΫΤϦͷ࣮ߦ͕࣌ؒ௕͍ϓϩηε͕Θ͔Γ·͢ɻ pg_stat_bgwriter όοΫάϥ΢ϯυϥΠλϓϩηεͷ׆ಈঢ়گʹؔ͢Δ౷ܭ৘ใΛදࣔ͠·͢ɻ ͜Ε·Ͱʹ࣮ߦ͞ΕͨνΣοΫϙΠϯτͷճ਺ɾॲཧ࣌ؒ౳͕Θ͔Γ·͢ɻ pg_stat_database σʔλϕʔεશମͷ৘ใΛදࣔ͠·͢ɻ σʔλϕʔε͝ͱͷ૯τϥϯβΫγϣϯ਺ɾϒϩοΫ਺΍ࢀরɾߋ৽ɾ࡟আճ਺౳͕Θ͔Γ·͢ɻ pg_stat_user_tables Ϣʔβʔςʔϒϧ΁ͷΞΫηεʹؔ͢Δ౷ܭ৘ใΛࣔ͠·͢ɻ pg_stat_databaseΛςʔϒϧ୯ҐͰݟΔ͜ͱ͕Ͱ͖ΔΑ͏ʹͳͬͨ΋ͷͰ͢ɻ pg_statio_user_tables Ϣʔβʔςʔϒϧʹର͢ΔI/Oʹؔ͢Δ౷ܭ৘ใΛࣔ͠·͢ɻ pg_stat_user_indexes ϢʔβʔςʔϒϧͷΠϯσοΫε΁ͷΞΫηεʹؔ͢Δ౷ܭ৘ใΛࣔ͠·͢ɻ pg_statio_user_indexes ϢʔβʔςʔϒϧͷΠϯσοΫεʹର͢ΔI/Oʹؔ͢Δ౷ܭ৘ใΛࣔ͠·͢ɻ

Slide 41

Slide 41 text

PostgreSQLͷ౷ܭ৘ใ (ੑೳྼԽΛࣄલʹݕ஌͢ΔͨΊͷ౷ܭ৘ใ) લड़ͷVIEWΛ૊Έ߹ΘͤΔ͜ͱͰɺϞχλϦϯάʹඞཁͳ৘ใΛऔಘ͢Δ͜ͱ͕Ͱ͖·͢ɻ ҎԼͷ৘ใΛऔಘ͢Δ͜ͱ͕ՄೳͰ͢ɻ ʲࢀߟαΠτʳLet’s Postgres Քಈ౷ܭ৘ใΛ׆༻͠Α͏ https://lets.postgresql.jp/documents/technical/statistics DB୯Ґͷίϛοτ਺΍ϩʔϧόοΫ਺ DB΍ςʔϒϧɺΠϯσοΫε୯ҐͷI/Oൃੜঢ়گ DB΍ςʔϒϧʹରͯ͠ૠೖ/ߋ৽/࡟আ͞Εͨߦ਺ ςʔϒϧ୯ҐͰ࣮ࢪ͞ΕͨදεΩϟϯճ਺ DB΍ςʔϒϧɺΠϯσοΫε୯ҐͰεΩϟϯ͞Εͨߦ਺ ςʔϒϧ୯Ґͷߦ਺ɺΨϕʔδྔ ݱࡏ࣮ࢪதͷSQL΍ϝϯςφϯεॲཧ ౷ܭ৘ใίϨΫλ͸ɺ”ݱࡏͷঢ়ଶ”͔͠ݟΔ͜ͱ͸Ͱ͖·ͤΜɻ ϞχλϦϯάΛਖ਼͘͠ߦ͏ͨΊʹ͸ɺաڈͷঢ়ଶΛऔΓଓ͚ɺൺֱͰ͖Δ؀ڥ͕ඞཁͱͳΓ·͢ɻ

Slide 42

Slide 42 text

PostgreSQLͷ౷ܭ৘ใ (ϓϩηεͷՔಇঢ়ଶ֬ೝ) ϓϩηεͷՔಇঢ়ଶ͸ɺpg_stat_activityϏϡʔͰ֬ೝ͢Δ͜ͱ͕Ͱ͖·͢ɻ ओʹݟΔ΂͖ΧϥϜ͸ҎԼͷ௨ΓͰ͢ɻ ※pg_stat_activityϏϡʔ΁໰͍߹Θͤͨ͠ϢʔβʔݖݶʹΑΓɺσʔλ͕ܽམ͢Δ৔߹͕͋Γ·͢ɻ ΧϥϜ໊ ղઆ pid όοΫΤϯυϓϩηεͷϓϩηεIDͰ͢ɻ datname όοΫΤϯυϓϩηε͕઀ଓͨ͠σʔλϕʔε໊Ͱ͢ɻ usename όοΫΤϯυϓϩηε͕࢖༻͍ͯ͠ΔϢʔβʔ໊Ͱ͢ɻ client_addr όοΫΤϯυϓϩηεʹ઀ଓ͍ͯ͠ΔΫϥΠΞϯτͷIPΞυϨεͰ͢ɻ NULLͷ৔߹ɺUNIXιέοτܦ༝ͷ઀ଓ͔಺෦ॲཧͷͲͪΒ͔ͱͳΓ·͢ɻ state όοΫΤϯυϓϩηεͷݱࡏͷঢ়ଶͰ͢ɻ activeͷ৔߹͸࣮ߦதͱͳΓ·͢ɻ query_start ໰͍߹Θͤͷ࣮ߦΛ։࢝ͨ࣌ؒ͠Ͱ͢ɻ query ௚ۙͷΫΤϦͷҰ෦͕֨ೲ͞Ε·͢ɻ ໰͍߹ΘͤΛఀࢭ͍ͨ͠৔߹͸ɺpg_stat_activityϏϡʔͱ֬ೝ͠ɺ֘౰໰͍߹ΘͤΛ࣮ߦ͍ͯ͠ΔϓϩηεIDΛ֬ೝ͠·͢ɻ σʔλϕʔεʹ઀ଓ͠ɺԼهͷ1ͭ໨ͷΫΤϦΛ࣮ߦ͠·͢ɻ ͦΕͰ΋ࢭ·Βͳ͍৔߹͸ɺԼهͷ2ͭ໨ͷΫΤϦΛ࣮ߦ͠·͢ɻ 2ͭ໨ͷΫΤϦ͸ϓϩηεͷڧ੍ఀࢭͱͳΔͨΊɺσʔλͷอূ͸Ͱ͖·ͤΜʂ postgres => SELECT pg_cancel_backend(ϓϩηεID); postgres => SELECT pg_terminate_backend(ϓϩηεID);

Slide 43

Slide 43 text

PostgreSQLͷ౷ܭ৘ใ (σʔλϕʔεΫϥελঢ়ଶ) σʔλϕʔεΫϥελঢ়ଶ͸ɺpg_stat_bgwriterϏϡʔͰ֬ೝ͢Δ͜ͱ͕Ͱ͖·͢ɻ ओʹݟΔ΂͖ΧϥϜ͸ҎԼͷ௨ΓͰ͢ɻ ΧϥϜ໊ ղઆ checkpoints_timed εέδϡʔϧ͞ΕͨνΣοΫϙΠϯτ਺Ͱ͢ɻ checkpoints_req ཁٻ͞ΕͨνΣοΫϙΠϯτ਺Ͱ͢ɻ buffers_backend όοΫΤϯυʹΑΓ௚઀ॻ͖ग़͞ΕͨόοϑΝ਺Ͱ͢ɻ buffers_alloc ׂ౰ΒΕͨόοϑΝ਺Ͱ͢ɻ pg_stat_bgwriterϏϡʔΛ֬ೝ͢Δ͜ͱͰɺσʔλϕʔεͷϘτϧωοΫΛݕ஌͢Δ͜ͱ͕Ͱ͖·͢ɻ • ʲcheckpoint_reqͷ஋͕େ͖͍৔߹ʳ
 WALαΠζ͕খ͍͞ҝɺνΣοΫϙΠϯτ͕සൃ͍ͯ͠·͢ɻWALαΠζ(max_wal_size)ͷมߋ͕ඞཁͰ͢ɻ • ʲbuffers_backend͕buffers_allocΑΓେ͖͍ʳ
 shared_buffers͕ෆ଍͍ͯ͠·͢ɻ

Slide 44

Slide 44 text

PostgreSQLͷ౷ܭ৘ใ (σʔλϕʔεঢ়ଶ) σʔλϕʔεঢ়ଶ͸ɺpg_stat_databaseϏϡʔͰ֬ೝ͢Δ͜ͱ͕Ͱ͖·͢ɻ ओʹݟΔ΂͖ΧϥϜ͸ҎԼͷ௨ΓͰ͢ɻ ΧϥϜ໊ ղઆ datname όοΫΤϯυϓϩηε͕઀ଓͨ͠σʔλϕʔε໊Ͱ͢ɻ xact_commit ίϛοτ͞ΕͨྦྷܭͷτϥϯβΫγϣϯ਺Ͱ͢ɻ xact_rollback ϩʔϧόοΫ͞ΕͨྦྷܭͷτϥϯβΫγϣϯ਺Ͱ͢ɻ temp_files ໰͍߹ΘͤʹΑͬͯॻ͖ग़͞ΕͨྦྷܭͷҰ࣌ϑΝΠϧ਺Ͱ͢ɻ temp_bytes ໰͍߹ΘͤʹΑͬͯॻ͖ग़͞ΕͨྦྷܭͷҰ࣌ϑΝΠϧαΠζͰ͢ɻ deadlocks ݕ஌͞ΕͨྦྷܭͷσουϩοΫ਺Ͱ͢ɻ pg_stat_databaseϏϡʔ͸ɺϦηοτ͕͔͔Δ·Ͱྦྷܭ஋Λฦ͠·͢ɻ ্هΧϥϜΛ֬ೝ͢Δ͜ͱͰɺҎԼͷ৘ใ͕Θ͔Γ·͢ɻ • σʔλϕʔεͷ࢖༻ঢ়گ • ੑೳτϥϒϧͷ༗ແ
 (Ұ࣌ϑΝΠϧͷେྔੜ੒ɾେن໛ͳҰ࣌ϑΝΠϧͷੜ੒) • σʔλϕʔεΛ࢖༻͍ͯ͠ΔγεςϜͷෆ۩߹ ͪͳΈʹɺҎԼͷΫΤϦͰσʔλϕʔεͷαΠζΛऔಘ͢Δ͜ͱ͕ՄೳͰ͢ɻ =# SELECT pg_size_pretty(pg_database_size(‘σʔλϕʔε໊'));

Slide 45

Slide 45 text

PostgreSQLͷ౷ܭ৘ใ (σʔλϕʔεঢ়ଶ) Ωϟογϡώοτ཰ΛٻΊΔ৔߹ɺҎԼͷΫΤϦͰऔಘ͢Δ͜ͱ͕ՄೳͰ͢ɻ =# SELECT datname , round(heap_blks_hit * 100 / (heap_blks_hit + heap_blks_read), 2) as cache_hit_ratio FROM pg_stat_database WHERE blks_read > 0; datname | cache_hit_ratio ——————————+————————————————— postgres | 99.00

Slide 46

Slide 46 text

PostgreSQLͷ౷ܭ৘ใ (Ϣʔβʔςʔϒϧঢ়ଶ) Ϣʔβʔςʔϒϧঢ়ଶ͸ɺpg_stat_user_tablesϏϡʔٴͼpg_statio_user_tablesϏϡʔͰ֬ೝ͢Δ͜ͱ͕Ͱ͖·͢ɻ ओʹݟΔ΂͖ΧϥϜ͸ҎԼͷ௨ΓͰ͢ɻ ΧϥϜ໊ ղઆ schemaname ςʔϒϧ͕ଘࡏ͢ΔεΩʔϚ໊Ͱ͢ɻ relname ςʔϒϧ໊Ͱ͢ɻ n_tup_ins ૠೖ͞Εͨߦ਺Ͱ͢ɻ n_tup_upd ߋ৽͞ΕͨHOTߋ৽ΛؚΉߦ਺Ͱ͢ɻ n_tup_del ࡟আ͞Εͨߦ਺Ͱ͢ɻ n_live_tup ༗ޮߦͷਪఆ஋Ͱ͢ɻ n_dead_tup ෆཁߦͷਪఆ஋Ͱ͢ɻ last_autovacuum ࣗಈόΩϡʔϜσʔϞϯʹΑΓςʔϒϧ͕όΩϡʔϜ͞Εͨ࠷ऴ࣌ࠁͰ͢ɻ • pg_stat_user_tablesϏϡʔ • pg_stat_user_tablesϏϡʔ ΧϥϜ໊ ղઆ schemaname ςʔϒϧ͕ଘࡏ͢ΔεΩʔϚ໊Ͱ͢ɻ relname ςʔϒϧ໊Ͱ͢ɻ heap_blks_read ςʔϒϧ͔ΒಡΈऔΒΕͨσΟεΫϒϩοΫ਺Ͱ͢ɻ heap_blks_hit ςʔϒϧ಺ͷόοϑΝώοτ਺Ͱ͢ɻ

Slide 47

Slide 47 text

PostgreSQLͷ౷ܭ৘ใ (Ϣʔβʔςʔϒϧঢ়ଶ) pg_stat_user_tablesϏϡʔΛ֬ೝ͢Δ͜ͱͰɺϨίʔυͷঢ়ଶΛ֬ೝ͢Δ͜ͱ͕Ͱ͖ɺ pg_statio_user_tablesϏϡʔΛ֬ೝ͢Δ͜ͱͰςʔϒϧͷΩϟογϡώοτ཰Λࢉग़͢Δ͜ͱ͕Ͱ͖·͢ɻ pg_stat_user_tablesϏϡʔͷn_dead_tup͕ଟ͘ͳΓ͍͗ͯ͢Δ৔߹͸ɺਖ਼͘͠όΩϡʔϜ͞Ε͍ͯͳ͍Մೳੑ͕͋Γ·͢ɻ last_autovacuumͷ࣌ࠁΛ֬ೝ͍ͯͩ͘͠͞ɻ ςʔϒϧͷΩϟογϡώοτ཰ΛٻΊΔ৔߹ɺҎԼͷΫΤϦͰऔಘ͢Δ͜ͱ͕ՄೳͰ͢ɻ =# SELECT relname , round( heap_blks_hit * 100 / (heap_blks_hit + heap_blks_read), 2) as cache_hit_ratio FROM pg_statio_user_tables WHERE blks_read > 0; relname | cache_hit_ratio ————————————+————————————————— test_table | 99.00

Slide 48

Slide 48 text

PostgreSQLͷ౷ܭ৘ใ (ϢʔβʔΠϯσοΫεঢ়ଶ) ϢʔβʔΠϯσοΫεঢ়ଶ͸ɺpg_stat_user_indexesϏϡʔٴͼpg_statio_user_indexesϏϡʔͰ֬ೝ͢Δ͜ͱ͕Ͱ͖·͢ɻ ओʹݟΔ΂͖ΧϥϜ͸ҎԼͷ௨ΓͰ͢ɻ ΧϥϜ໊ ղઆ schemaname ΠϯσοΫε͕ଘࡏ͢ΔεΩʔϚ໊Ͱ͢ɻ relname ΠϯσοΫεର৅ͷςʔϒϧ໊Ͱ͢ɻ indexrelname ΠϯσοΫε໊Ͱ͢ɻ idx_scan ΠϯσοΫεʹରͯ͠։࢝͞ΕͨΠϯσοΫεεΩϟϯͷ࣮ߦճ਺Ͱ͢ɻ • pg_stat_user_indexesϏϡʔ • pg_statio_user_indexesϏϡʔ ΧϥϜ໊ ղઆ schemaname ςʔϒϧ͕ଘࡏ͢ΔεΩʔϚ໊Ͱ͢ɻ relname ςʔϒϧ໊Ͱ͢ɻ idx_blks_read ΠϯσοΫε͔ΒಡΈऔΒΕͨσΟεΫϒϩοΫ਺Ͱ͢ɻ idx_blks_hit ΠϯσοΫεʹ͓͚ΔόοϑΝώοτ਺Ͱ͢ɻ pg_stat_user_indexesϏϡʔΛ֬ೝ͢Δ͜ͱͰɺΠϯσοΫεͷ࢖༻ঢ়ଶΛ֬ೝ͢Δ͜ͱ͕Ͱ͖ɺ pg_statio_user_indexesϏϡʔΛ֬ೝ͢Δ͜ͱͰΠϯσοΫεͷΩϟογϡώοτ཰Λࢉग़͢Δ͜ͱ͕Ͱ͖·͢ɻ pg_stat_user_indexesϏϡʔͷidx_scan͕0ͷ৔߹ɺΠϯσοΫε͕શ͘࢖༻͞Ε͍ͯ·ͤΜɻ ࡟আର৅ͱͯ͠ݕ౼͢Δ͜ͱ͕Ͱ͖·͢ɻ

Slide 49

Slide 49 text

PostgreSQLͷ౷ܭ৘ใ (ϢʔβʔΠϯσοΫεঢ়ଶ) ΠϯσοΫεͷΩϟογϡώοτ཰ΛٻΊΔ৔߹ɺҎԼͷΫΤϦͰऔಘ͢Δ͜ͱ͕ՄೳͰ͢ɻ =# SELECT relname , indexrelname , round(idx_blks_hit * 100 / (idx_blks_hit + idx_blks_read), 2) as cache_hit_ratio FROM pg_statio_user_indexes WHERE idx_blks_read > 0; relname | indexrelname | cache_hit_ratio ————————————+————————————————-+————————————————— test_table | test_table_pkey | 98.00

Slide 50

Slide 50 text

PostgreSQLͷϩά PostgreSQLͷϩά͸ɺσʔλϕʔεͷՔಇϩά΍઀ଓϩάɺΫΤϦ৘ใͳͲ༷ʑͳ৘ใΛ࢒͠·͢ɻ PostgreSQLΛ҆ఆՔಇͤ͞ΔͨΊʹ͸ɺ౷ܭ৘ใΛఆظతʹ֬ೝ͢Δ͚ͩͰͳ͘ ϩά΋֬ೝ͢Δඞཁ͕͋Γ·͢ɻ PostgreSQLͷϩά͸ɺpostgresql.confϑΝΠϧͷlog_min_messagesύϥϝʔλʔͰ ग़ྗ͢ΔϩάྔΛௐ੔͠·͢ɻ σϑΥϧτͰ͸warningͱͳ͍ͬͯ·͢ɻ (warning͸τϥϯβΫγϣϯ֎ͷίϛοτॲཧͳͲɺϢʔβʔ΁ͷܯࠂ·Ͱग़ྗ͠·͢ɻ) ·ͨɺΤϥʔ͕ൃੜͨ͠ΫΤϦΛϩάʹग़ྗ੍ޚ͢Δlog_min_error_statementύϥϝʔλʔ΍ɺ ࣮ߦ͕஗͍ΫΤϦΛϩάʹग़ྗ੍ޚ͢Δlog_min_duration_statementύϥϝʔλʔͳͲ͕ଘࡏ͠·͢ɻ ৄ͘͠͸ɺެࣜυΩϡϝϯτΛࢀর͍ͯͩ͘͠͞ɻ https://www.postgresql.jp/document/current/html/runtime-config-logging.html

Slide 51

Slide 51 text

ΞδΣϯμ ࣗݾ঺հ PostgreSQLͷ಺෦ߏ଄ʹ͍ͭͯ PostgreSQLͷ౷ܭ৘ใ ϞχλϦϯάͰศརͳExtensionͨͪ ऴΘΓʹ

Slide 52

Slide 52 text

ϞχλϦϯάͰศརͳExtensionͨͪ PostgreSQL͸ɺ֦ுػೳ(Extension)Λಋೖ͢Δ͜ͱͰ جຊߏ੒Ͱ࣮ݱͰ͖ͳ͍͜ͱΛ࣮ݱͰ͖ΔΑ͏ʹͳΓ·͢ɻ ੈքதͰExtension͕։ൃ͞Εɺศརͳ΋ͷ͔Βχονͳ΋ͷ·Ͱ༷ʑଘࡏ͠·͢ɻ ͦͷதͰ΋ɺݸਓతʹϞχλϦϯάͰศརͩͱײ͍ͯ͡ΔExtensionΛ঺հ͠·͢ɻ (Ұ෦ϞχλϦϯάͱؔ܎ͳ͍΋ͷɾExtionsionͰͳ͍΋ͷ͕ଘࡏ͠·͢ɻ) Extension/πʔϧ໊ छྨ ղઆ pg_stat_statements Extension ΫΤϦͱ౷ܭܭըΛه࿥ɾ؅ཧ͠·͢ɻ pg_store_plans Extension ΫΤϦͱ࣮ߦܭըͱ౷ܭ৘ใΛه࿥ɾ؅ཧ͠·͢ɻ pg_dbms_stats Extension ౷ܭ৘ใΛه࿥ɾ؅ཧ͠·͢ɻ pg_hint_plan Extension ౷ܭ৘ใΛώϯτ۟Ͱ੍ޚͰ͖ΔΑ͏ʹ͠·͢ɻ pg_statsinfo Extension ౷ܭ৘ใͷه࿥ɾ؅ཧͱ௨஌Λ؅ཧ͠·͢ɻ ্هExtensionͱ૊Έ߹Θͤͯ࢖༻Ͱ͖·͢ɻ pg_repack Extensionɾπʔϧ ߋ৽ॲཧ౳ͰංେԽͨ͠ςʔϒϧ΍ΠϯσοΫεΛɺ࠶ੜ੒ʹΑΓ͖Ε͍ʹ͠·͢ɻ pg_flame πʔϧ ໰߹ͤܭը(EXPLAIN ANALYZE)ΛϏδϡΞϧԽ͢ΔπʔϧͰ͢ɻ pg_stats_reporter πʔϧ pg_statsinfoͷ৘ใΛάϥϑΟΧϧʹදࣔ͢ΔπʔϧͰ͢ɻ mackerel-plugin-postgres ϓϥάΠϯ αʔόʔ؂ࢹαʔϏεMackerelͰPostgreSQLΛ؂ࢹ͢ΔͨΊͷϓϥάΠϯͰ͢ɻ

Slide 53

Slide 53 text

ϞχλϦϯάͰศརͳExtensionͨͪ (pg_stat_statements) pg_stat_statementsͱ͸ pg_stat_statements͸શͯͷશͯͷΫΤϦͱ࣮ߦ࣌ͷ౷ܭ৘ใΛه࿥͠·͢ɻ PostgreSQLެࣜͷExtension܈Ͱ͋Δcontribʹଘࡏ͠·͢ɻ pg_stat_statementsͷΠϯετʔϧɾ༗ޮԽ contribύοέʔδΛΠϯετʔϧͨ͠ޙɺExtensionͷ༗ޮԽΛߦ͏ͱ࢖༻͢Δ͜ͱ͕Ͱ͖·͢ɻ ༗ޮԽ͸ҎԼͷखॱΛ࣮ߦ͢Δඞཁ͕͋Γ·͢ɻ 1. postgresql.confϑΝΠϧͷshared_preload_librariesύϥϝʔλʔʹ
 ’pg_stat_statements’
 Λ௥Ճ͠·͢ɻ 2. PostgreSQLΛ࠶ىಈ͠·͢ɻ 3. ༗ޮԽ͍ͨ͠σʔλϕʔεͰ
 CREATE EXTENSION pg_stat_statements;
 Λ࣮ߦ͠·͢ɻ

Slide 54

Slide 54 text

ϞχλϦϯάͰศརͳExtensionͨͪ (pg_stat_statements) pg_stat_statementsͷ࢖͍ํ pg_stat_statementsϏϡʔΛࢀর͢Δ͜ͱͰɺ1ΫΤϦ୯ҐͰ࣮ߦճ਺ɾΫΤϦͷ࣮ߦ࣌ؒɾ ໰߹ͤͨ͠ϒϩοΫ਺ͳͲΛௐ΂Δ͜ͱ͕ՄೳͰ͢ɻ ݟΔ΂͖߲໨͸࣍ϖʔδʹهࡌ͠·͢ɻ pg_stat_statementsͷ஫ҙ఺ pg_stat_statements͸ɺσʔλϕʔεͱ࢖༻ऀ(ΞϓϦέʔγϣϯ)ͷؒʹೖ͍ͬͯΔঢ়ଶͷͨΊ ύϑΥʔϚϯεʹӨڹ͠·͢ɻ ։ൃ؀ڥͰ͸༗ޮԽ͓͖ͯ͠ɺຊ൪؀ڥͰ͸ແޮԽ͓ͯ͘͠ͱ͍ͬͨӡ༻Λ͓קΊ͠·͢ɻ ৄ͘͠͸ɺެࣜυΩϡϝϯτΛࢀর͍ͯͩ͘͠͞ɻ https://www.postgresql.jp/document/current/html/pgstatstatements.html

Slide 55

Slide 55 text

ϞχλϦϯάͰศརͳExtensionͨͪ (pg_stat_statements) pg_stat_statementsϏϡʔͰओʹݟΔ΂͖ΧϥϜ͸ҎԼͷ௨ΓͰ͢ɻ ΧϥϜ໊ ղઆ query ࣮ߦ͞ΕͨΫΤϦͰ͢ɻ calls ࣮ߦճ਺Ͱ͢ɻ total_time ΫΤϦ࣮ߦʹඅ΍ͨ͠૯࣌ؒͰ͢ɻ mean_time ΫΤϦ࣮ߦʹඅ΍ͨ͠ฏۉ࣌ؒͰ͢ɻ rows ΫΤϦ࣮ߦʹΑͬͯऔಘ͞ΕͨɾӨڹΛड͚ͨߦͷ૯਺Ͱ͢ɻ shared_blks_hit ΫΤϦ࣮ߦʹΑͬͯώοτͨ͠ڞ༗ϒϩοΫΩϟογϡͷ૯਺Ͱ͢ɻ shared_blks_read ΫΤϦ࣮ߦʹΑͬͯಡΈࠐ·Εͨڞ༗ϒϩοΫͷ૯਺Ͱ͢ɻ

Slide 56

Slide 56 text

ϞχλϦϯάͰศརͳExtensionͨͪ (pg_stat_statements) ҎԼͷΫΤϦͰ10݅ͷεϩʔΫΤϦΛऔಘ͢Δ͜ͱ͕ՄೳͰ͢ɻ =# SELECT query , calls , total_time , mean_time , rows , round(100 * shared_blks_hit / (shared_blks_hit + shared_blks_read), 2) AS hit_ratio FROM pg_stat_statements WHERE shared_blks_hit > 0 ORDER BY total_time DESC LIMIT 10;

Slide 57

Slide 57 text

ϞχλϦϯάͰศརͳExtensionͨͪ (pg_stat_statements)

Slide 58

Slide 58 text

ϞχλϦϯάͰศརͳExtensionͨͪ (pg_store_plans) pg_store_plansͱ͸ pg_store_plans͸࣮ߦܭը͝ͱʹ࣮ߦ౷ܭΛऔಘ͢Δ֦ுػೳͰ͢ɻ NTT͕։ൃͨ͠ϞδϡʔϧͰɺαʔυύʔςΟͷ֦ுػೳͱͳΓ·͢ɻ pg_store_plansͷΠϯετʔϧɾ༗ޮԽ ެࣜαΠτͰrpm·ͨ͸ιʔείʔυ͕ެ։͞Ε͍ͯ·͢ɻ ؀ڥʹ͋ͬͨΠϯετʔϧΛͨ͠ޙɺExtensionͷ༗ޮԽΛߦ͏͜ͱͰ࢖༻͢Δ͜ͱ͕Ͱ͖·͢ɻ ༗ޮԽ͸ҎԼͷखॱΛ࣮ߦ͢Δඞཁ͕͋Γ·͢ɻ 1. postgresql.confϑΝΠϧͷshared_preload_librariesύϥϝʔλʔʹ
 ’pg_store_plans’
 Λ௥Ճ͠·͢ɻ 2. ޙPostgreSQLΛ࠶ىಈ͠·͢ɻ 3. ༗ޮԽ͍ͨ͠σʔλϕʔεͰ
 CREATE EXTENSION pg_store_plans;
 Λ࣮ߦ͠·͢ɻ

Slide 59

Slide 59 text

ϞχλϦϯάͰศརͳExtensionͨͪ (pg_store_plans) pg_store_plansͷ࢖͍ํ pg_store_plansϏϡʔΛࢀর͢Δ͜ͱͰɺ1ΫΤϦ୯ҐͰ࣮ߦճ਺ɾΫΤϦͷ࣮ߦ࣌ؒɾ ໰߹ͤͨ͠ϒϩοΫ਺ɾ࣮ߦܭըͷςΩετɾߏจ໦৘ใͳͲΛௐ΂Δ͜ͱ͕ՄೳͰ͢ɻ pg_store_plans͸୯ମͰ࢖༻͢Δ͜ͱ͸গͳ͘ɺجຊతʹଞͷ֦ுػೳͷิॿ༻Ͱ༻͍ΒΕ·͢ɻ pg_store_plansͷ஫ҙ఺ pg_store_plans͸ɺσʔλϕʔεͱ࢖༻ऀ(ΞϓϦέʔγϣϯ)ͷؒʹೖ͍ͬͯΔঢ়ଶͷͨΊ ύϑΥʔϚϯεʹӨڹ͠·͢ɻ ։ൃ؀ڥͰ͸༗ޮԽ͓͖ͯ͠ɺຊ൪؀ڥͰ͸ແޮԽ͓ͯ͘͠ͱ͍ͬͨӡ༻Λ͓קΊ͠·͢ɻ ৄࡉ͸ެࣜαΠτΛࢀর͍ͯͩ͘͠͞ɻ https://ja.osdn.net/projects/pgstoreplans/

Slide 60

Slide 60 text

ϞχλϦϯάͰศརͳExtensionͨͪ (pg_dbms_stats) pg_dbms_statsͱ͸ pg_dbms_stats͸ANALYZE͕ऩू͢Δ౷ܭ৘ใΛ؅ཧ͢Δ֦ுػೳͰ͢ɻ ౷ܭ৘ใͷ࠷৽Խ΍ݻఆԽΛߦ͏͜ͱ͕Ͱ͖ΔͨΊɺ࣮ߦϓϥϯͷ੍ޚ͕ՄೳͱͳΓ·͢ɻ NTT͕։ൃͨ͠ϞδϡʔϧͰɺαʔυύʔςΟͷ֦ுػೳͱͳΓ·͢ɻ pg_dbms_statsͷΠϯετʔϧɾ༗ޮԽ ެࣜαΠτͰrpm·ͨ͸ιʔείʔυ͕ެ։͞Ε͍ͯ·͢ɻ ؀ڥʹ͋ͬͨΠϯετʔϧΛͨ͠ޙɺExtensionͷ༗ޮԽΛߦ͏͜ͱͰ࢖༻͢Δ͜ͱ͕Ͱ͖·͢ɻ ༗ޮԽ͸ҎԼͷखॱΛ࣮ߦ͢Δඞཁ͕͋Γ·͢ɻ 1. postgresql.confϑΝΠϧͷshared_preload_librariesύϥϝʔλʔʹ
 ’pg_dbms_stats’
 Λ௥Ճ͠·͢ɻ 2. ޙPostgreSQLΛ࠶ىಈ͠·͢ɻ 3. ༗ޮԽ͍ͨ͠σʔλϕʔεͰ
 CREATE EXTENSION pg_dbms_stats;
 Λ࣮ߦ͠·͢ɻ

Slide 61

Slide 61 text

ϞχλϦϯάͰศརͳExtensionͨͪ (pg_dbms_stats) pg_dbms_statsͷ࢖͍ํ ֦ுػೳͰఏڙ͞ΕΔؔ਺Λ࣮ߦ͢Δ͜ͱͰɺ ౷ܭ৘ใͷόοΫΞοϓɾϦετΞɾݻఆԽΛ࣮ߦ͢Δ͜ͱ͕Ͱ͖·͢ɻ ࣍ϖʔδʹ࣮ߦίϚϯυΛهࡌ͠·͢ɻ pg_dbms_statsͷ஫ҙ఺ ςʔϒϧαΠζ΍ภΓͳͲͰσʔλͷಛੑ͕มΘͬͯ΋౷ܭ৘ใ͸ݻఆ͞Εͨ··ͱͳΓ·͢ɻ มߋ͕ൃੜͨ͠৔߹͸౷ܭ৘ใͷ࠶ݻఆԽΛݕ౼͍ͯͩ͘͠͞ɻ ৄࡉ͸ެࣜαΠτΛࢀর͍ͯͩ͘͠͞ɻ https://ja.osdn.net/projects/pgdbmsstats/

Slide 62

Slide 62 text

ϞχλϦϯάͰศརͳExtensionͨͪ (pg_dbms_stats) =# SELECT dbms_stats.backup_database_stats('ίϝϯτ'); • όοΫΞοϓ =# SELECT dbms_stats.restore_stats(όοΫΞοϓID஋); • ϦετΞ =# SELECT * FROM dbms_stats.backup_history; id | time | unit | comment ————+——————————————————————————————-+—————-+—————————— 1 | 2019-11-15 00:00:00.000000+09 | d | ίϝϯτ • όοΫΞοϓҰཡͷ֬ೝ =# SELECT dbms_stats.lock_column_stats('εΩʔϚ໊', 'ςʔϒϧ໊', 'ΧϥϜ໊'); • ౷ܭ৘ใͷݻఆԽ =# SELECT dbms_stats.unlock_table_stats('εΩʔϚ໊', 'ςʔϒϧ໊'); • ౷ܭ৘ใͷݻఆղআ

Slide 63

Slide 63 text

ϞχλϦϯάͰศརͳExtensionͨͪ (pg_hint_plan) pg_hint_planͱ͸ pg_hint_plan͸ΫΤϦͷ࣮ߦܭըΛࣗ༝ʹૢ࡞͢Δ؀ڥΛఏڙ͢Δ֦ுػೳͰ͢ɻ ΫΤϦதͷίϝϯτʹॴఆͷϑΥʔϚοτͰهࡌΛߦ͍·͢ɻ
 (Oracle౳ͷଞσʔλϕʔεͰ࢖༻Ͱ͖Δώϯτ۟ͱಉ౳ͷػೳͰ͢ɻ) NTT͕։ൃͨ͠ϞδϡʔϧͰɺαʔυύʔςΟͷ֦ுػೳͱͳΓ·͢ɻ pg_hint_planͷΠϯετʔϧɾ༗ޮԽ ެࣜαΠτͰrpm·ͨ͸ιʔείʔυ͕ެ։͞Ε͍ͯ·͢ɻ ؀ڥʹ͋ͬͨΠϯετʔϧΛͨ͠ޙɺExtensionͷ༗ޮԽΛߦ͏͜ͱͰ࢖༻͢Δ͜ͱ͕Ͱ͖·͢ɻ ༗ޮԽ͸ҎԼͷखॱΛ࣮ߦ͢Δඞཁ͕͋Γ·͢ɻ 1. postgresql.confϑΝΠϧͷshared_preload_librariesύϥϝʔλʔʹ
 ’pg_hint_plan’
 Λ௥Ճ͠·͢ɻ 2. ޙPostgreSQLΛ࠶ىಈ͠·͢ɻ 3. ༗ޮԽ͍ͨ͠σʔλϕʔεͰ
 CREATE EXTENSION pg_hint_plan;
 Λ࣮ߦ͠·͢ɻ

Slide 64

Slide 64 text

ϞχλϦϯάͰศརͳExtensionͨͪ (pg_hint_plan) pg_hint_planͷ࢖͍ํ ώϯτ۟ΛదԠ͍ͨ͠ΫΤϦͷઌ಄·ͨ͸్தͷSQLϒϩοΫίϝϯτͷதʹهड़͠·͢ɻ ώϯτ۟༻ͷϒϩοΫίϝϯτ͸ɺ/*+ͱͳΓ·͢ɻ ࣍ϖʔδʹώϯτ۟ΛదԠͨ͠ྫΛهࡌ͠·͢ɻ pg_hint_planͷ஫ҙ఺ pg_hint_plan͸ɺΦϓςΟϚΠβʔ͕౷ܭ৘ใ౳͔Βܾఆ࣮ͨ͠ߦܭըΛมߋ͢ΔͨΊɺσʔλͷಛੑ͕ มΘͬͨࡍʹద੾ͳ࣮ߦܭըͰ࣮ߦ͞Εͳ͍ڪΕ͕͋Γ·͢ɻ ώϯτ۟Λ࢖༻͢Δ৔߹͸ɺमਖ਼ํ๏౳ͷݕ౼Λߦ͔ͬͯΒ࢖༻͢ΔΑ͏ʹ͠·͠ΐ͏ɻ ৄࡉ͸ެࣜαΠτΛࢀর͍ͯͩ͘͠͞ɻ https://ja.osdn.net/projects/pghintplan/

Slide 65

Slide 65 text

ϞχλϦϯάͰศརͳExtensionͨͪ (pg_hint_plan) =# EXPLAIN (VERBOSE, COSTS) /*+ SeqScan(a) HashJoin(a b) Set(random_page_cost 2.0) */ SELECT * FROM pgbench_accounts a JOIN pgbench_branches b ON a.bid = b.bid ORDER BY a.aid LIMIT 10; pgbench_accountsςʔϒϧΛɺ ΠϯσοΫεΛ࢖༻ͤͣʹ໰͍߹Θͤ͢Δɻ

Slide 66

Slide 66 text

ϞχλϦϯάͰศརͳExtensionͨͪ (pg_hint_plan) =# EXPLAIN (VERBOSE, COSTS) /*+ SeqScan(a) HashJoin(a b) Set(random_page_cost 2.0) */ SELECT * FROM pgbench_accounts a JOIN pgbench_branches b ON a.bid = b.bid ORDER BY a.aid LIMIT 10; pgbench_accountsςʔϒϧͱ pgbench_branchesςʔϒϧͷ݁߹Λϋογϡ݁ ߹ͱ͢Δɻ

Slide 67

Slide 67 text

ϞχλϦϯάͰศརͳExtensionͨͪ (pg_hint_plan) =# EXPLAIN (VERBOSE, COSTS) /*+ SeqScan(a) HashJoin(a b) Set(random_page_cost 2.0) */ SELECT * FROM pgbench_accounts a JOIN pgbench_branches b ON a.bid = b.bid ORDER BY a.aid LIMIT 10; random_page_costΛ4.0͔Β2.0ʹ΁Μ͜͏͢Δ ͜ͱͰɺΠϯσοΫεΛ༻͍΍͘͢͢Δɻ

Slide 68

Slide 68 text

ϞχλϦϯάͰศརͳExtensionͨͪ (pg_statsinfo) pg_statsinfoͱ͸ pg_statsinfo͸αʔόʔͷ౷ܭ৘ใΛఆظతʹऩूɾ஝ੵɾ؅ཧΛ࣮ࢪ͢Δ֦ுػೳͰ͢ɻ ·ͨɺᮢ஋Λ௒͑ͨ৔߹ΞϥʔτΛग़ྗ͢Δػೳ͕͋Γ·͢ɻ NTT͕։ൃͨ͠ϞδϡʔϧͰɺαʔυύʔςΟͷ֦ுػೳͱͳΓ·͢ɻ pg_statsinfoͷΠϯετʔϧɾ༗ޮԽ ެࣜαΠτͰrpm·ͨ͸ιʔείʔυ͕ެ։͞Ε͍ͯ·͢ɻ ؀ڥʹ͋ͬͨΠϯετʔϧΛͨ͠ޙɺExtensionͷ༗ޮԽΛߦ͏͜ͱͰ࢖༻͢Δ͜ͱ͕Ͱ͖·͢ɻ ༗ޮԽ͸ҎԼͷखॱΛ࣮ߦ͢Δඞཁ͕͋Γ·͢ɻ 1. postgresql.confϑΝΠϧͷshared_preload_librariesύϥϝʔλʔʹ
 ’pg_statsinfo’
 Λ௥Ճ͠·͢ɻ 2. ޙPostgreSQLΛ࠶ىಈ͠·͢ɻ 3. postgresσʔλϕʔεͰ
 CREATE EXTENSION pg_statsinfo;
 Λ࣮ߦ͠·͢ɻ

Slide 69

Slide 69 text

ϞχλϦϯάͰศརͳExtensionͨͪ (pg_statsinfo) pg_statsinfoͷ࢖͍ํ pg_stasinfo͸PostgreSQLΛىಈ͢Δͱಉ࣌ʹಈ࡞͠·͢ɻ
 postgresql.confϑΝΠϧʹpg_stasinfoͷઃఆΛ௥Ճ͢Δ͜ͱͰ౷ܭ৘ใऩू౳ͷઃఆΛߦ͏͜ͱ͕Ͱ͖ ·͢ɻ ·ͨɺલड़Ͱ঺հ֦ͨ͠ுػೳ(pg_stat_statementsɺpg_store_plans)Λಋೖ͢Δ͜ͱͰɺ ΫΤϦͷ౷ܭ৘ใΛ௥ՃͰऔಘ͢Δ͜ͱ͕ՄೳͰ͢ɻ pg_statsinfoͷ஫ҙ఺ • ϩάϑΝΠϧ͸pg_statsinfoͰղੳͰ͖ΔܗࣜͰ͋ΔɺCSVϑΝΠϧͰڧ੍తʹग़ྗ͞Ε·͢ɻ • ϩάϑΝΠϧͷϩάϩʔςʔτ͕ଘࡏ͠ͳ͍ͨΊɺผ్ઃఆ͢Δඞཁ͕͋Γ·͢ɻ • PostgreSQLͷγϟοτμ΢ϯ͸ऩूͰ͖·ͤΜɻ ৄࡉ͸ެࣜͷղઆαΠτΛࢀর͍ͯͩ͘͠͞ɻ http://pgstatsinfo.sourceforge.net/documents/statsinfo10/pg_statsinfo-ja.html

Slide 70

Slide 70 text

ϞχλϦϯάͰศརͳExtensionͨͪ (pg_repack) pg_repackͱ͸ pg_repack͸ංେԽͨ͠ςʔϒϧ΍ΠϯσοΫεΛ࠶ฤ੒͢Δ֦ுػೳͰ͢ɻ ࣮ߦύϥϝʔλʔʹΑΓɺσʔλͷฒͼସ͑Λมߋ͢Δ͜ͱ΋ՄೳͰ͢ɻ NTT͕։ൃͨ͠ϞδϡʔϧͰɺαʔυύʔςΟͷ֦ுػೳͱͳΓ·͢ɻ pg_repackͷΠϯετʔϧɾ༗ޮԽ PGDGϨϙδτϦͰrpm͕ఏڙ͞Ε͍ͯ·͢ɻ ؀ڥʹ͋ͬͨΠϯετʔϧΛͨ͠ޙɺExtensionͷ༗ޮԽΛߦ͏͜ͱͰ࢖༻͢Δ͜ͱ͕Ͱ͖·͢ɻ ༗ޮԽ͸ҎԼͷखॱΛ࣮ߦ͢Δඞཁ͕͋Γ·͢ɻ 1. ༗ޮԽ͍ͨ͠σʔλϕʔεͰ
 CREATE EXTENSION pg_repack;
 Λ࣮ߦ͠·͢ɻ

Slide 71

Slide 71 text

ϞχλϦϯάͰศརͳExtensionͨͪ (pg_repack) pg_repackͷ࢖͍ํ pg_repackίϚϯυΛ࣮ߦ͢Δ͜ͱͰ࠶ੜ੒Λߦ͏͜ͱ͕Ͱ͖·͢ɻ ΦϓγϣϯΛࢦఆ͢Δ͜ͱͰɺࡉ͔͍ઃఆ͕ՄೳͱͳΓ·͢ɻ σʔλϕʔεͷશςʔϒϧΛฒͼସ͑ͳ͠Ͱ࠶ฤ੒Λߦ͏৔߹͸ҎԼͷίϚϯυͱͳΓ·͢ɻ pg_repackͷ஫ҙ఺ • pg_repackίϚϯυ͸ɺDBͷεʔύʔϢʔβʔ(postgresϢʔβʔ)ͰͷΈ࣮ߦ͕ՄೳͰ͢ɻ • ର৅ςʔϒϧ͸ओΩʔ·ͨ͸ϢχʔΫΠϯσοΫε͕ଘࡏ͍ͯ͠Δඞཁ͕͋Γ·͢ɻ • pg_repackίϚϯυ࣮ߦத͸DDLͷ࣮ߦ͸Ͱ͖·ͤΜɻ ৄ͘͠͸ɺެࣜͷղઆαΠτΛ͝ཡ͍ͩ͘͞ɻ https://github.com/reorg/pg_repack/blob/master/doc/pg_repack_jp.rst Φϓγϣϯ ղઆ -n VACUUM FULL૬౰ͷॲཧΛ࣮ߦ͢Δɻ -a શςʔϒϧΛ࠶ฤ੒͢Δɻ -d σʔλϕʔε໊ ࢦఆͨ͠σʔλϕʔεͷΈ࠶ฤ੒͢Δɻ -c εΩʔϚ໊ ࢦఆͨ͠εΩʔϚͷΈ࠶ฤ੒͢Δɻ -t ςʔϒϧ໊ ࢦఆͨ͠ςʔϒϧͷΈ࠶ฤ੒͢Δɻ -o ΧϥϜ໊ ࢦఆͨ͠ΧϥϜ໊Ͱฒͼସ͑Λߦ͏ɻ $ pg_repack -n -d σʔλϕʔε໊

Slide 72

Slide 72 text

ϞχλϦϯάͰศརͳExtensionͨͪ (pg_flame) pg_flameͱ͸ pg_flame͸ΫΤϦͷ໰͍߹ΘͤܭըΛϏδϡΞϧԽ͢ΔπʔϧͰ͢ɻ PostgreSQLͷ໰͍߹Θͤܭը͸ɺཧղ͢ΔͨΊʹ஌͕ࣝඞཁͱͳΓ·͕͢ɺ ͜ͷπʔϧΛ༻͍Δ͜ͱͰ෼͔Γ΍͘͢ͳΓ·͢ɻ ݸਓ(mgartner༷)͕։ൃͨ͠πʔϧͱͳΓ·͢ɻ pg_flameͷΠϯετʔϧ GitHubʹιʔείʔυ͕ެ։͞Ε͍ͯ·͢ɻ ҎԼͷखॱͰΠϯετʔϧ͢Δ͜ͱ͕ՄೳͰ͢ɻ # yum install -y git docker # systemctl start docker # git clone https://github.com/mgartner/pg_flame.git # cd pg_flame/ # docker build --tag 'pg_flame' .

Slide 73

Slide 73 text

ϞχλϦϯάͰศརͳExtensionͨͪ (pg_flame) pg_flameͷ࢖͍ํ 1. ղੳ͍ͨ͠໰͍߹ΘͤܭըΛɺJSONܗࣜͰग़ྗ͠·͢ɻ
 ΫΤϦͷઌ಄ʹɺEXPLAIN (ANALYZE, BUFFERS, FORMAT JSON)Λ෇༩͠·͢ɻ
 
 2. JSONϑΝΠϧΛpg_flameʹղੳͤ͞·͢ɻ
 
 3. ग़ྗͨ͠HTMLϑΝΠϧΛ։͖·͢ɻ ৄࡉ͸࡞ऀͷGitHubΛࢀর͍ͯͩ͘͠͞ɻ https://github.com/mgartner/pg_flame # psql <σʔλϕʔε઀ଓ৘ใ> -qAtf query.sql > plan.json # cat plan.json | docker run -i pg_flame > flamegraph.html

Slide 74

Slide 74 text

ϞχλϦϯάͰศརͳExtensionͨͪ (pg_stats_reporter) pg_stats_reporterͱ͸ pg_stats_reporter͸pg_statsinfoͰऩूɾ஝ੵͨ͠σʔλΛάϥϑΟΧϧʹදࣔ͢ΔWebΞϓϦέʔγϣϯͰ͢ɻ NTT͕։ൃͨ͠ΞϓϦέʔγϣϯͰ͢ɻ pg_stats_reporterͷΠϯετʔϧ ެࣜαΠτͰrpm·ͨ͸ιʔείʔυ͕ެ։͞Ε͍ͯ·͢ɻ httpdٴͼphpͷΠϯετʔϧޙʹpg_stats_reporterͷΠϯετʔϧΛ࣮ࢪ͍ͯͩ͘͠͞ɻ pg_stats_reporterΠϯετʔϧޙ͸ɺઃఆΛߦ͍httpdͷىಈΛ࣮ߦ͍ͯͩ͘͠͞ɻ pg_stats_reporterͷઃఆɾදࣔ ઃఆϑΝΠϧ͸/etc/pg_stats_reporter.iniͱͳΓ·͢ɻ database connectionʹpg_statsinfoΛಋೖͨ͠σʔλϕʔεͷ઀ଓ৘ใΛઃఆ͠·͢ɻ ͳ͓ɺpg_stasinfoͷϨϙδτϦDBʹΞΫηε͢ΔͨΊʹ͸ɺಛݖϢʔβʔͰ͋Δඞཁ͕͋Γ·͢ɻ pg_stas_reporter༻ͷϢʔβʔΛ࡞੒͓ͯ͘͠ͱྑ͍Ͱ͠ΐ͏ɻ ը໘Λදࣔ͢Δʹ͸ɺҎԼͷURLʹΞΫηε͠·͢ɻ http://<αʔόʔϗετ໊>/pg_stats_reporter/pg_stats_reporter.php

Slide 75

Slide 75 text

ϞχλϦϯάͰศརͳExtensionͨͪ (pg_stats_reporter)

Slide 76

Slide 76 text

ϞχλϦϯάͰศརͳExtensionͨͪ (mackerel-plugin-postgres) mackerel-plugin-postgresͱ͸ αʔόʔ؂ࢹαʔϏεMackerelͰPostgreSQLΛ؂ࢹ͢ΔͨΊͷϓϥάΠϯͰ͢ɻ ΤʔδΣϯτΛ؂ࢹର৅ͷαʔόʔʹΠϯετʔϧ͢Δ͜ͱͰ؂ࢹΛ։࢝͢Δ͜ͱ͕ՄೳͰɺ αʔόʔΛ؂ࢹͯ͘͠Ε·͢ɻ ·ͨɺऔಘͨ͠৘ใΛάϥϑԽ΍ΞϥʔτΛه࿥ɾϝʔϧ΍Slack౳ʹ௨஌͢Δ͜ͱ͕ՄೳͰ͢ɻ

Slide 77

Slide 77 text

ϞχλϦϯάͰศརͳExtensionͨͪ (mackerel-plugin-postgres) mackerel-plugin-postgresͷΠϯετʔϧ MackerelͷϓϥάΠϯΛαʔόʔʹΠϯετʔϧ͠·͢ɻ ϚΠϖʔδ౳ͷࢦࣔʹै͏͜ͱͰɺ؆୯ʹΠϯετʔϧ͕ՄೳͰ͢ɻ ΤʔδΣϯτͷΠϯετʔϧޙɺҎԼͷखॱͰϓϥάΠϯΛΠϯετʔϧ͢Δ͜ͱ͕ՄೳͰ͢ɻ # yum install -y mackerel-agent-plugins # mackerel-plugin-postgres -hostname=ϗετ໊ ¥ -database=σʔλϕʔε໊ -user=Ϣʔβʔ໊ ¥ -password=ύεϫʔυ # sed -i -e 's/^# \(.*postgres.*\)/\1/g' /etc/mackerel-agent/mackerel-agent.conf # sed -i -e 's/mackerel-plugin-postgres/mackerel-plugin-postgres -hostname=ϗετ໊ -database=σʔ λϕʔε໊ -user=Ϣʔβʔ໊ -password=ύεϫʔυ/g' /etc/mackerel-agent/mackerel-agent.conf # systemctl restart mackerel-agent ಈ࡞֬ೝ༻ɻ ਖ਼͘͠஋͕औಘͰ͖͍ͯΔ͔֬ೝ͢Δɻ ಈ࡞֬ೝͨ͠஋Λೖྗ͢Δɻ

Slide 78

Slide 78 text

ϞχλϦϯάͰศརͳExtensionͨͪ (mackerel-plugin-postgres) mackerel-plugin-postgresͷ࢖͍ํ ΤʔδΣϯτʹਖ਼͘͠ϓϥάΠϯ͕ೝࣝ͞Ε͍ͯΕ͹ɺMackerelͷϚΠϖʔδͰPostgreSQLͷ ৘ใ͕දࣔ͞Ε͍ͯΔ͸ͣͰ͢ɻ

Slide 79

Slide 79 text

ΞδΣϯμ ࣗݾ঺հ PostgreSQLͷ಺෦ߏ଄ʹ͍ͭͯ PostgreSQLͷ౷ܭ৘ใ ϞχλϦϯάͰศརͳExtensionͨͪ ऴΘΓʹ

Slide 80

Slide 80 text

ऴΘΓʹ ຊηογϣϯͰ͸ϞχλϦϯάํ๏ͷ͋͘·ͰҰྫͷ঺հΛ ߦ͍·ͨ͠ɻ ࣮ࡍʹ͸Ҋ݅͝ͱʹ؀ڥ͕มΘΔͱࢥ͍·͢ͷͰɺͦͷ࣌ͦ ͷ࣌ʹ߹ΘͤͯϞχλϦϯάํ๏Λมߋ͍ͯͩ͘͠͞ɻ ·ͨɺPostgreSQLͷઃఆมߋ΍ศརͳExtensionͷಋೖΛߦ ͏͜ͱ΋ߟྀ͢ΔΑ͏ʹ͠·͠ΐ͏ɻ ͜·ΊʹPostgreSQLͷঢ়ଶΛ֬ೝ͠ɺ ҆ఆՔಇΛ໨ࢦ͍ͯͩ͘͠͞ɻ

Slide 81

Slide 81 text

͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ɻ