Post

๐Ÿ˜ PostgreSQL ๊ธฐ๋ณธ โ…ง - ์ ์‹œ์ ์†Œ์— ์•Œ๋งž์€ ํ…Œ์ด๋ธ” ๋””์ž์ธ

๐Ÿ˜ PostgreSQL ๊ธฐ๋ณธ โ…ง - ์ ์‹œ์ ์†Œ์— ์•Œ๋งž์€ ํ…Œ์ด๋ธ” ๋””์ž์ธ

๐Ÿ“™ ใ€Ž์‹ค์šฉ SQLใ€์„ ์ฝ๊ณ  ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜ ๋”ฐ๋ฅด๊ธฐ

  • ์นด๋ฉœ ์ผ€์ด์Šค, ํŒŒ์Šค์นผ ์ผ€์ด์Šค, ์Šค๋„ค์ดํฌ ์ผ€์ด์Šค ๋“ฑ ์–ด๋–ค ๊ทœ์น™์„ ์„ ํ˜ธํ•˜๋“  ์Šคํƒ€์ผ์„ ์„ ํƒํ•˜๊ณ  ์ผ๊ด€๋˜๊ฒŒ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.
  • ๋ฌด์—‡๋ณด๋‹ค ์†ํ•œ ์กฐ์ง์˜ ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ๋‚˜ ์ปจ๋ฒค์…˜์— ๋”ฐ๋ฅด๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ค‘์š”ํ•˜๋‹ค.

์ธ์šฉ ์‹๋ณ„์ž๋กœ ๋Œ€์†Œ๋ฌธ์ž ํ˜ผํ•ฉ ์‚ฌ์šฉํ•˜๊ธฐ

1
2
3
CREATE TABLE "Customers" (
	-- ...
)
  • PostgreSQL์€ ๋Œ€์†Œ๋ฌธ์ž์— ๊ด€๊ณ„ ์—†์ด ์‹๋ณ„์ž๋ฅผ ์†Œ๋ฌธ์ž๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.
  • ๋งŒ์•ฝ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ํ˜ผํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋ฉด ํฐ๋”ฐ์˜ดํ‘œ๋กœ ๊ฐ์‹ธ์•ผ ํ•œ๋‹ค.

์ธ์šฉ ์‹๋ณ„์ž์˜ ํ•จ์ •

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

์ด๋ฆ„ ์ง€์ • ์‹๋ณ„์ž ๊ฐ€์ด๋“œ๋ผ์ธ

  1. ์Šค๋„ค์ดํฌ ์ผ€์ด์Šค ์‚ฌ์šฉ
  2. ์ด๋ฆ„์„ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ์ง“๊ณ  ์•”ํ˜ธ ๊ฐ™์€ ์•ฝ์–ด ์‚ฌ์šฉ ์ง€์–‘
  3. ํ…Œ์ด๋ธ” ์ด๋ฆ„์œผ๋กœ๋Š” ๋ณต์ˆ˜ํ˜• ์‚ฌ์šฉ
    • CSV ํŒŒ์ผ์˜ ์ด๋ฆ„์„ ๋ณด์กดํ•˜๊ธฐ ์œ„ํ•ด ํ•ด๋‹น ํŒŒ์ผ์„ ํ…Œ์ด๋ธ” ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ์˜ˆ์™ธ ์ƒํ™ฉ์œผ๋กœ ๊ฐ„์ฃผํ•œ๋‹ค.
  4. ๊ธธ์ด๋ฅผ ์‹ ๊ฒฝ ์“ฐ๊ธฐ
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ๋”ฐ๋ผ ์‹๋ณ„์ž ์ด๋ฆ„์— ํ—ˆ์šฉ๋˜๋Š” ๊ธธ์ด ์ˆ˜๊ฐ€ ๋‹ค๋ฅด๋‹ค.
    • ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์žฌ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ ๋” ์งง์€ ์‹๋ณ„์ž ์ด๋ฆ„์ด ๊ถŒ์žฅ๋œ๋‹ค.
  5. ํ…Œ์ด๋ธ”์„ ๋ณต์‚ฌํ•  ๋•Œ ๋‚˜์ค‘์— ๊ด€๋ฆฌํ•˜๋Š”๋ฐ ๋„์›€๋˜๋Š” ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๊ธฐ
    • ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ YYYY_MM_DD ํ˜•์‹์˜ ๋‚ ์งœ๋ฅผ ํ…Œ์ด๋ธ” ์ด๋ฆ„์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
    • ์ด ๋ฐฉ์‹์€ ํ…Œ์ด๋ธ” ์ด๋ฆ„์ด ๋‚ ์งœ ์ˆœ์„œ๋กœ ์ •๋ ฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ถŒ์žฅ๋œ๋‹ค.

