Study Repository

[DB] PK๊ฐ€ ์žˆ๋Š”๋ฐ ์™œ ์ฟผ๋ฆฌ๊ฐ€ ๋А๋ฆด๊นŒ - ๋ณตํ•ฉ์ธ๋ฑ์Šค ์„ ๋‘์ปฌ๋Ÿผ

by Dongwoongkim

์ธ๋ฑ์Šค ์„ค๊ณ„๋Š” ๋‹จ์ˆœํžˆ "์–ด๋–ค ์ปฌ๋Ÿผ์„ ํฌํ•จ์‹œํ‚ฌ๊นŒ"์˜ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋‹ค. ์–ด๋–ค ์ˆœ์„œ๋กœ ์ •๋ ฌํ• ๊นŒ๊ฐ€ ๋” ์ค‘์š”ํ•˜๋‹ค. ๋ณตํ•ฉ PK๊ฐ€ ์žกํ˜€์žˆ๋‹ค๊ณ  ํ•ด์„œ ๊ทธ ์•ˆ์— ๋“ค์–ด์žˆ๋Š” ์ปฌ๋Ÿผ์œผ๋กœ ์กฐ๊ฑด์„ ๊ฑธ๊ธฐ๋งŒ ํ•˜๋ฉด ๋นจ๋ผ์งˆ ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ, ๊ทธ๊ฒŒ ์•„๋‹ˆ์—ˆ๋‹ค.

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” PK๊ฐ€ ์žˆ์Œ์—๋„ ์ฟผ๋ฆฌ๊ฐ€ ํ’€์Šค์บ”์— ๊ฐ€๊น๊ฒŒ ๋™์ž‘ํ–ˆ๋˜ ์‚ฌ๋ก€๋ฅผ ์ •๋ฆฌํ•˜๊ณ , ๋ณตํ•ฉ B-tree ์ธ๋ฑ์Šค์˜ ์„ ๋‘ ์ปฌ๋Ÿผ(leading column) ์›๋ฆฌ๋ฅผ ์งš์–ด๋ณธ๋‹ค.


0. ๋ฌธ์ œ ์ƒํ™ฉ

๋ฆฌํฌํŒ… ํ™”๋ฉด ํ•˜๋‚˜๊ฐ€ ๋А๋ ธ๋‹ค. ์˜ˆ์‹œ๋กœ ์ง€์ ๋ณ„·์—ฐ์›”๋ณ„ ๋งค์ถœ ํ†ต๊ณ„๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ํŽ˜์ด์ง€์ธ๋ฐ, ํ•œ ์ง€์  ๋ฐ์ดํ„ฐ๊ฐ€ 5์ฒœ ๊ฑด ์ˆ˜์ค€์ด ๋˜๋ฉด ์‘๋‹ต์ด 200ms ์ด์ƒ์œผ๋กœ ๋Š˜์–ด์กŒ๋‹ค.

ํ…Œ์ด๋ธ” ๊ตฌ์กฐ๋Š” ๋Œ€๋žต ์ด๋ ‡๋‹ค(์˜ˆ์‹œ).

CREATE TABLE analytics.sales_monthly_stats (
    sales_id    bigint      NOT NULL,
    year_mm     varchar(6)  NOT NULL,   -- '202403' ํ˜•์‹
    branch_cd   varchar(10) NOT NULL,
    amount      numeric(18,2),
    -- ... ์ปฌ๋Ÿผ ๋‹ค์ˆ˜
    CONSTRAINT sales_monthly_stats_pk
        PRIMARY KEY (sales_id, year_mm, branch_cd)
);

 

๊ฐ€์žฅ ๋งŽ์ด ํ˜ธ์ถœ๋˜๋Š” ์ฟผ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

SELECT count(*)
FROM analytics.sales_monthly_stats
WHERE branch_cd = 'B001'
  AND year_mm   = '202403';

 

branch_cd๋„ year_mm๋„ PK ์•ˆ์— ํฌํ•จ๋˜์–ด ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ ์ธ๋ฑ์Šค๋ฅผ ์ž˜ ํƒ€๊ณ  ์žˆ์„ ๊ฑฐ๋ผ๊ณ  ์ฒ˜์Œ์—” ๊ทธ๋ ‡๊ฒŒ ์ƒ๊ฐํ–ˆ๋‹ค.


1. 1์ฐจ ์ง„๋‹จ - "PK๊ฐ€ ์žˆ์œผ๋‹ˆ๊นŒ ๋น ๋ฅด๊ฒ ์ง€"

