PostgreSQL ์ฟผ๋ฆฌ์˜ ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง. ํŒŒํŠธ 1 - ๋ณด๊ณ 

์—”์ง€๋‹ˆ์–ด - ๋ผํ‹ด์–ด์—์„œ ๋ฒˆ์—ญ๋จ - ์˜๊ฐ์„ ๋ฐ›์Œ.
์—”์ง€๋‹ˆ์–ด๋Š” ๋ฌด์—‡์ด๋“  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (c) R. ๋””์ ค.
์„œ๋ฌธ.
PostgreSQL ์ฟผ๋ฆฌ์˜ ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง. ํŒŒํŠธ 1 - ๋ณด๊ณ 
๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ์ž๊ฐ€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ณผ๊ฑฐ๋ฅผ ๊ธฐ์–ตํ•ด์•ผ ํ•˜๋Š” ์ด์œ ์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ.

๋จธ๋ฆฌ๋ง

๋ชจ๋“  ์ด๋ฆ„์ด ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฝ๊ธฐ๋Š” ๋ฌด์ž‘์œ„์ž…๋‹ˆ๋‹ค. ์ž๋ฃŒ๋Š” ์ „์ ์œผ๋กœ ์ €์ž์˜ ๊ฐœ์ธ์ ์ธ ์˜๊ฒฌ์ž…๋‹ˆ๋‹ค.

๋ณด์ฆ ๋ถ€์ธ: ๊ณ„ํš๋œ ๊ธฐ์‚ฌ ์‹œ๋ฆฌ์ฆˆ์—๋Š” ์‚ฌ์šฉ๋œ ํ…Œ์ด๋ธ”๊ณผ ์Šคํฌ๋ฆฝํŠธ์— ๋Œ€ํ•œ ์ƒ์„ธํ•˜๊ณ  ์ •ํ™•ํ•œ ์„ค๋ช…์ด ์—†์Šต๋‹ˆ๋‹ค. ์ž๋ฃŒ๋Š” "์žˆ๋Š” ๊ทธ๋Œ€๋กœ" ์ฆ‰์‹œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
์ฒซ์งธ, ์žฌ๋ฃŒ์˜ ์–‘์ด ๋งŽ๊ธฐ ๋•Œ๋ฌธ์—
๋‘˜์งธ, ์‹ค์ œ ๊ณ ๊ฐ์˜ ์ƒ์‚ฐ ๊ธฐ๋ฐ˜์„ ๊ฐ€์ง„ ๋‚ ์นด๋กœ์›€ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ํ˜•ํƒœ์˜ ์•„์ด๋””์–ด์™€ ์„ค๋ช…๋งŒ ๊ธฐ์‚ฌ์— ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.
์•„๋งˆ๋„ ๋ฏธ๋ž˜์— ์‹œ์Šคํ…œ์€ GitHub์— ๊ฒŒ์‹œํ•˜๋Š” ์ˆ˜์ค€์œผ๋กœ ์„ฑ์žฅํ•  ์ˆ˜๋„ ์žˆ๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ„์ด ๋ณด์—ฌ ์ค„ ๊ฒƒ์ด๋‹ค.

์ด์•ผ๊ธฐ์˜ ์‹œ์ž‘-๋ชจ๋“  ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์‹œ์ž‘๋˜์—ˆ๋Š”์ง€ ๊ธฐ์–ตํ•˜์‹ญ๋‹ˆ๊นŒ".
๊ทธ ๊ฒฐ๊ณผ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์šฉ์–ด๋กœ "PostgreSQL ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋กœ ํ•ฉ์„ฑยป

์ด ๋ชจ๋“  ๊ฒƒ์ด ์™œ ํ•„์š”ํ•œ๊ฐ€์š”?

๊ธ€์Ž„์š”, ๋จผ์ € ์€ํ‡ด์˜ ์˜๊ด‘์Šค๋Ÿฌ์šด ๋‚ ์„ ๊ธฐ์–ตํ•˜๋ฉด์„œ ์ž์‹ ์„ ์žŠ์ง€ ์•Š๊ธฐ ์œ„ํ•ด.
๋‘˜์งธ, ์ž‘์„ฑ๋œ ๋‚ด์šฉ์„ ์ฒด๊ณ„ํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ๋‚˜ ์ž์‹ ์„ ์œ„ํ•ด ๋•Œ๋•Œ๋กœ ๋‚˜๋Š” ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œ์ง€๊ธฐ ์‹œ์ž‘ํ•˜๊ณ  ๊ฐœ๋ณ„ ๋ถ€๋ถ„์„ ์žŠ์–ด ๋ฒ„๋ฆฝ๋‹ˆ๋‹ค.

๊ธ€์Ž„, ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ๊ฐ‘์ž๊ธฐ ๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ ์œ ์šฉ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ฐ”ํ€ด๋ฅผ ์žฌ๋ฐœ ๋ช…ํ•˜์ง€ ์•Š๊ณ  ๊ฐˆํ€ด๋ฅผ ๋ชจ์œผ์ง€ ์•Š๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์—…์žฅ์„ ๊ฐœ์„ ํ•˜์‹ญ์‹œ์˜ค (Khabrovsky ์•„๋‹˜). ์ด ์„ธ์ƒ์—์„œ ๊ฐ€์žฅ ๊ฐ€์น˜ ์žˆ๋Š” ๊ฒƒ์€ ์•„์ด๋””์–ด์ž…๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ์•„์ด๋””์–ด๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์•„์ด๋””์–ด๋ฅผ ํ˜„์‹ค๋กœ ๋ฒˆ์—ญํ•˜๋Š” ๊ฒƒ์€ ์ด๋ฏธ ์ˆœ์ „ํžˆ ๊ธฐ์ˆ ์ ์ธ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ์ฒœ์ฒœํžˆ ์‹œ์ž‘ํ•ด ๋ณผ๊นŒ์š”...

๋ฌธ์ œ์˜ ๊ณต์‹ํ™”.

์žˆ๋‹ค :

PostgreSQL(10.5), ํ˜ผํ•ฉ ๋กœ๋“œ(OLTP+DSS), ์ค‘๊ฐ„์—์„œ ๊ฐ€๋ฒผ์šด ๋กœ๋“œ, AWS ํด๋ผ์šฐ๋“œ์—์„œ ํ˜ธ์ŠคํŒ….
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ชจ๋‹ˆํ„ฐ๋ง์ด ์—†์œผ๋ฉฐ ์ธํ”„๋ผ ๋ชจ๋‹ˆํ„ฐ๋ง์€ ์ตœ์†Œ ๊ตฌ์„ฑ์—์„œ ํ‘œ์ค€ AWS ๋„๊ตฌ๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

ํ•„์ˆ˜ :

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์„ฑ๋Šฅ๊ณผ ์ƒํƒœ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ , ๋ฌด๊ฑฐ์šด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ๋ฅผ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•œ ์ดˆ๊ธฐ ์ •๋ณด๋ฅผ ์ฐพ๊ณ  ํ™•๋ณดํ•ฉ๋‹ˆ๋‹ค.

์†”๋ฃจ์…˜์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ์†Œ๊ฐœ ๋˜๋Š” ๋ถ„์„

์šฐ์„  ์—”์ง€๋‹ˆ์–ด์˜ ์ด์ ๊ณผ ๋ฌธ์ œ์ ์„ ๋น„๊ต ๋ถ„์„ํ•˜๋Š” ๊ด€์ ์—์„œ ๋ฌธ์ œ ํ•ด๊ฒฐ ์˜ต์…˜์„ ๋ถ„์„ํ•˜๊ณ  ์ง์› ๋ชฉ๋ก์— ์žˆ์–ด์•ผ ํ•  ์‚ฌ๋žŒ๋“ค์ด ๊ด€๋ฆฌ์˜ ์ด์ ๊ณผ ์†์‹ค์„ ์ฒ˜๋ฆฌํ•˜๋„๋กํ•ฉ์‹œ๋‹ค.

์˜ต์…˜ 1 - "์ฃผ๋ฌธํ˜• ์ž‘์—…"