์ œ์•ฝ ์กฐ๊ฑด์œผ๋กœ ์—ด ๊ฐ’ ์ œ์–ดํ•˜๊ธฐ

  • ์ œ์•ฝ ์กฐ๊ฑด์„ ์‚ฌ์šฉํ•˜๋ฉด ํ’ˆ์งˆ์ด ์ข‹์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋กœ ์ธํ•ด ๋ถ„์„์ด ๋ถ€์ •ํ™•ํ•˜๊ฑฐ๋‚˜ ๋ถˆ์™„์ „ํ•œ ๊ฐ€๋น„์ง€ ์ธ, ๊ฐ€๋น„์ง€ ์•„์›ƒ ํ˜„์ƒ์„ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋‹ค์Œ์€ SQL์˜ ์ œ์•ฝ ์กฐ๊ฑด ์œ ํ˜•์ด๋‹ค.
  1. CHECK: ์ œ๊ณต๋œ ๋ถ€์šธ ํ‘œํ˜„์‹์ด true๋กœ ํ‰๊ฐ€๋˜๋Š” ํ–‰๋งŒ ํ—ˆ์šฉ
  2. UNIQUE: ์—ด ๋˜๋Š” ์—ด ๊ทธ๋ฃน์˜ ๊ฐ’์ด ํ…Œ์ด๋ธ”์˜ ๊ฐ ํ–‰์—์„œ ๊ณ ์œ ํ•œ์ง€ ํ™•์ธ
  3. NOT NULL: ์—ด์˜ NULL ๊ฐ’์„ ๋ฐฉ์ง€

๊ธฐ๋ณธ ํ‚ค: ์ž์—ฐ ํ‚ค vs ์ธ์กฐ ํ‚ค

  • ๊ธฐ๋ณธ ํ‚ค๋Š” SQL ์ œ์•ฝ ์กฐ๊ฑด์œผ๋กœ ํ‚ค๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์—ด์— ๋‹ค์Œ ๊ทœ์น™ ๋‘ ๊ฐ€์ง€๋ฅผ ์ ์šฉํ•œ๋‹ค.
  1. ๊ฐ ๊ฐ’์€ ํ–‰๋งˆ๋‹ค ๊ณ ์œ ํ•ด์•ผ ํ•œ๋‹ค.
  2. ์—ด์— ๊ฐ’์ด ๋ˆ„๋ฝ๋œ ๋ถ€๋ถ„์ด ์žˆ์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค.

๊ธฐ์กด ์—ด์„ ์ž์—ฐ ํ‚ค๋กœ ์‚ฌ์šฉํ•˜๊ธฐ

  • ์ž์—ฐ ํ‚ค๋Š” ํ…Œ์ด๋ธ”์— ์žˆ๋Š” ์—ด ์ค‘์—์„œ ๊ธฐ๋ณธ ํ‚ค์˜ ๊ธฐ์ค€์„ ์ถฉ์กฑํ•˜๋Š” ์—ด ๋˜๋Š” ์—ด์˜ ์กฐํ•ฉ์„ ์‚ฌ์šฉํ•œ๋‹ค.
  • ์ฆ‰ ํ•ด๋‹น ์—ด์˜ ๊ฐ’์€ ๋ชจ๋“  ํ–‰์— ๋Œ€ํ•ด ๊ณ ์œ ํ•˜๊ณ  ๋น„์–ด์žˆ์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค.
  • ์—ด์˜ ๊ฐ’์€ ์ œ์•ฝ ์กฐ๊ฑด์„ ์œ„๋ฐ˜ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์–ผ๋งˆ๋“ ์ง€ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

์ธ์กฐ ํ‚ค๋ฅผ ์œ„ํ•œ ์—ด ์ƒ์„ฑ

  • ์ธ์กฐ ํ‚ค๋Š” ์ž„์˜์˜ ๊ฐ’์„ ๋ถ€์—ฌํ•œ๋‹ค.
  • ํ…Œ์ด๋ธ”์— ์ž์—ฐ ๊ธฐ๋ณธ ํ‚ค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
  • ์ผ๋ถ€ ๊ฐœ๋ฐœ์ž๋Š” UUID๋ฅผ ์„ ํ˜ธํ•˜๋Š”๋ฐ, ์šฉ๋Ÿ‰ ๋ฉด์—์„œ bigint์— ๋น„ํ•ด ๋น„ํšจ์œจ์ ์ด๋ฏ€๋กœ ์œ ์˜ํ•ด์•ผ ํ•œ๋‹ค.

ํ‚ค ์œ ํ˜• ๋ณ„ ์žฅ๋‹จ์ 

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

๋‹จ์ผ ์—ด ๊ธฐ๋ณธ ํ‚ค ์ƒ์„ฑ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
-- ์—ด ์ œ์•ฝ ์กฐ๊ฑด
CREATE TABLE natural_key_example (
	license_id text CONSTRAINT license_key PRIMARY KEY,
	first_name text,
	last_name text
);

