๋ฐ๋
์
์ง๋ ๋ช ๋ฌ ๋์ ์ฐ๋ฆฌ๋ ๊ทธ์ ๋ํด
์ด์ ์ฌ์ฉํ ์ ์๋ ์๋ก์ด ๊ธฐ๋ฅ์ ๋ํด ์๋ ค๋๋ฆด ์ค๋น๊ฐ ๋์์ต๋๋ค.
๋ค์ํ ๊ณํ ํ์ ์ง์
์์ฒญ๊ณผ ํจ๊ป ๋ก๊ทธ์์ ๊ณํ
์ฝ์์์ ์ง์ ๋ค์ ํ๋ถํฐ ์์ํ์ฌ ์ ์ฒด ๋ธ๋ก์ ์ ํํฉ๋๋ค. ์ฟผ๋ฆฌ ํ ์คํธ, ๋ชจ๋ ์ ํ ๊ณต๋ฐฑ ํฌํจ:
Query Text: INSERT INTO dicquery_20200604 VALUES ($1.*) ON CONFLICT (query)
DO NOTHING;
Insert on dicquery_20200604 (cost=0.00..0.05 rows=1 width=52) (actual time=40.376..40.376 rows=0 loops=1)
Conflict Resolution: NOTHING
Conflict Arbiter Indexes: dicquery_20200604_pkey
Tuples Inserted: 1
Conflicting Tuples: 0
Buffers: shared hit=9 read=1 dirtied=1
-> Result (cost=0.00..0.05 rows=1 width=52) (actual time=0.001..0.001 rows=1 loops=1)
... ์๋ฌด๊ฒ๋ ๋ถ๋ฆฌํ์ง ์๊ณ ๊ณํ์ ํ๋์ ์ง์ ๋ณต์ฌํ ๋ชจ๋ ํญ๋ชฉ์ ๋์ง๋๋ค.
์ถ๋ ฅ์์ ๋ถํด ๊ณํ์ ๋ํ ๋ณด๋์ค๋ ์ป์ต๋๋ค. ์ปจํ
์คํธ ํญ, ์ฌ๊ธฐ์ ์ฐ๋ฆฌ์ ์์ฒญ์ ๋ชจ๋ ์๊ด์ผ๋ก ์ ์๋ฉ๋๋ค.
JSON ๋ฐ YAML
EXPLAIN (ANALYZE, BUFFERS, FORMAT JSON)
SELECT * FROM pg_class;
"[
{
"Plan": {
"Node Type": "Seq Scan",
"Parallel Aware": false,
"Relation Name": "pg_class",
"Alias": "pg_class",
"Startup Cost": 0.00,
"Total Cost": 1336.20,
"Plan Rows": 13804,
"Plan Width": 539,
"Actual Startup Time": 0.006,
"Actual Total Time": 1.838,
"Actual Rows": 10266,
"Actual Loops": 1,
"Shared Hit Blocks": 646,
"Shared Read Blocks": 0,
"Shared Dirtied Blocks": 0,
"Shared Written Blocks": 0,
"Local Hit Blocks": 0,
"Local Read Blocks": 0,
"Local Dirtied Blocks": 0,
"Local Written Blocks": 0,
"Temp Read Blocks": 0,
"Temp Written Blocks": 0
},
"Planning Time": 5.135,
"Triggers": [
],
"Execution Time": 2.389
}
]"
์ธ๋ถ ๋ฐ์ดํ๊ฐ ์๋๋ผ๋ pgAdmin์ด ๋ณต์ฌํ ๊ฒ์ฒ๋ผ ๋์ผํ ํ๋์ ๋ฃ์ง ์์๋ ์ถ๋ ฅ์ ์๋ฆ๋ต์ต๋๋ค.
๊ณ ๊ธ ์๊ฐํ
๊ณํ์๊ฐ / ์คํ์๊ฐ
์ด์ ์ฟผ๋ฆฌ๋ฅผ ์คํํ ๋ ์ถ๊ฐ ์๊ฐ์ด ์์๋ ์์น๋ฅผ ๋ ์ ํ์ธํ ์ ์์ต๋๋ค.
์ ์ถ๋ ฅ ํ์ด๋ฐ
๋๋๋ก ๋ฆฌ์์ค ์ธก๋ฉด์์ ๋๋ฌด ๋ง์ด ์ฝ๊ณ ์ฐ์ง ์์ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ์คํ ์๊ฐ์ด ์ด๋ค ์ด์ ๋ก ๋ถ์ ์ ํ๊ฒ ํฐ ๊ฒ ๊ฐ์ ์ํฉ์ ๋์ฒํด์ผ ํฉ๋๋ค.
์ฌ๊ธฐ์ ๋งํด์ผ ํฉ๋๋ค.์, ์๋ง๋ ๊ทธ ์๊ฐ ์๋ฒ์ ๋์คํฌ๊ฐ ๋๋ฌด ๊ณผ๋ถํ๋์ด์ ์ฝ๋ ๋ฐ ๋๋ฌด ์ค๋ ๊ฑธ๋ ธ์ ๊ฒ์ ๋๋ค!"ํ์ง๋ง ์ด์ฉ์ง ๊ทธ๋ค์ง ์ ํํ์ง ์์...
๊ทธ๋ฌ๋ ์ ๋์ ์ผ๋ก ์์ ์ ์ผ๋ก ๊ฒฐ์ ํ ์ ์์ต๋๋ค. ์ฌ์ค PG ์๋ฒ์ ๊ตฌ์ฑ ์ต์
์ค์๋ ๋ค์์ด ์์ต๋๋ค. track_io_timing
์๊ฐ ์ง์ I/O ์์ ์ ํ์ฑํํฉ๋๋ค. ์ด ์ค์ ์ ์ด์ ์ฒด์ ๊ฐ ํ์ฌ ์๊ฐ์ ์ง์์ ์ผ๋ก ์ฟผ๋ฆฌํด์ผ ํ๋ฏ๋ก ์ผ๋ถ ํ๋ซํผ์์ ์๋๊ฐ ํฌ๊ฒ ๋๋ ค์ง ์ ์์ผ๋ฏ๋ก ๊ธฐ๋ณธ์ ์ผ๋ก ๋นํ์ฑํ๋์ด ์์ต๋๋ค. pg_test_timing ์ ํธ๋ฆฌํฐ๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ซํผ์์ ํ์ด๋ฐ์ ์ค๋ฒํค๋๋ฅผ ์ถ์ ํ ์ ์์ต๋๋ค. I/O ํต๊ณ๋ pg_stat_database ๋ทฐ๋ฅผ ํตํด ์ป์ ์ ์์ผ๋ฉฐ, EXPLAIN ์ถ๋ ฅ์์(BUFFERS ๋งค๊ฐ๋ณ์๊ฐ ์ฌ์ฉ๋ ๊ฒฝ์ฐ) ๊ทธ๋ฆฌ๊ณ pg_stat_statements ๋ณด๊ธฐ๋ฅผ ํตํด.
์ด ์ต์ ์ ๋ก์ปฌ ์ธ์ ๋ด์์๋ ํ์ฑํํ ์ ์์ต๋๋ค.
SET track_io_timing = TRUE;
์ด์ ๊ฐ์ฅ ์ค์ํ ๋ถ๋ถ์ ์คํ ํธ๋ฆฌ์ ๋ชจ๋ ๋ณํ์ ๊ณ ๋ คํ์ฌ ์ด ๋ฐ์ดํฐ๋ฅผ ์ดํดํ๊ณ ํ์ํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ ๋ค๋ ๊ฒ์ ๋๋ค.
์ฌ๊ธฐ์์ ์ด ์คํ ์๊ฐ์ 0.790ms ์ค 0.718ms๋ ํ ํ์ด์ง์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๋ ๋ฐ, 0.044ms๋ ๋ฐ์ดํฐ๋ฅผ ์ฐ๋ ๋ฐ, ๊ทธ๋ฆฌ๊ณ 0.028ms๋ง์ด ๋ค๋ฅธ ๋ชจ๋ ์ ์ฉํ ํ๋์ ์ฌ์ฉ๋์์์ ์ ์ ์์ต๋๋ค!
PostgreSQL 13์ ๋ฏธ๋
์๋ก์ด ๊ธฐ๋ฅ์ ๋ํ ์ ์ฒด ๊ฐ์๋ ๋ค์์ ์ฐธ์กฐํ์ธ์.
๊ณํ ๋ฒํผ
์ค์ผ์ค๋ฌ์ ํ ๋น๋ ์์์ ๋ํ ๊ณ์ฐ์ pg_stat_statements์ ๊ด๋ จ๋์ง ์์ ๋ค๋ฅธ ํจ์น์ ๋ฐ์๋ฉ๋๋ค. BUFFERS ์ต์ ์ด ์๋ EXPLAIN์ ๊ณํ ๋จ๊ณ์์ ์ฌ์ฉ๋ ๋ฒํผ ์๋ฅผ ๋ณด๊ณ ํฉ๋๋ค.
Seq Scan on pg_class (actual rows=386 loops=1) Buffers: shared hit=9 read=4 Planning Time: 0.782 ms Buffers: shared hit=103 read=11 Execution Time: 0.219 ms
์ฆ๋ถ ์ ๋ ฌ
๋ง์ ํค(k1, k2, k3โฆ)๋ก ์ ๋ ฌํด์ผ ํ๋ ๊ฒฝ์ฐ ํ๋๋๋ ์ด์ ๋ฐ์ดํฐ๊ฐ ์ด๋ฏธ ์ฌ๋ฌ ์ฒซ ๋ฒ์งธ ํค(์: k1 ๋ฐ k2)๋ก ์ ๋ ฌ๋์ด ์์์ ์ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์๋ก ์ฌ์ ๋ ฌํ ์๋ ์๊ณ k1๊ณผ k2์ ๊ฐ์ ๊ฐ์ผ๋ก ์ฐ์์ ์ธ ๊ทธ๋ฃน์ผ๋ก ๋๋๊ณ k3 ํค๋ก "์ฌ์ ๋ ฌ"ํฉ๋๋ค.
๋ฐ๋ผ์ ์ ์ฒด ์ ๋ ฌ์ ๋ ์์ ํฌ๊ธฐ์ ์ฌ๋ฌ ์ฐ์ ์ ๋ ฌ๋ก ๋๋ฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ํ์ํ ๋ฉ๋ชจ๋ฆฌ ์์ด ์ค์ด๋ค๊ณ ๋ชจ๋ ์ ๋ ฌ์ด ์๋ฃ๋๊ธฐ ์ ์ ์ฒซ ๋ฒ์งธ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ ์๋ ์์ต๋๋ค.
Incremental Sort (actual rows=2949857 loops=1) Sort Key: ticket_no, passenger_id Presorted Key: ticket_no Full-sort Groups: 92184 Sort Method: quicksort Memory: avg=31kB peak=31kB -> Index Scan using tickets_pkey on tickets (actual rows=2949857 loops=1) Planning Time: 2.137 ms Execution Time: 2230.019 ms
UI/UX ๊ฐ์
์คํฌ๋ฆฐ์ท์ ์ด๋์๋ ์์ต๋๋ค!
์ด์ ๊ฐ ํญ์์ ํญ์ ์คํฌ๋ฆฐ์ท์ ํด๋ฆฝ๋ณด๋๋ก ๊ฐ์ ธ์ค๊ธฐ ํญ์ ์ ์ฒด ๋๋น์ ๊น์ด - "์๋ ฅ" ์ค๋ฅธ์ชฝ ์๋จ:
์ค์ ๋ก ์ด ์ถํ๋ฌผ์ ์ค๋ฆฐ ๋๋ถ๋ถ์ ์ฌ์ง์ ์ด๋ฐ ๋ฐฉ์์ผ๋ก ์
์ํ์ต๋๋ค.
๋ ธ๋์ ๋ํ ๊ถ์ฅ ์ฌํญ
๋ ๋ง์ ๊ฒ์ด ์์ ๋ฟ๋ง ์๋๋ผ ๊ฐ๊ฐ์ ๋ํด ํ ์ ์์ต๋๋ค.
์์นด์ด๋ธ์์ ์ ๊ฑฐ
์ด๋ค ์ฌ๋๋ค์ ๋ฅ๋ ฅ์ ์๊ตฌํ์ต๋๋ค. "์ ๋" ์ญ์ ์์นด์ด๋ธ์ ๊ฒ์๋์ง ์์ ๊ณํ๋ ํด๋น ์์ด์ฝ์ ํด๋ฆญํ์ญ์์ค.
๊ธ์, ์ฐ๋ฆฌ๊ฐ ๊ฐ์ง๊ณ ์๋ค๋ ๊ฒ์ ์์ง ๋ง์
์ถ์ฒ : habr.com