์šฐ๋ฆฌ๋Š” ๋ชจ๋“  ๊ฒƒ์„ ๊ทธ๋Œ€๋กœ ๋‘ก๋‹ˆ๋‹ค. ๊ณ ๊ฐ์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋˜๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ์ƒํƒœ, ์„ฑ๋Šฅ์— ๋งŒ์กฑํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์ „์ž ๋ฉ”์ผ์„ ๋ณด๋‚ด๊ฑฐ๋‚˜ ํ‹ฐ์ผ“ ์ƒ์ž์— ์ธ์‹œ๋˜ํŠธ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ DBA ์—”์ง€๋‹ˆ์–ด์—๊ฒŒ ์•Œ๋ฆฝ๋‹ˆ๋‹ค.
์•Œ๋ฆผ์„ ๋ฐ›์€ ์—”์ง€๋‹ˆ์–ด๋Š” ๋ฌธ์ œ๋ฅผ ์ดํ•ดํ•˜๊ณ  ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•˜๊ฑฐ๋‚˜ ๋ฌธ์ œ๋ฅผ ๋ณด๋ฅ˜ํ•˜๊ณ  ๋ชจ๋“  ๊ฒƒ์ด ์ €์ ˆ๋กœ ํ•ด๊ฒฐ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ผ๋ฉฐ ์–ด์จŒ๋“  ๋ชจ๋“  ๊ฒƒ์ด ๊ณง ์žŠํ˜€์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ง„์ €๋ธŒ๋ ˆ๋“œ์™€ ๋„๋„›, ํƒ€๋ฐ•์ƒ๊ณผ ํ˜น์ง„์ €๋ธŒ๋ ˆ๋“œ์™€ ๋„๋„›:
1. ํŠน๋ณ„ํžˆ ํ•  ์ผ์ด ์—†๋‹ค
2. ๋‚˜๊ฐ€์„œ ๋”๋Ÿฌ์›Œ์งˆ ๊ธฐํšŒ๋Š” ํ•ญ์ƒ ์žˆ์Šต๋‹ˆ๋‹ค.
3. ํ˜ผ์ž ์“ธ ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„์ด ๋งŽ๋‹ค.
ํƒ€๋ฐ•์ƒ ๋ฐ ๋ฒ”ํ”„:
1. ์กฐ๋งŒ๊ฐ„ ๊ณ ๊ฐ์€ ์ด ์„ธ์ƒ์˜ ์กด์žฌ์™€ ๋ณดํŽธ์  ์ •์˜์˜ ๋ณธ์งˆ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ณ  ๋‹ค์‹œ ํ•œ ๋ฒˆ ์Šค์Šค๋กœ์—๊ฒŒ ์งˆ๋ฌธํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™œ ๋‚ด๊ฐ€ ๊ทธ๋“ค์—๊ฒŒ ๋ˆ์„ ์ง€๋ถˆํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ๊ฒฐ๊ณผ๋Š” ํ•ญ์ƒ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์œ ์ผํ•œ ์งˆ๋ฌธ์€ ๊ณ ๊ฐ์ด ์ง€๋ฃจํ•ดํ•˜๊ณ  ์ž‘๋ณ„ ์ธ์‚ฌ๋ฅผ ํ•  ๋•Œ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ”ผ๋”๊ฐ€ ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์Šฌํ”„๋‹ค.
2. ์—”์ง€๋‹ˆ์–ด์˜ ๊ฐœ๋ฐœ์€ ์ œ๋กœ์ž…๋‹ˆ๋‹ค.
3. ์ž‘์—… ์ผ์ • ๋ฐ ์ ์žฌ์˜ ์–ด๋ ค์›€

์˜ต์…˜ 2 - "ํƒฌ๋ฒ„๋ฆฐ๊ณผ ํ•จ๊ป˜ ์ถค์„ ์ถ”๊ณ  ์‹ ๋ฐœ์„ ์‹ ๊ณ  ์‹ ์–ด๋ณด์„ธ์š”"

๋‹จ๋ฝ 1-๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ์ด ํ•„์š”ํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋ชจ๋“  ์š”์ฒญ์„ ๋ฐ›๊ฒŒ๋ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ฐ์ดํ„ฐ ์‚ฌ์ „ ๋ฐ ๋™์  ๋ณด๊ธฐ์— ๋Œ€ํ•œ ๋ชจ๋“  ์ข…๋ฅ˜์˜ ์ฟผ๋ฆฌ๋ฅผ ์‹œ์ž‘ํ•˜๊ณ , ๋ชจ๋“  ์ข…๋ฅ˜์˜ ์นด์šดํ„ฐ๋ฅผ ์ผœ๊ณ , ๋ชจ๋“  ๊ฒƒ์„ ํ…Œ์ด๋ธ”๋กœ ๊ฐ€์ ธ์˜ค๊ณ , ๋ชฉ๋ก๊ณผ ํ…Œ์ด๋ธ”์„ ์ฃผ๊ธฐ์ ์œผ๋กœ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ๊ทธ๋ž˜ํ”„, ํ‘œ, ๋ณด๊ณ ์„œ๊ฐ€ ์•„๋ฆ„๋‹ต๊ฑฐ๋‚˜ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ๋” ๋งŽ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋‹จ๋ฝ 2-ํ™œ๋™ ์ƒ์„ฑ-์ด ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•œ ๋ถ„์„์„ ์‹คํ–‰ํ•˜์‹ญ์‹œ์˜ค.
๋‹จ๋ฝ 3-์šฐ๋ฆฌ๋Š” ํŠน์ • ๋ฌธ์„œ๋ฅผ ์ค€๋น„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์„œ๋ฅผ ๊ฐ„๋‹จํžˆ "๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์–ด๋–ป๊ฒŒ ๊ฐ–์ถ”๋‚˜์š”?"๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.
๋‹จ๋ฝ 4-์ด ๋ชจ๋“  ์žฅ์—„ํ•œ ๊ทธ๋ž˜ํ”„์™€ ๊ทธ๋ฆผ์„ ๋ณธ ๊ณ ๊ฐ์€ ์œ ์น˜ํ•œ ์ˆœ์ง„ํ•œ ์ž์‹ ๊ฐ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋ชจ๋“  ๊ฒƒ์ด ๊ณง ์šฐ๋ฆฌ์—๊ฒŒ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‰ฝ๊ณ  ๊ณ ํ†ต ์—†์ด ์žฌ์ • ์ž์›์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ฒฝ์˜์ง„์€ ๋˜ํ•œ ์šฐ๋ฆฌ ์—”์ง€๋‹ˆ์–ด๋“ค์ด ์—ด์‹ฌํžˆ ์ผํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. ์ตœ๋Œ€ ๋กœ๋”ฉ.
๋‹จ๋ฝ 5- 1๋‹จ๊ณ„๋ฅผ ์ •๊ธฐ์ ์œผ๋กœ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.
์ง„์ €๋ธŒ๋ ˆ๋“œ์™€ ๋„๋„›, ํƒ€๋ฐ•์ƒ๊ณผ ํ˜น์ง„์ €๋ธŒ๋ ˆ๋“œ์™€ ๋„๋„›:
1. ๊ด€๋ฆฌ์ž์™€ ์—”์ง€๋‹ˆ์–ด์˜ ์‚ถ์€ ๋‹จ์ˆœํ•˜๊ณ  ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๋ฉฐ ํ™œ๋™์œผ๋กœ ๊ฐ€๋“ ์ฐจ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด ์œ™์œ™ ๊ฑฐ๋ฆฌ๊ณ  ๋ชจ๋‘ ๋ฐ”์˜๋‹ค.
2. ๊ณ ๊ฐ์˜ ์‚ถ๋„ ๋‚˜์˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Š” ํ•ญ์ƒ ๋‹น์‹ ์ด ์•ฝ๊ฐ„์˜ ์ธ๋‚ด์‹ฌ์ด ํ•„์š”ํ•˜๊ณ  ๋ชจ๋“  ๊ฒƒ์ด ์ž˜ ๋  ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜์•„์ง€์ง€ ์•Š์•„, ์Œ, ์Œ - ์ด ์„ธ์ƒ์€ ๋ถˆ๊ณตํ‰ํ•ด, ๋‹ค์Œ ์ƒ์—์„œ๋Š” - ๋„Œ ์šด์ด ์ข‹์„ ๊ฑฐ์•ผ.
ํƒ€๋ฐ•์ƒ ๋ฐ ๋ฒ”ํ”„:
1. ์กฐ๋งŒ๊ฐ„ ๊ฐ™์€ ์ผ์„ ํ•˜์ง€๋งŒ ์กฐ๊ธˆ ๋” ์ €๋ ดํ•œ ์œ ์‚ฌํ•œ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋” ๋˜‘๋˜‘ํ•œ ๊ณต๊ธ‰์ž๊ฐ€ ๋“ฑ์žฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฒฐ๊ณผ๊ฐ€ ๊ฐ™๋‹ค๋ฉด ์™œ ๋” ๋งŽ์€ ๋น„์šฉ์„ ์ง€๋ถˆํ•ด์•ผ ํ• ๊นŒ์š”? ๋‹ค์‹œ ํ”ผ๋”๊ฐ€ ์‚ฌ๋ผ์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
2. ์ง€๋ฃจํ•˜๋‹ค. ์˜๋ฏธ ์žˆ๋Š” ์ž‘์€ ํ™œ๋™์ด ์–ผ๋งˆ๋‚˜ ์ง€๋ฃจํ•œ์ง€.
3. ์ด์ „ ๋ฒ„์ „๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ - ๊ฐœ๋ฐœ์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—”์ง€๋‹ˆ์–ด์˜ ๊ฒฝ์šฐ ๋งˆ์ด๋„ˆ์Šค๋Š” ์ฒซ ๋ฒˆ์งธ ์˜ต์…˜๊ณผ ๋‹ฌ๋ฆฌ ์—ฌ๊ธฐ์—์„œ ์ง€์†์ ์œผ๋กœ IDB๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ์‚ฌ๋ž‘ํ•˜๋Š” ์‚ฌ๋žŒ์˜ ์ด์ต์„ ์œ„ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ์ž์‹ ์„ ๋Œ๋ณผ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋‘๊ฐ€ ๋‹น์‹ ์„ ๊ฑฑ์ •ํ•ฉ๋‹ˆ๋‹ค.