-- ํ…Œ์ด๋ธ” ์ œ์•ฝ ์กฐ๊ฑด
CREATE TABLE natural_key_example (
	license_id text,
	first_name text,
	last_name text,
	CONSTRAINT license_key PRIMARY KEY (license_id)
);
  • ์—ด ์ œ์•ฝ ์กฐ๊ฑด์„ ์„ค์ •ํ•  ๋•Œ๋Š” CONSTRAINT ํ‚ค์›Œ๋“œ๋ฅผ ์ƒ๋žตํ•ด๋„ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ธฐ๋ณธ ํ‚ค๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ด ๊ฒฝ์šฐ PostgreSQL์€ ์ž์ฒด์ ์œผ๋กœ ํ…Œ์ด๋ธ” ์ด๋ฆ„ ๋’ค์— _pkey๋ฅผ ๋ถ™์—ฌ ๊ธฐ๋ณธ ํ‚ค์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•œ๋‹ค.
  • ๋งŒ์•ฝ ๋‘˜ ์ด์ƒ์˜ ์—ด์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋ณธ ํ‚ค๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด ํ…Œ์ด๋ธ” ์ œ์•ฝ ์กฐ๊ฑด ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

๋ณตํ•ฉ ๊ธฐ๋ณธ ํ‚ค ์ƒ์„ฑ

1
2
3
4
5
6
CREATE TABLE natural_key_composite_example (
student_id text,
school_day date,
present boolean,
CONSTRAINT student_key PRIMARY KEY (student_id, school_day)
);
1
2
SQL Error [23505]: ERROR: duplicate key value violates unique constraint "student_key"
  Detail: Key (student_id, school_day)=(775, 2022-01-23) already exists.
  • ์ค‘๋ณต๋œ ๋ณตํ•ฉ ํ‚ค๊ฐ€ ํฌํ•จ๋œ ํ–‰์„ ์‚ฝ์ž…ํ•˜๋ฉด ์œ„ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

์ž๋™ ์ฆ๊ฐ€ ์ธ์กฐ ํ‚ค ์ƒ์„ฑ

1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TABLE surrogate_key_example (
	order_number bigint GENERATED ALWAYS AS IDENTITY,
	product_name text,
	order_time timestamp with time zone,
	CONSTRAINT order_number_key PRIMARY KEY (order_number)
);

INSERT INTO surrogate_key_example (product_name, order_time)
VALUES ('Beachball Polish', '2020-03-15 09:21-07'),
	('Wrinkle De-Atomizer', '2017-05-22 14:00-07'),
	('Flux Capacitor', '1985-10-26 01:18:00-07');

SELECT * FROM surrogate_key_example;
  • ์œ„ ์ฝ”๋“œ๋Š” IDENTITY ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ order_number๋ผ๋Š” ์ž๋™ ์ฆ๊ฐ€ bigint ํƒ€์ž… ์—ด์„ ์„ ์–ธํ•œ ํ›„, ํ•ด๋‹น ์—ด์„ ๊ธฐ๋ณธ ํ‚ค๋กœ ์„ค์ •ํ•œ๋‹ค.
order_numberproduct_nameorder_time
1Beachball Polish2020-03-16 01:21:00.000 +0900
2Wrinkle De-Atomizer2017-05-23 06:00:00.000 +0900
3Flux Capacitor1985-10-26 17:18:00.000 +0900
  • ํ…Œ์ด๋ธ”์— ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•  ๋•Œ๋Š” order_number ์—ด์—๋Š” ๊ฐ’์„ ์ง€์ •ํ•˜์ง€ ์•Š์•„๋„ ๊ดœ์ฐฎ๋‹ค.
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ž๋™์œผ๋กœ ๊ธฐ์กด ID ๊ฐ’ ์ค‘ ๊ฐ€์žฅ ํฐ ๊ฐ’์œผ๋กœ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ด์ค€๋‹ค.
  • GENERATED ALWAYS AS IDENTITY ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ์„ค์ •์„ ๋ฌด์‹œํ•˜๊ณ  ๊ฐ’์„ ์–ต์ง€๋กœ ์‚ฝ์ž…ํ•˜๋Š” ํ–‰์œ„๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.
1
2
3
4
5
6
7
8
INSERT INTO surrogate_key_example
OVERRIDING SYSTEM VALUE
VALUES (4, 'Chicken Coop', '2021-09-03 10:33-07');

ALTER TABLE surrogate_key_example ALTER COLUMN order_number RESTART WITH 5;

INSERT INTO surrogate_key_example (product_name, order_time)
VALUES ('Aloe Plant', '2020-03-15 10:09-07');
  • OVERRIDING SYSTEM VALUE ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด IDENTITY ์ˆ˜๋™ ์‚ฝ์ž…์„ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ฐ€๋ น ์‹ค์ˆ˜๋กœ ์‚ญ์ œ๋œ ํ–‰์„ ์‚ฝ์ž…ํ•˜๋Š” ๊ฒฝ์šฐ ์ˆ˜๋™ ์ž…๋ ฅ์„ ํ—ˆ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
  • ์‚ฝ์ž… ํ›„์—๋Š” ์‹œํ€€์Šค๋ฅผ ์žฌ์‹œ์ž‘ํ•˜๋„๋ก ์„ค์ •ํ•˜์—ฌ ๋‹ค์Œ ID ๊ฐ’์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ž์ฃผ ์ฒ˜๋ฆฌํ•  ์ž‘์—…์€ ์•„๋‹ˆ์ง€๋งŒ ํ•„์š”ํ•  ๋•Œ๊ฐ€ ์žˆ์œผ๋‹ˆ ๊ธฐ์–ตํ•ด๋‘์–ด์•ผ ํ•œ๋‹ค.