์ฒ˜์Œ์—๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ชฝ์„ ์˜์‹ฌํ–ˆ๋‹ค. JOIN์„ ์ค„์ด๊ณ , N+1์„ ํ’€๊ณ , ํด๋ผ์ด์–ธํŠธ ๋ Œ๋”๋ง ์ฝ”๋“œ๋„ ์†๋ดค๋‹ค. ๊ทธ๋Ÿฐ๋ฐ๋„ ์ฟผ๋ฆฌ ๋‹จ๋…์œผ๋กœ 200ms๊ฐ€ ๋‚˜์™”๋‹ค.

์ฟผ๋ฆฌ๋ฅผ ์ง์ ‘ ์˜์‹ฌํ•ด๋ด๋„ WHERE ์กฐ๊ฑด์˜ ๋‘ ์ปฌ๋Ÿผ์ด ๋ชจ๋‘ PK ์•ˆ์— ์žˆ์œผ๋‹ˆ ํ’€์Šค์บ”์€ ์•„๋‹ ๊ฒƒ ๊ฐ™์•˜๋‹ค. ํ™•์ธ ์ฐจ EXPLAIN์„ ๋–  ๋ดค๋‹ค.

EXPLAIN (ANALYZE, BUFFERS)
SELECT count(*)
FROM analytics.sales_monthly_stats
WHERE branch_cd = 'B001'
  AND year_mm   = '202403';
Aggregate  (cost=64614.63..64614.64 rows=1 width=8)
           (actual time=217.564..217.566 rows=1 loops=1)
  Buffers: shared hit=19054
  ->  Index Only Scan using sales_monthly_stats_pk on sales_monthly_stats
        (cost=0.43..64613.38 rows=497 width=0)
        (actual time=176.794..217.527 rows=438 loops=1)
        Index Cond: ((year_mm = '202403'::text) AND (branch_cd = 'B001'::text))
        Heap Fetches: 438
        Buffers: shared hit=19054
Planning Time: 0.248 ms
Execution Time: 217.621 ms

Index Only Scan using sales_monthly_stats_pk ๋ผ๋Š” ์ค„์ด ๋ณด์ธ๋‹ค. ์ธ๋ฑ์Šค๋ฅผ ํƒ€๊ธด ํƒ”๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋ช‡ ๊ฐ€์ง€ ์ˆซ์ž๊ฐ€ ์ด์ƒํ–ˆ๋‹ค.

438ํ–‰์„ ๋Œ๋ ค์ฃผ๋Š”๋ฐ Buffers๊ฐ€ 19,054
์˜ˆ์ƒ ๋น„์šฉ๋„ cost=64613

 

PostgreSQL์˜ ํ•œ buffer๋Š” 8KB์ด๋‹ค. 19,054 × 8KB ≈ 149MB. ๊ฒฐ๊ตญ 438ํ–‰์„ ์œ„ํ•ด ์•ฝ 149MB ๋ถ„๋Ÿ‰์˜ ์ธ๋ฑ์Šค ํŽ˜์ด์ง€๋ฅผ ์ฝ์—ˆ๋‹ค๋Š” ๋œป์ด๋‹ค. ํ•œ ํ–‰๋‹น ์•ฝ 43๊ฐœ buffer์ด๋‹ค. ๊ฒฐ๊ณผ ํ–‰์ˆ˜์— ๋น„ํ•ด ์••๋„์ ์œผ๋กœ ๋งŽ๋‹ค. ์ธ๋ฑ์Šค๋ฅผ ํƒ€๊ณ ๋Š” ์žˆ๋Š”๋ฐ, ์ •์ƒ์ ์œผ๋กœ ํ™œ์šฉ๋˜๊ณ  ์žˆ์ง€๋Š” ์•Š๋‹ค๋Š” ์‹ ํ˜ธ์ด๋‹ค.


2. 2์ฐจ ๋ถ„์„ - ์™œ PK๊ฐ€ ์•ˆ ํ†ตํ•˜๋Š”๊ฐ€

์—ฌ๊ธฐ์„œ ์ž ์‹œ ๋ง‰ํ˜”๋‹ค. "์ธ๋ฑ์Šค๋ฅผ ํƒ”๋‹ค๊ณ  ๋‚˜์˜ค๋Š”๋ฐ ์™œ ํ’€์Šค์บ”์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜์ง€?"