์˜ต์…˜ 3-์ž์ „๊ฑฐ๋ฅผ ๋ฐœ๋ช…ํ•  ํ•„์š” ์—†์ด ๊ตฌ์ž…ํ•˜์—ฌ ํƒ€๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ํšŒ์‚ฌ์˜ ์—”์ง€๋‹ˆ์–ด๋Š” ๊ณ ์˜๋กœ ๋งฅ์ฃผ์™€ ํ•จ๊ป˜ ํ”ผ์ž๋ฅผ ๋จน์Šต๋‹ˆ๋‹ค (์˜ค, 90 ๋…„๋Œ€ ์ƒํŠธ ํŽ˜ํ…Œ๋ฅด๋ถ€๋ฅดํฌ์˜ ์˜๊ด‘์Šค๋Ÿฌ์šด ์‹œ๋Œ€). ๋งŒ๋“ค์–ด์ง€๊ณ  ๋””๋ฒ„๊น…๋˜๊ณ  ์ž‘๋™ํ•˜๋Š” ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•ฉ์‹œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋งํ•ด์„œ ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ์€ ์ด์ ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค(์ ์–ด๋„ ์ž‘์„ฑ์ž์—๊ฒŒ๋Š”).
์ง„์ €๋ธŒ๋ ˆ๋“œ์™€ ๋„๋„›, ํƒ€๋ฐ•์ƒ๊ณผ ํ˜น์ง„์ €๋ธŒ๋ ˆ๋“œ์™€ ๋„๋„›:
1. ์ด๋ฏธ ๋ฐœ๋ช…๋œ ๊ฒƒ์„ ๋ฐœ๋ช…ํ•˜๋Š๋ผ ์‹œ๊ฐ„์„ ๋‚ญ๋น„ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ฐ€์ง€๊ณ  ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.
2. ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ์€ ๋ฐ”๋ณด๊ฐ€ ์ž‘์„ฑํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ฉฐ ๋ฌผ๋ก  ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
3. ์ž‘์—… ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์œ ์šฉํ•œ ํ•„ํ„ฐ๋ง ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
ํƒ€๋ฐ•์ƒ ๋ฐ ๋ฒ”ํ”„:
1. ์ด ๊ฒฝ์šฐ ์—”์ง€๋‹ˆ์–ด๋Š” ์—”์ง€๋‹ˆ์–ด๊ฐ€ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์ œํ’ˆ์„ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ์šฉ์ž ๋˜๋Š” ์‚ฌ์šฉ์ž์ž…๋‹ˆ๋‹ค.
2. ๊ณ ๊ฐ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ดํ•ดํ•˜๊ณ  ์‹ถ์ง€ ์•Š์€ ๊ฒƒ์„ ๊ตฌ๋งคํ•ด์•ผ ํ•  ํ•„์š”์„ฑ์„ ํ™•์‹ ํ•ด์•ผ ํ•˜๋ฉฐ, ์ผ๋ฐ˜์ ์œผ๋กœ ํ•ด๋‹น ์—ฐ๋„์˜ ์˜ˆ์‚ฐ์ด ์Šน์ธ๋˜์—ˆ์œผ๋ฉฐ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ณ„๋„์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ํ• ๋‹นํ•˜๊ณ  ํŠน์ • ์‹œ์Šคํ…œ์— ๋งž๊ฒŒ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ €๊ฒƒ๋“ค. ๋จผ์ € ์ง€๋ถˆํ•˜๊ณ  ์ง€๋ถˆํ•˜๊ณ  ๋‹ค์‹œ ์ง€๋ถˆํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ณ ๊ฐ์€ ์ธ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ด ์‚ถ์˜ ๊ทœ๋ฒ”์ž…๋‹ˆ๋‹ค.

์–ด๋–กํ•ด, ์ฒด๋ฅด๋‹ˆ์…ฐํ”„์Šคํ‚ค? ๊ท€ํ•˜์˜ ์งˆ๋ฌธ์€ ๋งค์šฐ ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค. (์™€ ํ•จ๊ป˜)

์ด ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ์™€ ํ˜„์žฌ ์ƒํ™ฉ์—์„œ๋Š” ์กฐ๊ธˆ ๋‹ค๋ฅด๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์ฒด ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ์„ ๋งŒ๋“ค์–ด ๋ด…์‹œ๋‹ค.
PostgreSQL ์ฟผ๋ฆฌ์˜ ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง. ํŒŒํŠธ 1 - ๋ณด๊ณ 
๊ธ€์Ž„, ๋ฌผ๋ก  ์‹œ์Šคํ…œ์ด ์•„๋‹ˆ๋ผ ๋‹จ์–ด์˜ ์˜๋ฏธ์—์„œ ์ด๊ฒƒ์€ ๋„ˆ๋ฌด ์‹œ๋„๋Ÿฝ๊ณ  ์ฃผ์ œ ๋„˜์ง€ ๋งŒ ์ ์–ด๋„ ์–ด๋–ป๊ฒŒ ๋“  ์ž์‹ ์„ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“ค๊ณ  ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค. ์ƒํ™ฉ์— ์ฒ˜ํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด "๊ฑฐ๊ธฐ ๊ฐ€์„ธ์š”. ์–ด๋”˜์ง€ ๋ชจ๋ฅด๊ฒ ์–ด์š”. ์ €๊ฑธ ์ฐพ์œผ์„ธ์š”. ๋ญ๊ฐ€ ๋ญ”์ง€ ๋ชจ๋ฅด๊ฒ ์–ด์š”."

์ด ์˜ต์…˜์˜ ์žฅ๋‹จ์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์žฅ์  :
1. ํฅ๋ฏธ๋กญ๋‹ค. ์Œ, ์ ์–ด๋„ "๋ฐ์ดํ„ฐ ํŒŒ์ผ ์ถ•์†Œ, ํ…Œ์ด๋ธ”์ŠคํŽ˜์ด์Šค ๋ณ€๊ฒฝ ๋“ฑ"์ด๋ผ๋Š” ์ƒ์ˆ˜๋ณด๋‹ค ๋” ํฅ๋ฏธ๋กญ์Šต๋‹ˆ๋‹ค.
2. ์ด๊ฒƒ์€ ์ƒˆ๋กœ์šด ๊ธฐ์ˆ ๊ณผ ์ƒˆ๋กœ์šด ๊ฐœ๋ฐœ์ž…๋‹ˆ๋‹ค. ์กฐ๋งŒ๊ฐ„ ์ง„์ € ๋ธŒ๋ ˆ๋“œ์™€ ๋„๋„›์„ ์ œ๊ณต ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋‹จ์  :
1. ์ผ์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋งŽ์ด ์ผํ•˜์‹ญ์‹œ์˜ค.
2. ๋ชจ๋“  ํ™œ๋™์˜ ์˜๋ฏธ์™€ ๊ด€์ ์„ ์ •๊ธฐ์ ์œผ๋กœ ์„ค๋ช…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
3. ์—”์ง€๋‹ˆ์–ด๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ์ž์›์ธ ์‹œ๊ฐ„์€ ์šฐ์ฃผ์— ์˜ํ•ด ์ œํ•œ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌด์–ธ๊ฐ€๋ฅผ ํฌ์ƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
4. ์ตœ์•…์˜ ๊ทธ๋ฆฌ๊ณ  ๊ฐ€์žฅ ๋ถˆ์พŒํ•œ ๊ฒƒ - ๊ฒฐ๊ณผ์ ์œผ๋กœ "์ฅ๋„ ๊ฐœ๊ตฌ๋ฆฌ๋„ ์•„๋‹Œ ์•Œ ์ˆ˜ ์—†๋Š” ์ž‘์€ ๋™๋ฌผ" ๊ฐ™์€ ์“ฐ๋ ˆ๊ธฐ๊ฐ€ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„ํ—˜์„ ๊ฐ์ˆ˜ํ•˜์ง€ ์•Š๋Š” ์‚ฌ๋žŒ์€ ์ƒดํŽ˜์ธ์„ ๋งˆ์‹œ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ์žฌ๋ฏธ๊ฐ€ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์ธ ์•„์ด๋””์–ด - ํšŒ๋กœ๋„