์™ธ๋ž˜ ํ‚ค

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
CREATE TABLE licenses (
	license_id text,
	first_name text,
	last_name text,
	CONSTRAINT licenses_key PRIMARY KEY (license_id)
);

CREATE TABLE registrations (
	registration_id text,
	registration_date timestamp with time zone,
	license_id text REFERENCES licenses (license_id),
	CONSTRAINT registration_key PRIMARY KEY (registration_id, license_id)
);

INSERT INTO licenses (license_id, first_name, last_name)
VALUES ('T229901', 'Steve', 'Rothery');

INSERT INTO registrations (registration_id, registration_date, license_id)
VALUES ('A203391', '2022-03-17', 'T229901');

INSERT INTO registrations (registration_id, registration_date, license_id)
VALUES ('A75772', '2022-03-17', 'T000001');
  • ์™ธ๋ž˜ ํ‚ค ์ œ์•ฝ ์กฐ๊ฑด์„ ์„ค์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, registrations ํ…Œ์ด๋ธ”์— ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•  ๋•Œ๋Š” license_id ๊ฐ’์ด licenses ํ…Œ์ด๋ธ”์— ์กด์žฌํ•˜๋Š” ๊ฐ’์ธ์ง€ ํ™•์ธํ•œ๋‹ค.
  • ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์œ„ ์ฝ”๋“œ ์ค‘ ์„ธ ๋ฒˆ์งธ INSERT ๊ตฌ๋ฌธ์€ ๋‹ค์Œ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.
1
2
SQL Error [23503]: ERROR: insert or update on table "registrations" violates foreign key constraint "registrations_license_id_fkey"
  Detail: Key (license_id)=(T000001) is not present in table "licenses".
  • ์œ„ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊นจ๋—ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ณ  ์žˆ์Œ์„ ๋‚˜ํƒ€๋‚ด๊ธฐ๋„ ํ•˜๋Š” ๋ฐ˜๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ช‡ ๊ฐ€์ง€ ์‹ค์งˆ์ ์ธ ์˜๋ฏธ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  1. ์™ธ๋ž˜ ํ‚ค๋Š” ๋ฐ์ดํ„ฐ ์‚ฝ์ž… ์ˆœ์„œ์— ์˜ํ–ฅ์„ ์ค€๋‹ค.
  2. ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•  ๋•Œ๋Š” ๊ทธ ๋ฐ˜๋Œ€๋กœ ์ ์šฉ๋œ๋‹ค.
  • 2๋ฒˆ์— ๋Œ€ํ•œ ๋ถ€์—ฐ ์„ค๋ช…์„ ํ•˜์ž๋ฉด, ์ฐธ์กฐ ๋ฌด๊ฒฐ์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์™ธ๋ž˜ ํ‚ค ์ œ์•ฝ ์กฐ๊ฑด์€ registrations ํ…Œ์ด๋ธ”์—์„œ ๊ด€๋ จ ํ–‰์„ ์ œ๊ฑฐํ•˜๊ธฐ ์ „์— licenses ํ…Œ์ด๋ธ”์˜ ํ–‰์„ ์ œ๊ฑฐํ•˜์ง€ ๋ชปํ•˜๋„๋ก ํ•œ๋‹ค.
  • ์ด๋Ÿฐ ๊ฒฝ์šฐ CASCADE ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

CASCADE๋กœ ๊ด€๋ จ ํ–‰ ์ž๋™ ์‚ญ์ œํ•˜๊ธฐ

1
2
3
4
5
6
CREATE TABLE registrations (
	registration_id text,
	registration_date timestamp with time zone,
	license_id text REFERENCES licenses (license_id) ON DELETE CASCADE,
	CONSTRAINT registration_key PRIMARY KEY (registration_id, license_id)
);
  • ํ…Œ์ด๋ธ”์„ ์œ„ ์ฝ”๋“œ์™€ ๊ฐ™์ด ์ƒ์„ฑํ•  ๊ฒฝ์šฐ licenses ํ…Œ์ด๋ธ”์˜ ํ–‰์„ ์‚ญ์ œํ•  ๊ฒฝ์šฐ ๊ด€๋ จ ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ๊ด€๋ จ ํ–‰์ด ํ•จ๊ป˜ ์‚ญ์ œ๋œ๋‹ค.
  • registrations ํ…Œ์ด๋ธ”์— ๊ณ ๋ฆฝ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‚จ์ง€ ์•Š๋„๋ก ํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์„ ์œ ์ง€ํ•œ๋‹ค.

CHECK ์ œ์•ฝ ์กฐ๊ฑด

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CREATE TABLE check_constraint_example (
	user_id bigint GENERATED ALWAYS AS IDENTITY,
	user_role text,
	salary numeric(10,2),
	CONSTRAINT user_id_key PRIMARY KEY (user_id),
	CONSTRAINT check_role_in_list CHECK (user_role IN('Admin', 'Staff')),
	CONSTRAINT check_salary_not_below_zero CHECK (salary >= 0)
);

-- ์•„๋ž˜ ๋‘ ๋ช…๋ น์–ด๋Š” ์‹คํ–‰์— ์‹คํŒจ
INSERT INTO check_constraint_example (user_role)
VALUES ('admin');