ํ•ต์‹ฌ์€ B-tree ๋ณตํ•ฉ ์ธ๋ฑ์Šค๊ฐ€ ์„ ๋‘ ์ปฌ๋Ÿผ๋ถ€ํ„ฐ ์ •๋ ฌ๋˜์–ด ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค. ์•Œ๊ณ  ์žˆ๋Š” ์‚ฌ์‹ค์ด์ง€๋งŒ, "PK ์•ˆ์— ์ปฌ๋Ÿผ์ด ์žˆ์œผ๋ฉด ๊ทธ๋ž˜๋„ ํ™œ์šฉ๋œ๋‹ค" ๋ผ๋Š” ์ง๊ด€๊ณผ ์ถฉ๋Œํ•˜๋ฉด์„œ ์ž ๊น ํ—ท๊ฐˆ๋ ธ๋‹ค.

 

โ‘  ๋ณตํ•ฉ ์ธ๋ฑ์Šค๋Š” ๋‹ค๋‹จ ์ •๋ ฌ๋œ ์ฑ…

๋ณตํ•ฉ ์ธ๋ฑ์Šค (์„ฑ, ์ด๋ฆ„, ์ค‘๊ฐ„์ด๋ฆ„) ์ด๋ผ๋ฉด ์ฑ…์€ ์•„๋ž˜ ์ˆœ์„œ๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ๋‹ค.

 

ํŽ˜์ด์ง€ ์„ฑ ์ด๋ฆ„ ์ค‘๊ฐ„์ด๋ฆ„
1 ๊ฐ• ์‚ฌ๋žŒ -
2 ๊ฐ• ํœด๋จผ -
3 ๊น€ ํ”ผํ”Œ -
4 ๊น€ ๋™์›… -
5 ๊น€ ๋™์›… ์˜
... ... ... ...
  • "๊น€ ๋™์›…" ๊ฒ€์ƒ‰ → ์„ฑ → ์ด๋ฆ„ ์ˆœ์œผ๋กœ ๋”ฐ๋ผ๊ฐ€๋ฉด ํ•œ ๋ฒˆ์— ๋„๋‹ฌํ•œ๋‹ค.
  • "๋™์›…" (์ด๋ฆ„)๋งŒ์œผ๋กœ ๊ฒ€์ƒ‰ → ์ฑ… ์ „์ฒด๋ฅผ 1ํŽ˜์ด์ง€๋ถ€ํ„ฐ ๋๊นŒ์ง€ ํ›‘์–ด์•ผ ํ•œ๋‹ค.
  • "๋™์›… ์˜" (์ด๋ฆ„+์ค‘๊ฐ„์ด๋ฆ„)๋งŒ์œผ๋กœ ๊ฒ€์ƒ‰ → ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ’€์Šค์บ”์ด๋‹ค.

์„ ๋‘ ์ปฌ๋Ÿผ์ด WHERE ์ ˆ์— ์—†์œผ๋ฉด ์ธ๋ฑ์Šค์˜ "์ •๋ ฌ ์ด์ "์„ ์“ธ ์ˆ˜ ์—†๋‹ค. ๋‚˜๋จธ์ง€ ์ปฌ๋Ÿผ์ด ์ธ๋ฑ์Šค์— ํฌํ•จ๋˜์–ด ์žˆ๋”๋ผ๋„ ๊ฒฐ๊ตญ ์ฑ… ์ „์ฒด๋ฅผ ํŽผ์ณ๋†“๊ณ  ํ•„ํ„ฐ๋งํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค.

 

โ‘ก ์šฐ๋ฆฌ ์ฟผ๋ฆฌ์— ๋Œ€์ž…

PK ์„ ๋‘: sales_id   ← WHERE ์ ˆ์— ์—†์Œ
WHERE  : branch_cd, year_mm   ← PK์˜ 2,3๋ฒˆ์งธ ์ปฌ๋Ÿผ

sales_id ์กฐ๊ฑด์ด ์—†์œผ๋‹ˆ ์˜ตํ‹ฐ๋งˆ์ด์ €๋Š” ์ธ๋ฑ์Šค ์ „์ฒด๋ฅผ ํ›‘์œผ๋ฉด์„œ year_mm/branch_cd๋กœ ํ•„ํ„ฐ๋ง๋งŒ ํ•œ๋‹ค. "Index Only Scan" ์ด๋ผ๋Š” ์ด๋ฆ„์ด ๋ถ™๊ธด ํ•˜์ง€๋งŒ, ์‹ค์ƒ์€ ์ธ๋ฑ์Šค ํ’€์Šค์บ” + ํ•„ํ„ฐ์ด๋‹ค. ์ด๊ฒƒ๋•Œ๋ฌธ์— 19,054 buffers๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒƒ์ด์—ˆ๋”ฐ.

 