PostgreSQL ์ฟผ๋ฆฌ์˜ ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง. ํŒŒํŠธ 1 - ๋ณด๊ณ 
(๊ธฐ์‚ฌ์—์„œ ๊ฐ€์ ธ์˜จ ๊ทธ๋ฆผ ยซPostgreSQL ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋กœ ํ•ฉ์„ฑ")

์„ค๋ช… :

  • ๋Œ€์ƒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ํ‘œ์ค€ PostgreSQL ํ™•์žฅ "pg_stat_statements"๋กœ ์„ค์น˜๋ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์„œ๋น„์Šค ํ…Œ์ด๋ธ” ์„ธํŠธ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ดˆ๊ธฐ ๋‹จ๊ณ„์—์„œ pg_stat_statements ๊ธฐ๋ก์„ ์ €์žฅํ•˜๊ณ  ํ–ฅํ›„ ๋ฉ”ํŠธ๋ฆญ ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋‹ˆํ„ฐ๋ง ํ˜ธ์ŠคํŠธ์—์„œ ํ‹ฐ์ผ“ ์‹œ์Šคํ…œ์—์„œ ์ธ์‹œ๋˜ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํฌํ•จํ•˜์—ฌ ์ผ๋ จ์˜ bash ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์„œ๋น„์Šค ํ…Œ์ด๋ธ”

์šฐ์„ , ๊ฐœ๋žต์ ์œผ๋กœ ๋‹จ์ˆœํ™”๋œ ERD, ๊ฒฐ๊ตญ ๋ฐœ์ƒํ•œ ์ผ:
PostgreSQL ์ฟผ๋ฆฌ์˜ ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง. ํŒŒํŠธ 1 - ๋ณด๊ณ 
ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ์„ค๋ช…์—”๋“œ ํฌ์ธํŠธ - ํ˜ธ์ŠคํŠธ, ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ ์ง€์ 
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์˜ต์…˜
pg_stat_history - ๋Œ€์ƒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ pg_stat_statements ๋ณด๊ธฐ์˜ ์ž„์‹œ ์Šค๋ƒ…์ƒท์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ก ํ…Œ์ด๋ธ”
metric_glossary - ์„ฑ๋Šฅ ๋ฉ”ํŠธ๋ฆญ ์‚ฌ์ „
๋ฉ”ํŠธ๋ฆญ_๊ตฌ์„ฑ - ๊ฐœ๋ณ„ ๋ฉ”ํŠธ๋ฆญ ๊ตฌ์„ฑ
๋ฉ”ํŠธ๋ฆญ - ๋ชจ๋‹ˆํ„ฐ๋ง ์ค‘์ธ ์š”์ฒญ์— ๋Œ€ํ•œ ํŠน์ • ๋ฉ”ํŠธ๋ฆญ
metric_alert_history - ์„ฑ๋Šฅ ๊ฒฝ๊ณ ์˜ ์—ญ์‚ฌ
๋กœ๊ทธ_์ฟผ๋ฆฌ - AWS์—์„œ ๋‹ค์šด๋กœ๋“œํ•œ PostgreSQL ๋กœ๊ทธ ํŒŒ์ผ์—์„œ ๊ตฌ๋ฌธ ๋ถ„์„๋œ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ์„œ๋น„์Šค ํ…Œ์ด๋ธ”
๊ธฐ์ค€ - ๊ธฐ์ค€์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๊ฐ„์˜ ๋งค๊ฐœ๋ณ€์ˆ˜
์ฒดํฌ ํฌ์ธํŠธ - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒํƒœ ํ™•์ธ์„ ์œ„ํ•œ ๋ฉ”ํŠธ๋ฆญ ๊ตฌ์„ฑ
checkpoint_alert_history - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒํƒœ ํ™•์ธ ๋ฉ”ํŠธ๋ฆญ์˜ ๊ฒฝ๊ณ  ๊ธฐ๋ก
pg_stat_db_queries โ€” ํ™œ์„ฑ ์š”์ฒญ์˜ ์„œ๋น„์Šค ํ…Œ์ด๋ธ”
ํ™œ๋™ ๋กœ๊ทธ โ€” ํ™œ๋™ ๋กœ๊ทธ ์„œ๋น„์Šค ํ…Œ์ด๋ธ”
ํ•จ์ •_oid - ํŠธ๋žฉ ๊ตฌ์„ฑ ์„œ๋น„์Šค ํ…Œ์ด๋ธ”

1๋‹จ๊ณ„ - ์„ฑ๋Šฅ ํ†ต๊ณ„ ์ˆ˜์ง‘ ๋ฐ ๋ณด๊ณ ์„œ ๋ฐ›๊ธฐ

ํ…Œ์ด๋ธ”์€ ํ†ต๊ณ„ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. pg_stat_history
pg_stat_history ํ…Œ์ด๋ธ” ๊ตฌ์กฐ

                                          ํ…Œ์ด๋ธ” "public.pg_stat_history" ์—ด | ์œ ํ˜• | ์ˆ˜์ •์ž ---------------------+--------+---------------------------------------------------- id | ์ •์ˆ˜ | null์ด ์•„๋‹˜ ๊ธฐ๋ณธ๊ฐ’ nextval('pg_stat_history_id_seq'::regclass) snapshot_timestamp | ์‹œ๊ฐ„๋Œ€๊ฐ€ ์—†๋Š” ํƒ€์ž„์Šคํƒฌํ”„ | ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์•„์ด๋”” | ์ •์ˆ˜ | ๋””๋น„๋“œ | oid | ์‚ฌ์šฉ์ž ์•„์ด๋”” | oid | ์ฟผ๋ฆฌID | ๋น„๊ธดํŠธ | ์ฟผ๋ฆฌ | ํ…์ŠคํŠธ | ํ†ตํ™” | ๋น„๊ธดํŠธ | ์ด_์‹œ๊ฐ„ | ๋ฐฐ์ •๋ฐ€๋„ | min_time | ๋ฐฐ์ •๋ฐ€๋„ | ์ตœ๋Œ€_์‹œ๊ฐ„ | ๋ฐฐ์ •๋ฐ€๋„ | ํ‰๊ท _์‹œ๊ฐ„ | ๋ฐฐ์ •๋ฐ€๋„ | stddev_time | ๋ฐฐ์ •๋ฐ€๋„ | ํ–‰ | ๋น„๊ธดํŠธ | shared_blks_hit | ๋น„๊ธดํŠธ | shared_blks_read | ๋น„๊ธดํŠธ | shared_blks_dirtied | ๋น„๊ธดํŠธ | shared_blks_written | ๋น„๊ธดํŠธ | local_blks_hit | ๋น„๊ธดํŠธ | local_blks_read | ๋น„๊ธดํŠธ | local_blks_dirtied | ๋น„๊ธดํŠธ | local_blks_written | ๋น„๊ธดํŠธ | temp_blks_read | ๋น„๊ธดํŠธ | temp_blks_written | ๋น„๊ธดํŠธ | blk_read_time | ๋ฐฐ์ •๋ฐ€๋„ | blk_write_time | ๋ฐฐ์ •๋ฐ€๋„ | ๊ธฐ์ค€์„  ID | ์ •์ˆ˜ | ์ธ๋ฑ์Šค: "pg_stat_history_pkey" ๊ธฐ๋ณธ ํ‚ค, Btree(id) "Database_idx" BTREE(DATABASE_ID) "Queryid_idx" BTREE(QUERYID) "SNAPSHOT_TIMESTAMP_IDX" BTREE(SNAPSHOTRE(SNAPSH _timestamp) ์™ธ๋ž˜ ํ‚ค ์ œ์•ฝ ์กฐ๊ฑด: "Database_id_fk" ์™ธ๋ž˜ ํ‚ค(Database_id) ์ฐธ์กฐ Database(ID) On Delete Cascade

๋ณด์‹œ๋‹ค์‹œํ”ผ ํ…Œ์ด๋ธ”์€ ๋ˆ„์  ๋ทฐ ๋ฐ์ดํ„ฐ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. pg_stat_statements ๋Œ€์ƒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ.

์ด ํ…Œ์ด๋ธ”์˜ ์‚ฌ์šฉ๋ฒ•์€ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

pg_stat_history ์‹œ๊ฐ„๋‹น ์ฟผ๋ฆฌ ์‹คํ–‰์˜ ๋ˆ„์  ํ†ต๊ณ„๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๋งค์‹œ๊ฐ„ ์ดˆ์— ํ…Œ์ด๋ธ”์„ ์ฑ„์šด ํ›„ ํ†ต๊ณ„ pg_stat_statements ์žฌ์„ค์ • pg_stat_statements_reset().
์ฐธ๊ณ  : ๊ธฐ๊ฐ„์ด 1์ดˆ ์ด์ƒ์ธ ์š”์ฒญ์— ๋Œ€ํ•ด ํ†ต๊ณ„๊ฐ€ ์ˆ˜์ง‘๋ฉ๋‹ˆ๋‹ค.
pg_stat_history ํ…Œ์ด๋ธ” ์ฑ„์šฐ๊ธฐ

--pg_stat_history.sql
CREATE OR REPLACE FUNCTION pg_stat_history( ) RETURNS boolean AS $$
DECLARE
  endpoint_rec record ;
  database_rec record ;
  pg_stat_snapshot record ;
  current_snapshot_timestamp timestamp without time zone;
BEGIN
  current_snapshot_timestamp = date_trunc('minute',now());  
  
  FOR endpoint_rec IN SELECT * FROM endpoint 
  LOOP
    FOR database_rec IN SELECT * FROM database WHERE endpoint_id = endpoint_rec.id 
	  LOOP
	    
		RAISE NOTICE 'NEW SHAPSHOT IS CREATING';
		
		--Connect to the target DB	  
	    EXECUTE 'SELECT dblink_connect(''LINK1'',''host='||endpoint_rec.host||' dbname='||database_rec.name||' user=USER password=PASSWORD '')';
 
        RAISE NOTICE 'host % and dbname % ',endpoint_rec.host,database_rec.name;
		RAISE NOTICE 'Creating snapshot of pg_stat_statements for database %',database_rec.name;
		
		SELECT 
	      *
		INTO 
		  pg_stat_snapshot
	    FROM dblink('LINK1',
	      'SELECT 
	       dbid , SUM(calls),SUM(total_time),SUM(rows) ,SUM(shared_blks_hit) ,SUM(shared_blks_read) ,SUM(shared_blks_dirtied) ,SUM(shared_blks_written) , 
           SUM(local_blks_hit) , SUM(local_blks_read) , SUM(local_blks_dirtied) , SUM(local_blks_written) , SUM(temp_blks_read) , SUM(temp_blks_written) , SUM(blk_read_time) , SUM(blk_write_time)
	       FROM pg_stat_statements WHERE dbid=(SELECT oid from pg_database where datname=current_database() ) 
		   GROUP BY dbid
  	      '
	               )
	      AS t
	       ( dbid oid , calls bigint , 
  	         total_time double precision , 
	         rows bigint , shared_blks_hit bigint , shared_blks_read bigint ,shared_blks_dirtied bigint ,shared_blks_written	 bigint ,
             local_blks_hit	 bigint ,local_blks_read bigint , local_blks_dirtied bigint ,local_blks_written bigint ,
             temp_blks_read	 bigint ,temp_blks_written bigint ,
             blk_read_time double precision , blk_write_time double precision	  
	       );
		 
		INSERT INTO pg_stat_history
          ( 
		    snapshot_timestamp  ,database_id  ,
			dbid , calls  ,total_time ,
            rows ,shared_blks_hit  ,shared_blks_read  ,shared_blks_dirtied  ,shared_blks_written ,local_blks_hit , 	 	
            local_blks_read,local_blks_dirtied,local_blks_written,temp_blks_read,temp_blks_written, 	
            blk_read_time, blk_write_time 
		  )		  
	    VALUES
	      (
	       current_snapshot_timestamp ,
		   database_rec.id ,
	       pg_stat_snapshot.dbid ,pg_stat_snapshot.calls,
	       pg_stat_snapshot.total_time,
	       pg_stat_snapshot.rows ,pg_stat_snapshot.shared_blks_hit ,pg_stat_snapshot.shared_blks_read ,pg_stat_snapshot.shared_blks_dirtied ,pg_stat_snapshot.shared_blks_written , 
           pg_stat_snapshot.local_blks_hit , pg_stat_snapshot.local_blks_read , pg_stat_snapshot.local_blks_dirtied , pg_stat_snapshot.local_blks_written , 
	       pg_stat_snapshot.temp_blks_read , pg_stat_snapshot.temp_blks_written , pg_stat_snapshot.blk_read_time , pg_stat_snapshot.blk_write_time 	   
	      );		   
		  
        RAISE NOTICE 'Creating snapshot of pg_stat_statements for queries with min_time more than 1000ms';
	
        FOR pg_stat_snapshot IN
          --All queries with max_time greater than 1000 ms
	      SELECT 
	        *
	      FROM dblink('LINK1',
	        'SELECT 
	         dbid , userid ,queryid,query,calls,total_time,min_time ,max_time,mean_time, stddev_time ,rows ,shared_blks_hit ,
			 shared_blks_read ,shared_blks_dirtied ,shared_blks_written , 
             local_blks_hit , local_blks_read , local_blks_dirtied , 
			 local_blks_written , temp_blks_read , temp_blks_written , blk_read_time , 
			 blk_write_time
	         FROM pg_stat_statements 
			 WHERE dbid=(SELECT oid from pg_database where datname=current_database() AND min_time >= 1000 ) 
  	        '

	                  )
	        AS t
	         ( dbid oid , userid oid , queryid bigint ,query text , calls bigint , 
  	           total_time double precision ,min_time double precision	 ,max_time double precision	 , mean_time double precision	 ,  stddev_time double precision	 , 
	           rows bigint , shared_blks_hit bigint , shared_blks_read bigint ,shared_blks_dirtied bigint ,shared_blks_written	 bigint ,
               local_blks_hit	 bigint ,local_blks_read bigint , local_blks_dirtied bigint ,local_blks_written bigint ,
               temp_blks_read	 bigint ,temp_blks_written bigint ,
               blk_read_time double precision , blk_write_time double precision	  
	         )
	    LOOP
		  INSERT INTO pg_stat_history
          ( 
		    snapshot_timestamp  ,database_id  ,
			dbid ,userid  , queryid  , query  , calls  ,total_time ,min_time ,max_time ,mean_time ,stddev_time ,
            rows ,shared_blks_hit  ,shared_blks_read  ,shared_blks_dirtied  ,shared_blks_written ,local_blks_hit , 	 	
            local_blks_read,local_blks_dirtied,local_blks_written,temp_blks_read,temp_blks_written, 	
            blk_read_time, blk_write_time 
		  )		  
	      VALUES
	      (
	       current_snapshot_timestamp ,
		   database_rec.id ,
	       pg_stat_snapshot.dbid ,pg_stat_snapshot.userid ,pg_stat_snapshot.queryid,pg_stat_snapshot.query,pg_stat_snapshot.calls,
	       pg_stat_snapshot.total_time,pg_stat_snapshot.min_time ,pg_stat_snapshot.max_time,pg_stat_snapshot.mean_time, pg_stat_snapshot.stddev_time ,
	       pg_stat_snapshot.rows ,pg_stat_snapshot.shared_blks_hit ,pg_stat_snapshot.shared_blks_read ,pg_stat_snapshot.shared_blks_dirtied ,pg_stat_snapshot.shared_blks_written , 
           pg_stat_snapshot.local_blks_hit , pg_stat_snapshot.local_blks_read , pg_stat_snapshot.local_blks_dirtied , pg_stat_snapshot.local_blks_written , 
	       pg_stat_snapshot.temp_blks_read , pg_stat_snapshot.temp_blks_written , pg_stat_snapshot.blk_read_time , pg_stat_snapshot.blk_write_time 	   
	      );
		  
        END LOOP;

        PERFORM dblink_disconnect('LINK1');  
				
	  END LOOP ;--FOR database_rec IN SELECT * FROM database WHERE endpoint_id = endpoint_rec.id 
    
  END LOOP;

RETURN TRUE;  
END
$$ LANGUAGE plpgsql;

๊ฒฐ๊ณผ์ ์œผ๋กœ ํ‘œ์—์„œ ์ผ์ • ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด pg_stat_history ์šฐ๋ฆฌ๋Š” ํ…Œ์ด๋ธ” ๋‚ด์šฉ์˜ ์Šค๋ƒ…์ƒท ์„ธํŠธ๋ฅผ ๊ฐ–๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. pg_stat_statements ๋Œ€์ƒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค.

์‹ค์ œ๋กœ๋ณด๊ณ 

๊ฐ„๋‹จํ•œ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋งค์šฐ ์œ ์šฉํ•˜๊ณ  ํฅ๋ฏธ๋กœ์šด ๋ณด๊ณ ์„œ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ผ์ • ๊ธฐ๊ฐ„ ๋™์•ˆ ์ง‘๊ณ„๋œ ๋ฐ์ดํ„ฐ

์ฃผ์žฅ

SELECT 
  database_id , 
  SUM(calls) AS calls ,SUM(total_time)  AS total_time ,
  SUM(rows) AS rows , SUM(shared_blks_hit)  AS shared_blks_hit,
  SUM(shared_blks_read) AS shared_blks_read ,
  SUM(shared_blks_dirtied) AS shared_blks_dirtied,
  SUM(shared_blks_written) AS shared_blks_written , 
  SUM(local_blks_hit) AS local_blks_hit , 
  SUM(local_blks_read) AS local_blks_read , 
  SUM(local_blks_dirtied) AS local_blks_dirtied , 
  SUM(local_blks_written)  AS local_blks_written,
  SUM(temp_blks_read) AS temp_blks_read, 
  SUM(temp_blks_written) temp_blks_written , 
  SUM(blk_read_time) AS blk_read_time , 
  SUM(blk_write_time) AS blk_write_time
FROM 
  pg_stat_history
WHERE 
  queryid IS NULL AND
  database_id = DATABASE_ID  AND
  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT
GROUP BY database_id ;

DB ์‹œ๊ฐ„

to_char(๊ฐ„๊ฒฉ '1๋ฐ€๋ฆฌ์ดˆ' * pg_total_stat_history_rec.total_time, 'HH24:MI:SS.MS')

I/O ์‹œ๊ฐ„

to_char(๊ฐ„๊ฒฉ '1๋ฐ€๋ฆฌ์ดˆ' * ( pg_total_stat_history_rec.blk_read_time + pg_total_stat_history_rec.blk_write_time ), 'HH24:MI:SS.MS')

total_time๋ณ„ TOP10 SQL

์ฃผ์žฅ

SELECT 
  queryid , 
  SUM(calls) AS calls ,
  SUM(total_time)  AS total_time  	
FROM 
  pg_stat_history
WHERE 
  queryid IS NOT NULL AND 
  database_id = DATABASE_ID AND
  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT 
GROUP BY queryid 
ORDER BY 3 DESC 
LIMIT 10
------------------------------------------------------------------------------------------------------------ | ์ด ์‹คํ–‰ ์‹œ๊ฐ„๋ณ„ TOP10 SQL | #| ์ฟผ๋ฆฌID| ํ˜ธ์ถœ| ํ˜ธ์ถœ %| ์ด_์‹œ๊ฐ„(๋ฐ€๋ฆฌ์ดˆ) | dbtime % +----+-----------+-----------+-----------+--------------------------------+---------- | 1| 821760255| 2| .00001|00:03:23.141(203141.681๋ฐ€๋ฆฌ์ดˆ)| 5.42 | 2| 4152624390| 2| .00001|00:03:13.929( 193929.215ms.)| 5.17 | 3| 1484454471| 4| .00001|00:02:09.129( 129129.057ms.)| 3.44 | 4| 655729273| 1| .00000|00:02:01.869( 121869.981ms.)| 3.25 | 5| 2460318461| 1| .00000|00:01:33.113(93113.835๋ฐ€๋ฆฌ์ดˆ)| 2.48 | 6| 2194493487| 4| .00001|00:00:17.377(17377.868๋ฐ€๋ฆฌ์ดˆ)| .46 | 7| 1053044345| 1| .00000|00:00:06.156(6156.352๋ฐ€๋ฆฌ์ดˆ)| .16 | 8| 3644780286| 1| .00000|00:00:01.063(1063.830ms.)| .03

์ด I/O ์‹œ๊ฐ„๋ณ„ TOP10 SQL

์ฃผ์žฅ

SELECT 
  queryid , 
  SUM(calls) AS calls ,
  SUM(blk_read_time + blk_write_time)  AS io_time
FROM 
  pg_stat_history
WHERE 
  queryid IS NOT NULL AND 
  database_id = DATABASE_ID  AND
  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT
GROUP BY  queryid 
ORDER BY 3 DESC 
LIMIT 10
---------------------------------------------------------------------------------------------------------------------------- | ์ด I/O ์‹œ๊ฐ„๋ณ„ TOP10 SQL | #| ์ฟผ๋ฆฌID| ํ˜ธ์ถœ| ํ˜ธ์ถœ %| I/O ์‹œ๊ฐ„(ms)|db I/O ์‹œ๊ฐ„ % +----+-----------+-----------+-----------+--------------------------------+------------- | 1| 4152624390| 2| .00001|00:08:31.616(511616.592๋ฐ€๋ฆฌ์ดˆ)| 31.06์›” 2์ผ | 821760255| 2| 00001| .00|08:27.099:507099.036(30.78๋ฐ€๋ฆฌ์ดˆ)| 3 | 655729273| 1| 00000| .00|05:02.209:302209.137(18.35๋ฐ€๋ฆฌ์ดˆ)| 4 | 2460318461| 1| 00000| .00|04:05.981:245981.117(14.93๋ฐ€๋ฆฌ์ดˆ)| 5 | 1484454471| 4| 00001| .00|00:39.144:39144.221( 2.38ms.)| 6 | 2194493487| 4| 00001| .00|00:18.182:18182.816(1.10๋ฐ€๋ฆฌ์ดˆ)| 7 | 1053044345| 1| 00000| .00|00:16.611:16611.722( 1.01ms.)| 8 | 3644780286| 1| 00000| .00|00:00.436:436.205(03๋ฐ€๋ฆฌ์ดˆ)| .XNUMX

์ตœ๋Œ€ ์‹คํ–‰ ์‹œ๊ฐ„๋ณ„ TOP10 SQL

์ฃผ์žฅ

SELECT 
  id AS snapshotid , 
  queryid , 
  snapshot_timestamp ,  
  max_time 
FROM 
  pg_stat_history 
WHERE 
  queryid IS NOT NULL AND 
  database_id = DATABASE_ID  AND
  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT
ORDER BY 4 DESC 
LIMIT 10

---------------------------------------------------------------------------------------------------------------------------- | ์ตœ๋Œ€ ์‹คํ–‰ ์‹œ๊ฐ„๋ณ„ TOP10 SQL | #| ์Šค๋ƒ…์ƒท| ์Šค๋ƒ…์ƒทID| ์ฟผ๋ฆฌID| ์ตœ๋Œ€_์‹œ๊ฐ„(๋ฐ€๋ฆฌ์ดˆ) +----+------------------+-----------+-----------+---------------------------------------- | 1| 05.04.2019/01/03 4169:655729273| 00| 02| 01.869:121869.981:2( 04.04.2019๋ฐ€๋ฆฌ์ดˆ.) | 17| 00/4153/821760255 00:01| 41.570| 101570.841| 3:04.04.2019:16( 00๋ฐ€๋ฆฌ์ดˆ) | 4146| 821760255/00/01 41.570:101570.841| 4| 04.04.2019| 16:00:4144( 4152624390๋ฐ€๋ฆฌ์ดˆ) | 00| 01/36.964/96964.607 5:04.04.2019| 17| 00| 4151:4152624390:00( 01๋ฐ€๋ฆฌ์ดˆ.) | 36.964| 96964.607/6/05.04.2019 10:00| 4188| 1484454471| 00:01:33.452( 93452.150๋ฐ€๋ฆฌ์ดˆ.) | 7| 04.04.2019/17/00 4150:2460318461 | 00| 01| 33.113:93113.835:8( 04.04.2019๋ฐ€๋ฆฌ์ดˆ.) | 15| 00/4140/1484454471 00:00| 11.892| 11892.302| 9:04.04.2019:16( 00๋ฐ€๋ฆฌ์ดˆ) | 4145| 1484454471/00/00 11.892:11892.302| 10| 04.04.2019| 17:00:4152( 1484454471๋ฐ€๋ฆฌ์ดˆ) | 00| 00/11.892/11892.302 XNUMX:XNUMX| XNUMX| XNUMX| XNUMX:XNUMX:XNUMX( XNUMX๋ฐ€๋ฆฌ์ดˆ) | XNUMX| XNUMX/XNUMX/XNUMX XNUMX:XNUMX| XNUMX| XNUMX| XNUMX:XNUMX:XNUMX( XNUMX๋ฐ€๋ฆฌ์ดˆ.)

SHARED ๋ฒ„ํผ ์ฝ๊ธฐ/์“ฐ๊ธฐ์— ์˜ํ•œ TOP10 SQL

์ฃผ์žฅ

SELECT 
  id AS snapshotid , 
  queryid ,
  snapshot_timestamp , 
  shared_blks_read , 
  shared_blks_written 
FROM 
  pg_stat_history
WHERE 
  queryid IS NOT NULL AND 
  database_id = DATABASE_ID  AND
  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT AND
  ( shared_blks_read > 0 OR shared_blks_written > 0 )
ORDER BY 4 DESC  , 5 DESC 
LIMIT 10
----------------------------------------------------------------------------------------------------------- | ๊ณต์œ  ๋ฒ„ํผ ์ฝ๊ธฐ/์“ฐ๊ธฐ์— ์˜ํ•œ TOP10 SQL | #| ์Šค๋ƒ…์ƒท| ์Šค๋ƒ…์ƒทID| ์ฟผ๋ฆฌID| ๊ณต์œ  ๋ธ”๋ก ์ฝ๊ธฐ| ๊ณต์œ  ๋ธ”๋ก ์“ฐ๊ธฐ +----+------------------+-----------+-----------+--------------------+------- | 1| 04.04.2019/17/00 4153:821760255| 797308| 0| 2| 04.04.2019 | 16| 00/4146/821760255 797308:0| 3| 05.04.2019| 01| 03 | 4169| 655729273/797158/0 4:04.04.2019| 16| 00| 4144| 4152624390 | 756514| 0/5/04.04.2019 17:00| 4151| 4152624390| 756514| 0 | 6| 04.04.2019/17/00 4150:2460318461| 734117| 0| 7| 04.04.2019 | 17| 00/4155/3644780286 52973:0| 8| 05.04.2019| 01| 03 | 4168| 1053044345/52818/0 9:04.04.2019| 15| 00| 4141| 2194493487 | 52813| 0/10/04.04.2019 16:00| 4147| 2194493487| 52813| 0 | XNUMX| XNUMX/XNUMX/XNUMX XNUMX:XNUMX| XNUMX| XNUMX| XNUMX| XNUMX | XNUMX| XNUMX/XNUMX/XNUMX XNUMX:XNUMX| XNUMX| XNUMX| XNUMX| XNUMX --------------------------------------------------------------------------------------

์ตœ๋Œ€ ์‹คํ–‰ ์‹œ๊ฐ„๋ณ„ ์ฟผ๋ฆฌ ๋ถ„ํฌ ํžˆ์Šคํ† ๊ทธ๋žจ

์š”์ฒญ

SELECT  
  MIN(max_time) AS hist_min  , 
  MAX(max_time) AS hist_max , 
  (( MAX(max_time) - MIN(min_time) ) / hist_columns ) as hist_width
FROM 
  pg_stat_history 
WHERE 
  queryid IS NOT NULL AND
  database_id = DATABASE_ID  AND
  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT ;

SELECT 
  SUM(calls) AS calls
FROM 
  pg_stat_history 
WHERE 
  queryid IS NOT NULL AND
  database_id =DATABASE_ID  AND
  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT AND 
  ( max_time >= hist_current_min AND  max_time < hist_current_max ) ;
|------------------------------------------------------------------------------------------------------------------------------ | MAX_TIME ํžˆ์Šคํ† ๊ทธ๋žจ | ์ด ํ†ตํ™” ์ˆ˜: 33851920 | ์ตœ์†Œ ์‹œ๊ฐ„ : 00:00:01.063 | MAX TIME : 00:02:01.869 ---------------------------------------------------------------------------------- | ์ตœ์†Œ ๊ธฐ๊ฐ„| ์ตœ๋Œ€ ๊ธฐ๊ฐ„| ํ˜ธ์ถœ +-------------------+-----------------------------------+---------- | 00:00:01.063( 1063.830๋ฐ€๋ฆฌ์ดˆ.) | 00:00:13.144( 13144.445๋ฐ€๋ฆฌ์ดˆ) | 9 | 00:00:13.144( 13144.445๋ฐ€๋ฆฌ์ดˆ) | 00:00:25.225( 25225.060๋ฐ€๋ฆฌ์ดˆ) | 0 | 00:00:25.225( 25225.060๋ฐ€๋ฆฌ์ดˆ) | 00:00:37.305(37305.675๋ฐ€๋ฆฌ์ดˆ) | 0 | 00:00:37.305(37305.675๋ฐ€๋ฆฌ์ดˆ) | 00:00:49.386( 49386.290๋ฐ€๋ฆฌ์ดˆ.) | 0 | 00:00:49.386( 49386.290๋ฐ€๋ฆฌ์ดˆ.) | 00:01:01.466(61466.906๋ฐ€๋ฆฌ์ดˆ) | 0 | 00:01:01.466(61466.906๋ฐ€๋ฆฌ์ดˆ) | 00:01:13.547( 73547.521๋ฐ€๋ฆฌ์ดˆ.) | 0 | 00:01:13.547( 73547.521๋ฐ€๋ฆฌ์ดˆ.) | 00:01:25.628( 85628.136๋ฐ€๋ฆฌ์ดˆ.) | 0 | 00:01:25.628( 85628.136๋ฐ€๋ฆฌ์ดˆ.) | 00:01:37.708( 97708.751๋ฐ€๋ฆฌ์ดˆ.) | 4 | 00:01:37.708( 97708.751๋ฐ€๋ฆฌ์ดˆ.) | 00:01:49.789( 109789.366๋ฐ€๋ฆฌ์ดˆ.) | 2 | 00:01:49.789( 109789.366๋ฐ€๋ฆฌ์ดˆ.) | 00:02:01.869( 121869.981๋ฐ€๋ฆฌ์ดˆ.) | 0

์ดˆ๋‹น ์ฟผ๋ฆฌ๋ณ„ TOP10 ์Šค๋ƒ…์ƒท

์š”์ฒญ

--pg_qps.sql
--Calculate Query Per Second 
CREATE OR REPLACE FUNCTION pg_qps( pg_stat_history_id integer ) RETURNS double precision AS $$
DECLARE
 pg_stat_history_rec record ;
 prev_pg_stat_history_id integer ;
 prev_pg_stat_history_rec record;
 total_seconds double precision ;
 result double precision;
BEGIN 
  result = 0 ;
  
  SELECT *
  INTO pg_stat_history_rec
  FROM 
    pg_stat_history
  WHERE id = pg_stat_history_id ;

  IF pg_stat_history_rec.snapshot_timestamp IS NULL 
  THEN
    RAISE EXCEPTION 'ERROR - Not found pg_stat_history for id = %',pg_stat_history_id;
  END IF ;  
  
 --RAISE NOTICE 'pg_stat_history_id = % , snapshot_timestamp = %', pg_stat_history_id , 
 pg_stat_history_rec.snapshot_timestamp ;
  
  SELECT 
    MAX(id)   
  INTO
    prev_pg_stat_history_id
  FROM
    pg_stat_history
  WHERE 
    database_id = pg_stat_history_rec.database_id AND
	queryid IS NULL AND
	id < pg_stat_history_rec.id ;

  IF prev_pg_stat_history_id IS NULL 
  THEN
    RAISE NOTICE 'Not found previous pg_stat_history shapshot for id = %',pg_stat_history_id;
	RETURN NULL ;
  END IF;
  
  SELECT *
  INTO prev_pg_stat_history_rec
  FROM 
    pg_stat_history
  WHERE id = prev_pg_stat_history_id ;
  
  --RAISE NOTICE 'prev_pg_stat_history_id = % , prev_snapshot_timestamp = %', prev_pg_stat_history_id , prev_pg_stat_history_rec.snapshot_timestamp ;    

  total_seconds = extract(epoch from ( pg_stat_history_rec.snapshot_timestamp - prev_pg_stat_history_rec.snapshot_timestamp ));
  
  --RAISE NOTICE 'total_seconds = % ', total_seconds ;    
  
  --RAISE NOTICE 'calls = % ', pg_stat_history_rec.calls ;      
  
  IF total_seconds > 0 
  THEN
    result = pg_stat_history_rec.calls / total_seconds ;
  ELSE
   result = 0 ; 
  END IF;
   
 RETURN result ;
END
$$ LANGUAGE plpgsql;


SELECT 
  id , 
  snapshot_timestamp ,
  calls , 	
  total_time , 
  ( select pg_qps( id )) AS QPS ,
  blk_read_time ,
  blk_write_time
FROM 
  pg_stat_history
WHERE 
  queryid IS NULL AND 
  database_id = DATABASE_ID  AND
  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT AND
  ( select pg_qps( id )) IS NOT NULL 
ORDER BY 5 DESC 
LIMIT 10
|------------------------------------------------------------------------------------------------------------------------------ | QueryPerSeconds ์ˆซ์ž๋กœ ์ •๋ ฌ๋œ TOP10 ์Šค๋ƒ…์ƒท -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | #| ์Šค๋ƒ…์ƒท| ์Šค๋ƒ…์ƒทID| ํ˜ธ์ถœ| ์ด dbtime| QPS | I/O ์‹œ๊ฐ„ | ์ž…์ถœ๋ ฅ์‹œ๊ฐ„ % 1| 04.04.2019/20/04 4161:5758631| 00| 06| 30.513:390513.926:1573.396( 00๋ฐ€๋ฆฌ์ดˆ)| 00| 01.470:1470.110:376( 2๋ฐ€๋ฆฌ์ดˆ)| .04.04.2019 | 17| 00/4149/3529197 00:11| 48.830| 708830.618| 980.332:00:12( 47.834๋ฐ€๋ฆฌ์ดˆ)| 767834.052| 108.324:3:04.04.2019(16๋ฐ€๋ฆฌ์ดˆ)| 00 | 4143| 3525360/00/10 13.492:613492.351| 979.267| 00| 08:41.396:521396.555(84.988๋ฐ€๋ฆฌ์ดˆ)| 4| 04.04.2019:21:03(4163๋ฐ€๋ฆฌ์ดˆ)| 2781536 | 00| 03/06.470/186470.979 785.745:00| 00| 00.249| 249.865:134:5( 04.04.2019๋ฐ€๋ฆฌ์ดˆ)| 19| 03:4159:2890362(00๋ฐ€๋ฆฌ์ดˆ)| .03 | 16.784| 196784.755/776.979/00 00:01.441| 1441.386| 732| 6:04.04.2019:14( 00๋ฐ€๋ฆฌ์ดˆ)| 4137| 2397326:00:04( 43.033๋ฐ€๋ฆฌ์ดˆ)| .283033.854 | 665.924| 00/00/00.024 24.505:009| 7| 04.04.2019| 15:00:4139(2394416๋ฐ€๋ฆฌ์ดˆ)| 00| 04:51.435:291435.010(665.116๋ฐ€๋ฆฌ์ดˆ)| .00 | 00| 12.025/12025.895/4.126 8:04.04.2019| 13| 00| 4135:2373043:00( 04๋ฐ€๋ฆฌ์ดˆ)| 26.791| 266791.988:659.179:00(00๋ฐ€๋ฆฌ์ดˆ)| 00.064 | 64.261| 024/9/05.04.2019 01:03 | 4167| 4387191| 00:06:51.380( 411380.293๋ฐ€๋ฆฌ์ดˆ)| 609.332| 00:05:18.847(318847.407๋ฐ€๋ฆฌ์ดˆ)| .77.507 | 10| 04.04.2019/18/01 4157:1145596| 00| 01| 19.217:79217.372:313.004( 00๋ฐ€๋ฆฌ์ดˆ)| 00| 01.319:1319.676:1.666( XNUMX๋ฐ€๋ฆฌ์ดˆ)| XNUMX | XNUMX| XNUMX/XNUMX/XNUMX XNUMX:XNUMX| XNUMX| XNUMX| XNUMX:XNUMX:XNUMX( XNUMX๋ฐ€๋ฆฌ์ดˆ)| XNUMX| XNUMX:XNUMX:XNUMX( XNUMX๋ฐ€๋ฆฌ์ดˆ)| XNUMX

QueryPerSeconds ๋ฐ I/O ์‹œ๊ฐ„์„ ์‚ฌ์šฉํ•œ ์‹œ๊ฐ„๋ณ„ ์‹คํ–‰ ๊ธฐ๋ก

์ฃผ์žฅ

SELECT 
  id , 
  snapshot_timestamp ,
  calls , 	
  total_time , 
  ( select pg_qps( id )) AS QPS ,
  blk_read_time ,
  blk_write_time
FROM 
  pg_stat_history
WHERE 
  queryid IS NULL AND 
  database_id = DATABASE_ID  AND
  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT
ORDER BY 2
|-----------------------------------------------------------------------------------------------
| HOURLY EXECUTION HISTORY  WITH QueryPerSeconds and I/O Time
-----------------------------------------------------------------------------------------------------------------------------------------------
| QUERY PER SECOND HISTORY
|    #|          snapshot| snapshotID|      calls|                      total dbtime|        QPS|                          I/O time| I/O time %
+-----+------------------+-----------+-----------+----------------------------------+-----------+----------------------------------+-----------
|    1|  04.04.2019 11:00|       4131|       3747|  00:00:00.835(       835.374 ms.)|      1.041|  00:00:00.000(          .000 ms.)|       .000
|    2|  04.04.2019 12:00|       4133|    1002722|  00:01:52.419(    112419.376 ms.)|    278.534|  00:00:00.149(       149.105 ms.)|       .133
|    3|  04.04.2019 13:00|       4135|    2373043|  00:04:26.791(    266791.988 ms.)|    659.179|  00:00:00.064(        64.261 ms.)|       .024
|    4|  04.04.2019 14:00|       4137|    2397326|  00:04:43.033(    283033.854 ms.)|    665.924|  00:00:00.024(        24.505 ms.)|       .009
|    5|  04.04.2019 15:00|       4139|    2394416|  00:04:51.435(    291435.010 ms.)|    665.116|  00:00:12.025(     12025.895 ms.)|      4.126
|    6|  04.04.2019 16:00|       4143|    3525360|  00:10:13.492(    613492.351 ms.)|    979.267|  00:08:41.396(    521396.555 ms.)|     84.988
|    7|  04.04.2019 17:00|       4149|    3529197|  00:11:48.830(    708830.618 ms.)|    980.332|  00:12:47.834(    767834.052 ms.)|    108.324
|    8|  04.04.2019 18:01|       4157|    1145596|  00:01:19.217(     79217.372 ms.)|    313.004|  00:00:01.319(      1319.676 ms.)|      1.666
|    9|  04.04.2019 19:03|       4159|    2890362|  00:03:16.784(    196784.755 ms.)|    776.979|  00:00:01.441(      1441.386 ms.)|       .732
|   10|  04.04.2019 20:04|       4161|    5758631|  00:06:30.513(    390513.926 ms.)|   1573.396|  00:00:01.470(      1470.110 ms.)|       .376
|   11|  04.04.2019 21:03|       4163|    2781536|  00:03:06.470(    186470.979 ms.)|    785.745|  00:00:00.249(       249.865 ms.)|       .134
|   12|  04.04.2019 23:03|       4165|    1443155|  00:01:34.467(     94467.539 ms.)|    200.438|  00:00:00.015(        15.287 ms.)|       .016
|   13|  05.04.2019 01:03|       4167|    4387191|  00:06:51.380(    411380.293 ms.)|    609.332|  00:05:18.847(    318847.407 ms.)|     77.507
|   14|  05.04.2019 02:03|       4171|     189852|  00:00:10.989(     10989.899 ms.)|     52.737|  00:00:00.539(       539.110 ms.)|      4.906
|   15|  05.04.2019 03:01|       4173|       3627|  00:00:00.103(       103.000 ms.)|      1.042|  00:00:00.004(         4.131 ms.)|      4.010
|   16|  05.04.2019 04:00|       4175|       3627|  00:00:00.085(        85.235 ms.)|      1.025|  00:00:00.003(         3.811 ms.)|      4.471
|   17|  05.04.2019 05:00|       4177|       3747|  00:00:00.849(       849.454 ms.)|      1.041|  00:00:00.006(         6.124 ms.)|       .721
|   18|  05.04.2019 06:00|       4179|       3747|  00:00:00.849(       849.561 ms.)|      1.041|  00:00:00.000(          .051 ms.)|       .006
|   19|  05.04.2019 07:00|       4181|       3747|  00:00:00.839(       839.416 ms.)|      1.041|  00:00:00.000(          .062 ms.)|       .007
|   20|  05.04.2019 08:00|       4183|       3747|  00:00:00.846(       846.382 ms.)|      1.041|  00:00:00.000(          .007 ms.)|       .001
|   21|  05.04.2019 09:00|       4185|       3747|  00:00:00.855(       855.426 ms.)|      1.041|  00:00:00.000(          .065 ms.)|       .008
|   22|  05.04.2019 10:00|       4187|       3797|  00:01:40.150(    100150.165 ms.)|      1.055|  00:00:21.845(     21845.217 ms.)|     21.812

๋ชจ๋“  SQL ์„ ํƒ์˜ ํ…์ŠคํŠธ

์ฃผ์žฅ

SELECT 
  queryid , 
  query 
FROM 
  pg_stat_history
WHERE 
  queryid IS NOT NULL AND 
  database_id = DATABASE_ID  AND
  snapshot_timestamp BETWEEN BEGIN_TIMEPOINT AND END_TIMEPOINT
GROUP BY queryid , query

ํ•ฉ๊ณ„

๋ณด์‹œ๋‹ค์‹œํ”ผ ๋งค์šฐ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์›Œํฌ๋กœ๋“œ ๋ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒํƒœ์— ๋Œ€ํ•œ ๋งŽ์€ ์œ ์šฉํ•œ ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ  :์ฟผ๋ฆฌ์—์„œ queryid๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด ๋ณ„๋„์˜ ์š”์ฒญ์— ๋Œ€ํ•œ ๊ธฐ๋ก์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค(๊ณต๊ฐ„์„ ์ ˆ์•ฝํ•˜๊ธฐ ์œ„ํ•ด ๋ณ„๋„์˜ ์š”์ฒญ์— ๋Œ€ํ•œ ๋ณด๊ณ ์„œ๋Š” ์ƒ๋žต๋จ).

๋”ฐ๋ผ์„œ ์ฟผ๋ฆฌ ์„ฑ๋Šฅ์— ๋Œ€ํ•œ ํ†ต๊ณ„ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค.
์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„ "ํ†ต๊ณ„ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘"์ด ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ๋‹จ๊ณ„์ธ "์„ฑ๋Šฅ ์ง€ํ‘œ ๊ตฌ์„ฑ"์œผ๋กœ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
PostgreSQL ์ฟผ๋ฆฌ์˜ ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง. ํŒŒํŠธ 1 - ๋ณด๊ณ 

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ๋˜ ๋‹ค๋ฅธ ์ด์•ผ๊ธฐ์ž…๋‹ˆ๋‹ค.

๊ณ„์† ๋  ...

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€