INSERT INTO check_constraint_example (salary)
VALUES (-10000);
  • CHECK ์ œ์•ฝ ์กฐ๊ฑด์€ ์—ด์— ์ถ”๊ฐ€๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋…ผ๋ฆฌ์  ํ…Œ์ŠคํŠธ๋กœ ์ง€์ •ํ•œ ์˜ˆ์ƒ ๊ธฐ์ค€์„ ์ถฉ์กฑํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ‰๊ฐ€ํ•œ๋‹ค.
  • ๊ธฐ์ค€์ด ์ถฉ์กฑํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๊ฐœ๋ฐœ์ž๋Š” ๊ฒ€์‚ฌ ๋กœ์ง์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์žˆ๋Š”์ง€, ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ์žˆ๋Š”์ง€, ๋˜๋Š” ๋‘˜ ๋‹ค์— ์†ํ•˜๋Š”์ง€ ํ† ๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฒ€์‚ฌ์˜ ํ•œ ๊ฐ€์ง€ ์žฅ์ ์€ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ๋ณ€๊ฒฝ๋œ ํ›„์—๋„, ๊ทธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ƒˆ๋กœ์šด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด๋‚˜ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๋ฌด๊ฒฐ์„ฑ์„ ์œ ์ง€ํ•œ๋‹ค๋Š” ์ ์ด๋‹ค.

UNIQUE ์ œ์•ฝ ์กฐ๊ฑด

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CREATE TABLE unique_constraint_example (
	contact_id bigint GENERATED ALWAYS AS IDENTITY,
	first_name text,
	last_name text,
	email text,
	CONSTRAINT contact_id_key PRIMARY KEY (contact_id),
	CONSTRAINT email_unique UNIQUE (email)
);

INSERT INTO unique_constraint_example (first_name, last_name, email)
VALUES ('Samantha', 'Lee', 'slee@example.org');

INSERT INTO unique_constraint_example (first_name, last_name, email)
VALUES ('Betty', 'Diaz', 'bdiaz@example.org');

INSERT INTO unique_constraint_example (first_name, last_name, email)
VALUES ('Sasha', 'Lee', 'slee@example.org');
  • ๊ธฐ๋ณธ ํ‚ค์™€ ๋™์ผํ•˜๊ฒŒ ๋ณด์ผ ์ˆ˜๋„ ์žˆ์ง€๋งŒ, UNIQUE ์ œ์•ฝ ์กฐ๊ฑด์€ NULL ๊ฐ’์„ ํ—ˆ์šฉํ•œ๋‹ค.
  • ๋™์ผํ•œ ์ด๋ฉ”์ผ์ด ํฌํ•จ๋œ ํ–‰์„ ์‚ฝ์ž…ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
1
2
SQL Error [23505]: ERROR: duplicate key value violates unique constraint "email_unique"
  Detail: Key (email)=(slee@example.org) already exists.

NOT NULL ์ œ์•ฝ ์กฐ๊ฑด

1
2
3
4
5
6
7
8
9
10
CREATE TABLE not_null_example (
	student_id bigint GENERATED ALWAYS AS IDENTITY,
	first_name text NOT NULL,
	last_name text NOT NULL,
	CONSTRAINT student_id_key PRIMARY KEY (student_id)
);

-- ์•„๋ž˜ ๋ช…๋ น์–ด๋Š” ์‹คํ–‰์— ์‹คํŒจ
INSERT INTO not_null_example (first_name, last_name)
VALUES ('Sting', NULL);

์ œ์•ฝ ์กฐ๊ฑด์„ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ๋‚˜์ค‘์— ์ถ”๊ฐ€ํ•˜๊ธฐ

1
2
3
4
5
6
7
8
9
-- ํ‚ค ์‚ญ์ œ
ALTER TABLE not_null_example DROP CONSTRAINT student_id_key;

-- ๊ธฐ๋ณธ ํ‚ค ์ถ”๊ฐ€
ALTER TABLE not_null_example ADD CONSTRAINT student_id_key PRIMARY KEY (student_id);

-- ์—ด ์ˆ˜์ •
ALTER TABLE not_null_example ALTER COLUMN first_name DROP NOT NULL; -- ์‚ญ์ œ
ALTER TABLE not_null_example ALTER COLUMN first_name SET NOT NULL;  -- ์ถ”๊ฐ€
  • ๋Œ€์ƒ ์—ด ๋ฐ์ดํ„ฐ๊ฐ€ ์ œ์•ฝ ์กฐ๊ฑด์˜ ์ œํ•œ์„ ๋”ฐ๋ฅด๋Š” ๊ฒฝ์šฐ์—๋งŒ ๊ธฐ์กด ํ…Œ์ด๋ธ”์— ์ œ์•ฝ ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด ๊ฐ’์ด ์ค‘๋ณต๋˜๊ฑฐ๋‚˜ ๋น„์–ด ์žˆ๋Š” ์—ด์—๋Š” ๊ธฐ๋ณธ ํ‚ค ์ œ์•ฝ ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†๋‹ค.