3. ํ•ด๊ฒฐ ๋ฐฉ์•ˆ

์„ ๋‘ ์ปฌ๋Ÿผ์ด branch_cd์ธ ๋ณด์กฐ ์ธ๋ฑ์Šค๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

CREATE INDEX ix_sales_monthly_stats__branch_yearmm
  ON analytics.sales_monthly_stats (branch_cd, year_mm);

ANALYZE analytics.sales_monthly_stats;   -- ์˜ตํ‹ฐ๋งˆ์ด์ € ํ†ต๊ณ„ ๊ฐฑ์‹ 

์šด์˜ ํ™˜๊ฒฝ์ด๋ผ๋ฉด ๋ฝ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•œ๋‹ค.

CREATE INDEX CONCURRENTLY ix_sales_monthly_stats__branch_yearmm
  ON analytics.sales_monthly_stats (branch_cd, year_mm);

CONCURRENTLY ์˜ต์…˜์€ ํ…Œ์ด๋ธ” ์“ฐ๊ธฐ๋ฅผ ๋ง‰์ง€ ์•Š๊ณ  ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ๋Œ€์‹  ์ผ๋ฐ˜ ์ƒ์„ฑ๋ณด๋‹ค ์‹œ๊ฐ„์ด ๋” ๊ฑธ๋ฆฌ๊ณ , ์ค‘๊ฐ„์— ์‹คํŒจํ•˜๋ฉด INVALID ์ƒํƒœ์˜ ์ธ๋ฑ์Šค๊ฐ€ ๋‚จ์„ ์ˆ˜ ์žˆ์–ด ํ›„์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

 

โ‘  Before / After ๋น„๊ต

๋‹ค์‹œ EXPLAIN์„ ๋– ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

Index Scan using ix_sales_monthly_stats__branch_yearmm on sales_monthly_stats
  (cost=0.43..2.65 rows=1 width=225)
  Index Cond: (((branch_cd)::text = 'B001'::text)
           AND ((year_mm)::text = '202403'::text))
Execution Time: 1.4 ms

Index Only Scan using sales_monthly_stats_pk (cost 64,613) ์—์„œ Index Scan using ix_sales_monthly_stats__branch_yearmm (cost 2.65) ๋กœ ๋ฐ”๋€Œ์—ˆ๋‹ค. ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์ƒˆ ์ธ๋ฑ์Šค๋ฅผ ๊ณจ๋ž๋‹ค๋Š” ๋œป์ด๋‹ค.

์ง€ํ‘œ Before (PK๋งŒ) After (์‹ ๊ทœ ์ธ๋ฑ์Šค)

Plan Index Only Scan using PK Index Scan using ์‹ ๊ทœ ์ธ๋ฑ์Šค
Cost 64,613 2.65
Buffers 19,054 23
Execution Time 217 ms 1.4 ms

 

์‘๋‹ต์‹œ๊ฐ„์€ ์•ฝ 150๋ฐฐ, ๋ฉ”๋ชจ๋ฆฌ IO๋Š” 800๋ฐฐ ๊ฐ€๊นŒ์ด ์ค„์—ˆ๋‹ค. cost ์ถ”์ •์น˜๋„ ์•ฝ 24,000๋ฐฐ ์ฐจ์ด๊ฐ€ ๋‚œ๋‹ค.

 

โ‘ก PK๋Š” ๊ทธ๋Œ€๋กœ ๋‘์–ด๋„ ๋˜๋Š”๊ฐ€

๋œ๋‹ค. ๋‘˜์€ ์—ญํ• ์ด ๋‹ค๋ฅด๋‹ค.

์ธ๋ฑ์Šค ์„ ๋‘์ปฌ๋Ÿผ ์“ฐ์ž„์ƒˆ
PK (sales_id, year_mm, branch_cd) sales_id WHERE sales_id = ? ๋‹จ๊ฑด ์กฐํšŒ/UPDATE/DELETE
์‹ ๊ทœ (branch_cd, year_mm) branch_cd WHERE branch_cd = ? AND year_mm = ? ๋ชฉ๋ก ์กฐํšŒ

 