์ธ๋ฑ์Šค๋กœ ์ฟผ๋ฆฌ ์†๋„ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ

  • ์ฑ…์˜ ๋ชฉ์ฐจ์ฒ˜๋Ÿผ, ํ…Œ์ด๋ธ”์—์„œ๋„ ํ•˜๋‚˜ ์ด์ƒ์˜ ์—ด์— ์ธ๋ฑ์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์ฟผ๋ฆฌ ์†๋„๋ฅผ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ๊ฐ ํ–‰์„ ์Šค์บ”ํ•˜๋Š” ๋Œ€์‹  ์ธ๋ฑ์Šค๋ฅผ ๋ฐ”๋กœ ๊ฐ€๊ธฐ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.
  • ์ด๋Š” ์‚ฌ์†Œํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ SQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ฝค ์ค‘์š”ํ•œ ์ฃผ์ œ์ด๋‹ค.

B-Tree: PostgreSQL์˜ ๊ธฐ๋ณธ ์ธ๋ฑ์Šค

  • ์ด๋ฏธ ์•Œ๊ฒŒ ๋ชจ๋ฅด๊ฒŒ ์—ฌ๋Ÿฌ ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ค์–ด ๋ณด์•˜๋‹ค.
  • ๊ฐ€๋ น ๊ธฐ๋ณธ ํ‚ค๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜, UNIQUE ์ œ์•ฝ ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค ์ œ์•ฝ ์กฐ๊ฑด์— ํฌํ•จ๋œ ์—ด์— ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  • PostgreSQL์˜ ๊ธฐ๋ณธ ์ธ๋ฑ์Šค ์œ ํ˜•์€ B-Tree ์ธ๋ฑ์Šค์ด๋‹ค.
  • ๊ธฐ๋ณธ ํ‚ค๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜, UNIQUE ์ œ์•ฝ ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•  ๋•Œ, CREATE INDEX ๋ฌธ์„ ์‹คํ–‰ํ•  ๋•Œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ์œ ํ˜•์ด๋‹ค.
  • B-Tree๋Š” ๊ท ํ˜• ์žกํžŒ ํŠธ๋ฆฌ์˜ ์•ฝ์ž๋กœ, ๊ฐ’ ๊ฒ€์ƒ‰ ์‹œ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„ ๋•Œ๊นŒ์ง€ ๋ถ„๊ธฐ๋ฅผ ํ†ตํ•ด ํŠธ๋ฆฌ์˜ ๋งจ ์œ„์—์„œ๋ถ€ํ„ฐ ์•„๋ž˜๋กœ ๋‚ด๋ ค๋‹ค๋ณด๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค.
  • B-Tree ์ธ๋ฑ์Šค๋Š” ๋ถ€๋“ฑํ˜ธ, ๋“ฑํ˜ธ, BETWEEN๊ณผ ๊ฐ™์€ ๋™๋“ฑ ๋ฐ ๋ฒ”์œ„ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •๋ ฌํ•˜๊ณ  ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ์— ์œ ์šฉํ•˜๋‹ค.
  • WHERE chips LIKE 'Dorito%' ์ฒ˜๋Ÿผ ๊ฒ€์ƒ‰ ๋ฌธ์ž์—ด์˜ ์‹œ์ž‘ ๋ถ€๋ถ„ ํŒจํ„ด์— ์™€์ผ๋“œ ์นด๋“œ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์—๋„ LIKE์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•œ๋‹ค.
  • PostgreSQL์€ GIN, GiST๋ฅผ ๋น„๋กฏํ•œ ์ถ”๊ฐ€ ์ธ๋ฑ์Šค ์œ ํ˜•์„ ํ†ตํ•ฉํ•œ๋‹ค.
  • ๊ฐ๊ฐ์€ ๊ณ ์œ ํ•œ ์šฉ๋„๋ฅผ ๊ฐ–๊ณ  ์žˆ๋Š”๋ฐ, ํ›„๋ฐ˜๋ถ€ ์žฅ์—์„œ ๋‹ค๋ฃฐ ์˜ˆ์ •์ด๋‹ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TABLE new_york_addresses (
	longitude numeric(9,6),
	latitude numeric(9,6),
	street_number text,
	street text,
	unit text,
	postcode text,
	id integer CONSTRAINT new_york_key PRIMARY KEY
);

COPY new_york_addresses
FROM 'C:\YourDirectory\city_of_new_york.csv'
WITH (FORMAT CSV, HEADER);
  • ์ธ๋ฑ์Šค๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์šฐ์„  ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•œ๋‹ค.

EXPLAIN์œผ๋กœ ์ฟผ๋ฆฌ ์„ฑ๋Šฅ ๋ฒค์น˜๋งˆํ‚นํ•˜๊ธฐ

  • EXPLAIN์€ PostgreSQL์—์„œ๋งŒ ์ง€์›ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ณ„๋กœ ์˜ต์…˜ ๋ฐ ์ถœ๋ ฅ ํฌ๋งท์ด ๋ชจ๋‘ ๋‹ค๋ฅด๋‹ค.
  • ํ•ด๋‹น ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜๋ฉด ํŠน์ • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ธฐ์ค€์œผ๋กœ ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ์Šค์บ” ๊ณ„ํš, ์ธ๋ฑ์Šค ์‚ฌ์šฉ ์—ฌ๋ถ€ ๋“ฑ์ด ํฌํ•จ๋œ๋‹ค.
  • ANALYZE ํ‚ค์›Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด EXPLAIN์ด ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ์‹ค์ œ ์‹คํ–‰ ์‹œ๊ฐ„์„ ํ‘œ์‹œํ•œ๋‹ค.

์ œ์–ด ์‹คํ–‰ ์‹œ๊ฐ„ ๊ธฐ๋กํ•˜๊ธฐ

1
2
3
4
5
6
7
8
EXPLAIN ANALYZE SELECT * FROM new_york_addresses
WHERE street = 'BROADWAY';

EXPLAIN ANALYZE SELECT * FROM new_york_addresses
WHERE street = '52 STREET';

EXPLAIN ANALYZE SELECT * FROM new_york_addresses
WHERE street = 'ZWICKY AVENUE';
  • ์œ„ ๋ช…๋ น์–ด๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ์ง€์‹œํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๋Œ€์‹  ์ฟผ๋ฆฌ ํ”„๋กœ์„ธ์Šค ๋ฐ ์‹คํ–‰์— ๊ฑธ๋ฆฐ ์‹œ๊ฐ„์— ๋Œ€ํ•œ ํ†ต๊ณ„๋ฅผ ํ‘œ์‹œํ•œ๋‹ค.
1
2
3
4
5
6
7
8
Gather  (cost=1000.00..15285.68 rows=3479 width=46) (actual time=19.869..436.569 rows=3336 loops=1)
	Workers Planned: 2
	Workers Launched: 2
	->  Parallel Seq Scan on new_york_addresses  (cost=0.00..13937.78 rows=1450 width=46) (actual time=2.471..404.527 rows=1112 loops=3)
		Filter: (street = 'BROADWAY'::text)
		Rows Removed by Filter: 312346
Planning Time: 11.520 ms
Execution Time: 437.598 ms
  • ์ฒซ ๋ฒˆ์งธ ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ์‹คํ–‰ ๊ณ„ํš์œผ๋กœ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•ด์„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  1. street = "BROADWAY"์ธ ํ–‰์„ ์ฐพ๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ํ…Œ์ด๋ธ”์˜ ์ˆœ์ฐจ์  ์Šค์บ”์„ ์ˆ˜ํ–‰ํ•จ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.
    • ์ด๋Š” ์ „์ฒด ํ…Œ์ด๋ธ” ์Šค์บ”์˜ ๋™์˜์–ด์ด๋‹ค.
    • ๊ฐ ํ–‰์ด ๊ฒ€์ƒ‰๋˜๊ณ , ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” "BROADWAY"์™€ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ํ–‰์„ ๊ฒฐ๊ณผ์—์„œ ์ œ๊ฑฐํ•œ๋‹ค.
  2. ์‹คํ–‰์— ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
    • ์ด๋Š” ํ•˜๋“œ์›จ์–ด ์„ฑ๋Šฅ ๋ฐ ๋‹ค์–‘ํ•œ ์š”์ธ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ๋‹ค.
    • ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ์ฟผ๋ฆฌ๋ฅผ ๊ฐ์ž ์—ฌ๋Ÿฌ ๋ฒˆ ์‹คํ–‰ํ•˜๊ณ , ๊ฐ๊ฐ ๊ฐ€์žฅ ๋น ๋ฅธ ์‹œ๊ฐ„์„ ๊ธฐ๋กํ•ด์•ผ ํ•œ๋‹ค.
    • ์„œ๋ฒ„์—์„œ ์‹คํ–‰ ์ค‘์ธ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋‚˜ ์•ž์„  ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ ๋“ฑ์˜ ์›์ธ์œผ๋กœ ๋™์ผํ•œ ์ฟผ๋ฆฌ์ž„์—๋„ ์‹คํ–‰ ์‹œ๊ฐ„์€ ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ์•ฝ๊ฐ„์”ฉ ๋‹ค๋ฅด๋‹ค.

์ธ๋ฑ์Šค ์ถ”๊ฐ€ํ•˜๊ธฐ

1
CREATE INDEX street_idx ON new_york_addresses (street);
  • ์œ„ ๋ช…๋ น์–ด๋กœ ์ธ๋ฑ์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , ๋‹ค์‹œ ์‹คํ–‰ ๊ณ„ํš์„ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
1
2
3
4
5
6
7
Bitmap Heap Scan on new_york_addresses  (cost=43.39..6785.34 rows=3479 width=46) (actual time=0.768..3.071 rows=3336 loops=1)
  Recheck Cond: (street = 'BROADWAY'::text)
  Heap Blocks: exact=2152
  ->  Bitmap Index Scan on street_idx  (cost=0.00..42.52 rows=3479 width=0) (actual time=0.376..0.377 rows=3336 loops=1)
        Index Cond: (street = 'BROADWAY'::text)