PK๋ฅผ ๋–ผ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ์ถ”๊ฐ€๋งŒ ํ•˜๋ฏ€๋กœ ๊ธฐ์กด ๋™์ž‘์—๋Š” ์˜ํ–ฅ์ด ์—†๋‹ค. ๋Œ€์‹  ์“ฐ๊ธฐ ๋น„์šฉ์€ ์•ฝ๊ฐ„ ๋Š˜์–ด๋‚œ๋‹ค. INSERT/UPDATE ์‹œ ๊ฐฑ์‹ ํ•ด์•ผ ํ•  ์ธ๋ฑ์Šค๊ฐ€ ํ•˜๋‚˜ ๋” ์ƒ๊ธฐ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 2์ปฌ๋Ÿผ์งœ๋ฆฌ ์ผ๋ฐ˜ B-tree ์ธ๋ฑ์Šค๋ผ ๋น„์šฉ์€ ๋ฏธ๋ฏธํ•˜์ง€๋งŒ, ์“ฐ๊ธฐ๊ฐ€ ๋งค์šฐ ์žฆ์€ ํ…Œ์ด๋ธ”์ด๋ผ๋ฉด ์ธก์ •ํ•ด๋ณด๊ณ  ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•˜๋‹ค.

 


4. ๋ฌธ์ œ ์ •๋ฆฌ

โ‘  "PK๊ฐ€ ์žˆ์œผ๋‹ˆ๊นŒ ๋น ๋ฅผ ๊ฒƒ"์ด๋ผ๋Š” ๊ฐ€์ •์œผ๋กœ ์‹œ๊ฐ„์„ ๋‚ญ๋น„ํ–ˆ๋‹ค

PK๋Š” ๋‹จ์ˆœํžˆ "์žˆ๋‹ค/์—†๋‹ค" ์˜ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ ์„ ๋‘ ์ปฌ๋Ÿผ์ด WHERE ์กฐ๊ฑด๊ณผ ๋งž๋А๋ƒ ์˜ ๋ฌธ์ œ์ด๋‹ค. PK ์•ˆ์— ๋“ค์–ด์žˆ๋Š” ์ปฌ๋Ÿผ์ด๋ผ๋„ ๊ทธ๊ฒƒ์ด ์ธ๋ฑ์Šค์˜ ์ฒซ ๋ฒˆ์งธ ์ปฌ๋Ÿผ์ด ์•„๋‹ˆ๋ผ๋ฉด ์ •๋ ฌ ์ด์ ์„ ํ™œ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

 

โ‘ก EXPLAIN์— Index Only Scan ์ด ๋–ด๋‹ค๊ณ  ์•ˆ์‹ฌํ–ˆ๋‹ค

๊ณ„ํš ์ข…๋ฅ˜๋งŒ ๋ณด์ง€ ๋ง๊ณ  Buffers, Heap Fetches, ๊ฒฐ๊ณผ ํ–‰์ˆ˜๋ฅผ ๊ฐ™์ด ๋ด์•ผ ํ•œ๋‹ค. ๊ฒฐ๊ณผ ํ–‰์ˆ˜์— ๋น„ํ•ด Buffers๊ฐ€ ๋น„์ •์ƒ์ ์œผ๋กœ ํฌ๋ฉด ์ธ๋ฑ์Šค๊ฐ€ ์ •๋ ฌ ์ด์  ์—†์ด ์“ฐ์ด๊ณ  ์žˆ๋‹ค๋Š” ์‹ ํ˜ธ์ด๋‹ค. ํ–‰๋‹น 10 buffer ์ด์ƒ ์ฝ๊ณ  ์žˆ๋‹ค๋ฉด ํ•œ ๋ฒˆ ์˜์‹ฌํ•ด๋ณผ ๋งŒ ํ•˜๋‹ค.

 

โ‘ข ์ปฌ๋Ÿผ ์ˆœ์„œ๋ฅผ ๊นŠ์ด ์ƒ๊ฐํ•˜์ง€ ์•Š์•˜๋‹ค

๋ณตํ•ฉ ์ธ๋ฑ์Šค๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค ๋•Œ "์–ด๋–ค ์ปฌ๋Ÿผ์„ ํฌํ•จ์‹œํ‚ฌ๊นŒ" ๋งŒํผ "์–ด๋–ค ์ˆœ์„œ๋กœ ์ •๋ ฌํ• ๊นŒ" ๊ฐ€ ์ค‘์š”ํ•˜๋‹ค. ๊ธฐ์ค€์€ ๋‹จ์ˆœํ•˜๋‹ค. ์ž์ฃผ ์“ฐ๋Š” WHERE ์กฐ๊ฑด์˜ ์ปฌ๋Ÿผ์„ ์„ ๋‘๋กœ ๋‘”๋‹ค. ๋“ฑํ˜ธ ์กฐ๊ฑด๊ณผ ๋ฒ”์œ„ ์กฐ๊ฑด์ด ์„ž์—ฌ์žˆ๋‹ค๋ฉด ๋“ฑํ˜ธ ์กฐ๊ฑด์„ ๋จผ์ € ๋‘”๋‹ค.

 