Planning Time: 0.087 ms
Execution Time: 3.235 ms
  • ๋‘ ๊ฐ€์ง€ ํฐ ๋ณ€ํ™”๊ฐ€ ์žˆ๋‹ค.
  1. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๊ฐ ํ–‰์„ ์ˆœ์ฐจ ์Šค์บ”ํ•˜๋Š” ๋Œ€์‹  street_idx์—์„œ ์ธ๋ฑ์Šค ์Šค์บ”์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Œ์„ ๋ณด์—ฌ์ค€๋‹ค.
  2. ์ฟผ๋ฆฌ ์†๋„๊ฐ€ ํ˜„์ €ํžˆ ๋นจ๋ผ์กŒ๋‹ค.
  • ๋ฐ˜๋ณต์ ์ธ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ ๋ฐ์ดํ„ฐ์—์„œ ๋‹ต์„ ์ฐพ๊ฑฐ๋‚˜, ์ˆ˜์ฒœ ๋ช…์˜ ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•  ๋•Œ ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์—ฌ๋Ÿฌ ์ธ๋ฑ์Šค ์œ ํ˜•์˜ ์„ฑ๋Šฅ์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒฝ์šฐ์™€ ๊ฐ™์ด ํ…Œ์ด๋ธ”์—์„œ ์ธ๋ฑ์Šค๋ฅผ ์ œ๊ฑฐํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•˜๋ฉด ๋œ๋‹ค.
1
DROP INDEX street_idx;

์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ƒ๊ฐํ•  ์ 

  • ์ธ๋ฑ์Šค๊ฐ€ ์„ฑ๋Šฅ ํ–ฅ์ƒ์— ํฐ ์žฅ์ ์„ ๊ฐ–๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ๋‹ค.
  • ๊ทธ๋ ‡๋‹ค๋ฉด ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ์—ด์— ์ธ๋ฑ์Šค๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ• ๊นŒ?
  • ๊ทธ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.
  • ์ธ๋ฑ์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํฌ๊ธฐ๊ฐ€ ์ปค์ง€๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ์œ ์ง€ ๊ด€๋ฆฌ ๋น„์šฉ์ด ๋“ ๋‹ค.
  • ๋‹ค์Œ์€ ์ธ๋ฑ์Šค๋ฅผ ์–ธ์ œ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„์ง€ ํŒ๋‹จํ•˜๊ธฐ ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ๊ธฐ์ค€์ด๋‹ค.
  1. ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ธ๋ฑ์Šค ์ข…๋ฅ˜์™€ ํŠน์ • ๋ฐ์ดํ„ฐ ํƒ€์ž…์—์„œ ์‚ฌ์šฉํ•  ์ธ๋ฑ์Šค์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋ ค๋ฉด ์‚ฌ์šฉ ์ค‘์ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ์ž์— ๋Œ€ํ•œ ๋ฌธ์„œ๋ฅผ ์ฝ์–ด ๋ณด๋ผ.
    • ์˜ˆ๋ฅผ ๋“ค์–ด PostgreSQL์—๋Š” B-Tree ์™ธ์—๋„ ๋‹ค์„ฏ ๊ฐœ์˜ ์ธ๋ฑ์Šค ์œ ํ˜•์ด ๋” ์กด์žฌํ•œ๋‹ค.
  2. ํ…Œ์ด๋ธ” ์กฐ์ธ์— ์‚ฌ์šฉํ•  ์—ด์— ์ธ๋ฑ์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
    • ๊ธฐ๋ณธ ํ‚ค๋Š” PostgreSQL์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ธ๋ฑ์‹ฑ๋˜์ง€๋งŒ, ๊ด€๋ จ ํ…Œ์ด๋ธ”์˜ ์™ธ๋ž˜ ํ‚ค ์—ด์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ธ๋ฑ์‹ฑ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ธ๋ฑ์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์ข‹์€ ๋Œ€์ƒ์ด๋‹ค.
  3. ์™ธ๋ž˜ ํ‚ค์— ๋Œ€ํ•œ ์ธ๋ฑ์Šค๋Š” ์—ฐ์‡„ ์‚ญ์ œ(CASCADING DELETE) ๋™์•ˆ ๊ฐ’๋น„์‹ผ ์ˆœ์ฐจ ์Šค์บ”์„ ํ”ผํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋œ๋‹ค.
  4. WHERE ์ ˆ์— ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์—ด์— ์ธ๋ฑ์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์„ฑ๋Šฅ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋œ๋‹ค.
  5. EXPLAIN ANALYZE ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด ๋‹ค์–‘ํ•œ ๊ตฌ์„ฑ์—์„œ ์„ฑ๋Šฅ์„ ํ…Œ์ŠคํŠธํ•˜์ž.
    • ์ตœ์ ํ™”๋Š” ๊ณผ์ •์ด๋‹ค.
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๊ธฐ๋ณธ ํ‚ค ๋˜๋Š” ๊ธฐํƒ€ ์ œ์•ฝ ์กฐ๊ฑด์„ ๋ฐฑ์—…ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ์ธ๋ฑ์Šค๋ฅผ ์‚ญ์ œํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ณ  ์‚ฝ์ž…, ์—…๋ฐ์ดํŠธ, ์‚ญ์ œ ์†๋„๋ฅผ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.
This post is licensed under CC BY 4.0 by the author.