5. ๊ฒฐ๋ก  ์ •๋ฆฌ

๋ณตํ•ฉ ์ธ๋ฑ์Šค๋Š” ์ •๋ ฌ๋œ ์ฑ…์ด๋‹ค. ์„ ๋‘ ์ปฌ๋Ÿผ์ด WHERE ์ ˆ์— ์—†์œผ๋ฉด ์ฑ… ์ „์ฒด๋ฅผ ํŽผ์นœ๋‹ค. "Index Only Scan" ์ด๋ผ๋Š” ๋‹จ์–ด์— ์•ˆ์‹ฌํ•˜์ง€ ๋ง๊ณ , Buffers ÷ ๊ฒฐ๊ณผ ํ–‰์ˆ˜๋ฅผ ํ•œ๋ฒˆ ๊ณ„์‚ฐํ•ด๋ณด๋ฉด ์ธ๋ฑ์Šค๊ฐ€ ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ๋น ๋ฅด๊ฒŒ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค.

 

ํ•ด๊ฒฐ์ฑ… ์ž์ฒด๋Š” ๋‹จ์ˆœํ•˜๋‹ค. WHERE ์กฐ๊ฑด์— ๋งž๋Š” ์ปฌ๋Ÿผ ์ˆœ์„œ๋กœ ๋ณด์กฐ ์ธ๋ฑ์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค. PK์™€ ์ถฉ๋Œํ•˜์ง€๋„ ์•Š๋Š”๋‹ค. PK๋Š” ๋‹จ๊ฑด ์‹๋ณ„, ๋ณด์กฐ ์ธ๋ฑ์Šค๋Š” ๋ชฉ๋ก ์กฐํšŒ๋กœ ์—ญํ• ์ด ๋‹ค๋ฅด๋‹ค. ์ž‘์€ ํ…Œ์ด๋ธ”์—์„œ๋Š” ์ž˜ ๋“œ๋Ÿฌ๋‚˜์ง€ ์•Š๋‹ค๊ฐ€ ๋ฐ์ดํ„ฐ๊ฐ€ ์Œ“์ด๋ฉด ์–ด๋А ์ˆœ๊ฐ„ ํ„ฐ์ง€๋Š” ์ข…๋ฅ˜์˜ ๋ฌธ์ œ์ด๊ธฐ ๋•Œ๋ฌธ์—, ํ•œ ๋ฒˆ ๊ฒช๊ณ  ๋‚˜๋ฉด ๋‹ค์Œ๋ถ€ํ„ฐ๋Š” ์˜์‹ฌ 1์ˆœ์œ„์— ๋‘˜ ์ˆ˜ ์žˆ๋‹ค.

 

๊ฒฐ๊ตญ ์ธ๋ฑ์Šค๋ฅผ ๋Š˜๋ฆฌ๋ฉด ์ฝ๊ธฐ๋Š” ๋นจ๋ผ์ง€์ง€๋งŒ ์“ฐ๊ธฐ ๋น„์šฉ์€ ๋Š˜์–ด๋‚œ๋‹ค. ๋ชจ๋“  ์กฐํ•ฉ์— ์ธ๋ฑ์Šค๋ฅผ ๊ฑฐ๋Š” ๊ฒƒ์ด ์ •๋‹ต์€ ์•„๋‹ˆ๊ณ , ์‹ค์ œ ์ฟผ๋ฆฌ ํŒจํ„ด๊ณผ ํ…Œ์ด๋ธ”์˜ ์ฝ๊ธฐ/์“ฐ๊ธฐ ๋น„์œจ์„ ๊ณ ๋ คํ•ด ํ•„์š”ํ•œ ์ธ๋ฑ์Šค๋งŒ ์„ ๋ณ„ํ•ด ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ด๋‹ค.

 

'๐Ÿ“— CS > Database' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

ํŠธ๋žœ์žญ์…˜(Transaction)์ด๋ž€?  (0) 2023.04.04

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

Study Repository

Dongwoongkim

ํ™œ๋™ํ•˜๊ธฐ