PostgreSQL ์ฟผ๋ฆฌ์˜ ๋Œ€๋Ÿ‰ ์ตœ์ ํ™”. ํ‚ค๋ฆด ๋ณด๋กœ๋น„์ฝ”ํ”„(ํ…์„œ)

์ด ๋ณด๊ณ ์„œ๋Š” ๋‹ค์Œ์„ ํ—ˆ์šฉํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋ฃจ์— ์ˆ˜๋ฐฑ๋งŒ ๊ฐœ์˜ SQL ์ฟผ๋ฆฌ๊ฐ€ ์žˆ์„ ๋•Œ SQL ์ฟผ๋ฆฌ์˜ ์„ฑ๋Šฅ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค., ๋ชจ๋‹ˆํ„ฐ๋ง๋˜๋Š” PostgreSQL ์„œ๋ฒ„๊ฐ€ ์ˆ˜๋ฐฑ ๋Œ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋Œ€๋Ÿ‰์˜ ์ •๋ณด๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ˆ  ์†”๋ฃจ์…˜์€ ๋ฌด์—‡์ด๋ฉฐ, ์ด๊ฒƒ์ด ์ผ๋ฐ˜ ๊ฐœ๋ฐœ์ž์˜ ์‚ถ์„ ์–ด๋–ป๊ฒŒ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด ์ค„๊นŒ์š”?


๋ˆ„๊ฐ€ ๊ด€์‹ฌ์ด ์žˆ๋‚˜์š”? ํŠน์ • ๋ฌธ์ œ ๋ถ„์„ ๋ฐ ๋‹ค์–‘ํ•œ ์ตœ์ ํ™” ๊ธฐ๋ฒ• SQL ์ฟผ๋ฆฌ ๋ฐ PostgreSQL์˜ ์ผ๋ฐ˜์ ์ธ DBA ๋ฌธ์ œ ํ•ด๊ฒฐ - ๋‹ค์Œ ์ž‘์—…๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ จ์˜ ๊ธฐ์‚ฌ๋ฅผ ์ฝ์œผ์‹ญ์‹œ์˜ค ์ด ์ฃผ์ œ์—.

PostgreSQL ์ฟผ๋ฆฌ์˜ ๋Œ€๋Ÿ‰ ์ตœ์ ํ™”. ํ‚ค๋ฆด ๋ณด๋กœ๋น„์ฝ”ํ”„(ํ…์„œ)
๋‚ด ์ด๋ฆ„์€ Kirill Borovikov์ž…๋‹ˆ๋‹ค. ํ…์„œ ํšŒ์‚ฌ. ํŠนํžˆ ์ €๋Š” ํšŒ์‚ฌ์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—…์„ ์ „๋ฌธ์œผ๋กœ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ค๋Š˜์€ ๋‹จ์ผ ์ฟผ๋ฆฌ์˜ ์„ฑ๋Šฅ์„ "๋ถ„๋ฆฌ"ํ•  ํ•„์š” ์—†์ด ๋ฌธ์ œ๋ฅผ ํ•œ๊บผ๋ฒˆ์— ํ•ด๊ฒฐํ•˜๋Š” ๊ฒฝ์šฐ ์ฟผ๋ฆฌ๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ์ˆ˜๋ฐฑ๋งŒ ๊ฑด์˜ ์š”์ฒญ์ด ์žˆ๊ณ  ์ผ๋ถ€๋ฅผ ์ฐพ์•„์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์†”๋ฃจ์…˜์— ๋Œ€ํ•œ ์ ‘๊ทผ ๋ฐฉ์‹ ์ด ํฐ ๋ฌธ์ œ.

์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐฑ๋งŒ ๋ช…์˜ ๊ณ ๊ฐ์„ ์œ„ํ•œ Tensor๋Š” VLSI๋Š” ์šฐ๋ฆฌ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ž…๋‹ˆ๋‹ค: ๊ธฐ์—… ์†Œ์…œ ๋„คํŠธ์›Œํฌ, ๋น„๋””์˜ค ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์šฉ ์†”๋ฃจ์…˜, ๋‚ด๋ถ€ ๋ฐ ์™ธ๋ถ€ ๋ฌธ์„œ ํ๋ฆ„์šฉ ์†”๋ฃจ์…˜, ํšŒ๊ณ„ ๋ฐ ์ฐฝ๊ณ ์šฉ ํšŒ๊ณ„ ์‹œ์Šคํ…œ... ์ฆ‰, ํ†ตํ•ฉ ๋น„์ฆˆ๋‹ˆ์Šค ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ "๋ฉ”๊ฐ€ ์ปด๋ฐ”์ธ"์œผ๋กœ์„œ 100๊ฐœ ์ด์ƒ์˜ ๋‹ค์–‘ํ•œ ์†”๋ฃจ์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๋ถ€ ํ”„๋กœ์ ํŠธ.

๋ชจ๋“  ๊ธฐ๋Šฅ์ด ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•˜๊ณ  ๊ฐœ๋ฐœ๋˜๋„๋ก ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” ์ „๊ตญ์— 10๊ฐœ์˜ ๊ฐœ๋ฐœ ์„ผํ„ฐ๋ฅผ ๋‘๊ณ  ์žˆ์œผ๋ฉฐ ๋” ๋งŽ์€ ๊ฐœ๋ฐœ ์„ผํ„ฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž 1000๋ช….

์šฐ๋ฆฌ๋Š” 2008๋…„๋ถ€ํ„ฐ PostgreSQL์„ ์‚ฌ์šฉํ•ด ์™”์œผ๋ฉฐ ํด๋ผ์ด์–ธํŠธ ๋ฐ์ดํ„ฐ, ํ†ต๊ณ„, ๋ถ„์„, ์™ธ๋ถ€ ์ •๋ณด ์‹œ์Šคํ…œ์˜ ๋ฐ์ดํ„ฐ ๋“ฑ ์šฐ๋ฆฌ๊ฐ€ ์ฒ˜๋ฆฌํ•˜๋Š” ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ•์ ํ•ด ์™”์Šต๋‹ˆ๋‹ค. 400TB ์ด์ƒ. ํ”„๋กœ๋•์…˜์—๋งŒ ์•ฝ 250๊ฐœ์˜ ์„œ๋ฒ„๊ฐ€ ์žˆ๊ณ , ์šฐ๋ฆฌ๊ฐ€ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋ฒ„๋Š” ์ด 1000๊ฐœ ์ •๋„์ž…๋‹ˆ๋‹ค.

PostgreSQL ์ฟผ๋ฆฌ์˜ ๋Œ€๋Ÿ‰ ์ตœ์ ํ™”. ํ‚ค๋ฆด ๋ณด๋กœ๋น„์ฝ”ํ”„(ํ…์„œ)

SQL์€ ์„ ์–ธ์  ์–ธ์–ด์ž…๋‹ˆ๋‹ค. ๋ฌด์–ธ๊ฐ€๊ฐ€ ์ž‘๋™ํ•ด์•ผ ํ•˜๋Š” "๋ฐฉ๋ฒ•"์ด ์•„๋‹ˆ๋ผ ๋‹ฌ์„ฑํ•˜๋ ค๋Š” "๋ฌด์—‡"์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. DBMS๋Š” JOIN์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•, ์ฆ‰ ํ…Œ์ด๋ธ”์„ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•, ์ ์šฉํ•  ์กฐ๊ฑด, ์ธ๋ฑ์Šค๋ฅผ ํ†ต๊ณผํ•  ํ•ญ๋ชฉ, ํ†ต๊ณผํ•˜์ง€ ์•Š์„ ํ•ญ๋ชฉ ๋“ฑ์„ ๋” ์ž˜ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ผ๋ถ€ DBMS๋Š” "์•„๋‹ˆ์š”, ์ด ๋‘ ํ…Œ์ด๋ธ”์„ ์ด๋Ÿฌํ•œ ๋Œ€๊ธฐ์—ด์— ์—ฐ๊ฒฐํ•˜์„ธ์š”"๋ผ๋Š” ํžŒํŠธ๋ฅผ ํ—ˆ์šฉํ•˜์ง€๋งŒ PostgreSQL์€ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์„ ๋„์ ์ธ ๊ฐœ๋ฐœ์ž๋“ค์˜ ์˜์‹์ ์ธ ์ž…์žฅ์ž…๋‹ˆ๋‹ค. โ€œ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ์–ด๋–ค ์ข…๋ฅ˜์˜ ํžŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ—ˆ์šฉํ•˜๊ธฐ๋ณด๋‹ค๋Š” ์ฟผ๋ฆฌ ์ตœ์ ํ™” ํ”„๋กœ๊ทธ๋žจ์„ ๋๋‚ด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.โ€

๊ทธ๋Ÿฌ๋‚˜ PostgreSQL์€ "์™ธ๋ถ€"๊ฐ€ ์Šค์Šค๋กœ๋ฅผ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์™„๋ฒฝํ•˜๊ฒŒ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์‚ฌ๋žŒ ์•ˆ์—์„œ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๋Š”์ง€ ๋ด์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ์™€ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ์œ„์น˜.

PostgreSQL ์ฟผ๋ฆฌ์˜ ๋Œ€๋Ÿ‰ ์ตœ์ ํ™”. ํ‚ค๋ฆด ๋ณด๋กœ๋น„์ฝ”ํ”„(ํ…์„œ)

์ผ๋ฐ˜์ ์œผ๋กœ [DBA์— ๋Œ€ํ•œ] ๊ฐœ๋ฐœ์ž๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์–ด๋–ค ๊ณ ์ „์ ์ธ ๋ฌธ์ œ์— ์ง๋ฉดํ•ฉ๋‹ˆ๊นŒ? โ€œ์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” ์š”์ฒญ์„ ์ดํ–‰ํ–ˆ๊ณ  ์šฐ๋ฆฌ์—๊ฒ ๋ชจ๋“  ๊ฒŒ ๋Š๋ ค, ๋ชจ๋“  ๊ฒƒ์ด ์ค‘๋‹จ๋˜๊ณ , ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค... ์–ด๋–ค ์ข…๋ฅ˜์˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค!โ€

์ด์œ ๋Š” ๊ฑฐ์˜ ํ•ญ์ƒ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

  • ๋น„ํšจ์œจ์ ์ธ ์ฟผ๋ฆฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜
    ๊ฐœ๋ฐœ์ž: "์ด์ œ ๋‚˜๋Š” JOIN์„ ํ†ตํ•ด ๊ทธ์—๊ฒŒ SQL๋กœ 10๊ฐœ์˜ ํ…Œ์ด๋ธ”์„ ์ œ๊ณตํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค..." - ๊ทธ๋ฆฌ๊ณ  ๊ทธ์˜ ์กฐ๊ฑด์ด ๊ธฐ์ ์ ์œผ๋กœ ํšจ๊ณผ์ ์œผ๋กœ "ํ’€๋ ค"์ง€๊ณ  ๋ชจ๋“  ๊ฒƒ์„ ๋นจ๋ฆฌ ์–ป์„ ๊ฒƒ์ด๋ผ๊ณ  ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ธฐ์ ์€ ์ผ์–ด๋‚˜์ง€ ์•Š์œผ๋ฉฐ ์ด๋Ÿฌํ•œ ๊ฐ€๋ณ€์„ฑ(ํ•˜๋‚˜์˜ FROM์— ํ…Œ์ด๋ธ” 10๊ฐœ)์ด ์žˆ๋Š” ์‹œ์Šคํ…œ์—์„œ๋Š” ํ•ญ์ƒ ์ผ์ข…์˜ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. [๊ธฐ์‚ฌ]
  • ์˜ค๋ž˜๋œ ํ†ต๊ณ„
    ์ด ์ ์€ ํŠนํžˆ PostgreSQL๊ณผ ๋งค์šฐ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„์— ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ์„ธํŠธ๋ฅผ "๋ถ€์–ด" ์š”์ฒญํ•˜๋ฉด ํƒœ๋ธ”๋ฆฟ์ด "์„น์Šค์บ๋‹ˆํŠธ"๋ฉ๋‹ˆ๋‹ค. ์–ด์ œ๋Š” 10๊ฐœ์˜ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์žˆ์—ˆ๊ณ  ์˜ค๋Š˜์€ 10๋งŒ ๊ฐœ์˜ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์žˆ์ง€๋งŒ PostgreSQL์€ ์•„์ง ์ด๋ฅผ ์ธ์‹ํ•˜์ง€ ๋ชปํ•˜๋ฏ€๋กœ ์ด์— ๋Œ€ํ•ด ์•Œ๋ ค์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค. [๊ธฐ์‚ฌ]
  • ๋ฆฌ์†Œ์Šค์— "ํ”Œ๋Ÿฌ๊ทธ"
    ๋””์Šคํฌ, ๋ฉ”๋ชจ๋ฆฌ ๋˜๋Š” ํ”„๋กœ์„ธ์„œ ์„ฑ๋Šฅ์ด ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์€ ์•ฝํ•œ ์„œ๋ฒ„์— ํฌ๊ณ  ๋กœ๋“œ๊ฐ€ ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์„ค์น˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒŒ ์ „๋ถ€์ž…๋‹ˆ๋‹ค. ์–ด๋”˜๊ฐ€์—๋Š” ๋” ์ด์ƒ ๋›ฐ์–ด๋„˜์„ ์ˆ˜ ์—†๋Š” ์„ฑ๋Šฅ ํ•œ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ฐจ๋‹จ
    ์ด๊ฒƒ์€ ์–ด๋ ค์šด ์ ์ด์ง€๋งŒ ๋‹ค์–‘ํ•œ ์ˆ˜์ • ์ฟผ๋ฆฌ(INSERT, UPDATE, DELETE)์™€ ๊ฐ€์žฅ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ณ„๋„์˜ ํฐ ์ฃผ์ œ์ž…๋‹ˆ๋‹ค.

๊ณ„ํš ์„ธ์šฐ๊ธฐ

...๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋ฐ–์˜ ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•ด์„œ๋Š” ์šฐ๋ฆฌ๊ฐ€ ๊ณ„ํš์ด ํ•„์š”ํ•ด! ์„œ๋ฒ„ ๋‚ด๋ถ€์—์„œ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

PostgreSQL ์ฟผ๋ฆฌ์˜ ๋Œ€๋Ÿ‰ ์ตœ์ ํ™”. ํ‚ค๋ฆด ๋ณด๋กœ๋น„์ฝ”ํ”„(ํ…์„œ)

PostgreSQL์˜ ์ฟผ๋ฆฌ ์‹คํ–‰ ๊ณ„ํš์€ ์ฟผ๋ฆฌ ์‹คํ–‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ…์ŠคํŠธ๋กœ ํ‘œํ˜„ํ•œ ํŠธ๋ฆฌ์ž…๋‹ˆ๋‹ค. ๊ธฐํš์ž์˜ ๋ถ„์„ ๊ฒฐ๊ณผ ๊ฐ€์žฅ ํšจ๊ณผ์ ์ธ ๊ฒƒ์œผ๋กœ ํŒ๋ช…๋œ ๊ฒƒ์€ ๋ฐ”๋กœ ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

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

์ฟผ๋ฆฌ ๊ณ„ํš์„ ์–ป์œผ๋ ค๋ฉด ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ ๋ช…๋ น๋ฌธ์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. EXPLAIN. ๋ชจ๋“  ์‹ค์ œ ์†์„ฑ์„ ์–ป์œผ๋ ค๋ฉด, ์ฆ‰ ์‹ค์ œ๋กœ ๊ธฐ๋ณธ์—์„œ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋ฉด - EXPLAIN (ANALYZE, BUFFERS) SELECT ....

๋‚˜์œ ๋ถ€๋ถ„: ์‹คํ–‰ํ•˜๋ฉด "์ง€๊ธˆ ์—ฌ๊ธฐ"์—์„œ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ๋กœ์ปฌ ๋””๋ฒ„๊น…์—๋งŒ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์˜ ํ๋ฆ„์ด ํ™œ๋ฐœํ•˜๊ณ  ๋กœ๋“œ๊ฐ€ ๋งŽ์€ ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. โ€œ์˜ค! ์—ฌ๊ธฐ์„œ๋Š” ์‹คํ–‰ ์†๋„๊ฐ€ ๋Š๋ฆฝ๋‹ˆ๋‹ค.์บ ํ•‘ ์š”๊ตฌ." XNUMX๋ถ„ ์ „, XNUMX์‹œ๊ฐ„ ์ „ - ์‹คํ–‰ํ•˜๊ณ  ๋กœ๊ทธ์—์„œ ์ด ์š”์ฒญ์„ ๋ฐ›์•„ ์„œ๋ฒ„๋กœ ๋‹ค์‹œ ๊ฐ€์ ธ์˜ค๋Š” ๋™์•ˆ ์ „์ฒด ๋ฐ์ดํ„ฐ์„ธํŠธ์™€ ํ†ต๊ณ„๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋””๋ฒ„๊น…์„ ์œ„ํ•ด ์‹คํ–‰ํ•˜๋ฉด ๋น ๋ฅด๊ฒŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค! ๊ทธ๋ฆฌ๊ณ  ๋„Œ ์™œ, ์™œ์ธ์ง€ ์ดํ•ดํ•  ์ˆ˜ ์—†์–ด ์žˆ์—ˆ๋‹ค ๋Š๋ฆฌ๊ฒŒ.

PostgreSQL ์ฟผ๋ฆฌ์˜ ๋Œ€๋Ÿ‰ ์ตœ์ ํ™”. ํ‚ค๋ฆด ๋ณด๋กœ๋น„์ฝ”ํ”„(ํ…์„œ)

์„œ๋ฒ„์—์„œ ์š”์ฒญ์ด ์‹คํ–‰๋˜๋Š” ์ˆœ๊ฐ„ ์ •ํ™•ํžˆ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚ฌ๋Š”์ง€ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ๋˜‘๋˜‘ํ•œ ์‚ฌ๋žŒ๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค. auto_explain ๋ชจ๋“ˆ. ๊ฑฐ์˜ ๋ชจ๋“  ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ PostgreSQL ๋ฐฐํฌํŒ์— ์กด์žฌํ•˜๋ฉฐ ๊ตฌ์„ฑ ํŒŒ์ผ์—์„œ ๊ฐ„๋‹จํžˆ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ผ๋ถ€ ์š”์ฒญ์ด ์ง€์ •ํ•œ ์ œํ•œ๋ณด๋‹ค ์˜ค๋ž˜ ์‹คํ–‰๋˜๊ณ  ์žˆ์Œ์„ ์ธ์‹ํ•˜๋ฉด ์ด ์š”์ฒญ ๊ณ„ํš์˜ "์Šค๋ƒ…์ƒท"์„ ์ƒ์„ฑํ•˜๊ณ  ๋กœ๊ทธ์— ํ•จ๊ป˜ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค..

PostgreSQL ์ฟผ๋ฆฌ์˜ ๋Œ€๋Ÿ‰ ์ตœ์ ํ™”. ํ‚ค๋ฆด ๋ณด๋กœ๋น„์ฝ”ํ”„(ํ…์„œ)

์ด์ œ ๋ชจ๋“  ๊ฒƒ์ด ๊ดœ์ฐฎ์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋กœ๊ทธ๋กœ ๊ฐ€์„œ ๊ฑฐ๊ธฐ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค... [ํ…์ŠคํŠธ ์กฑ๋ณด]. ํ•˜์ง€๋งŒ ์‹คํ–‰ํ•˜๋Š” ๋ฐ 11ms๊ฐ€ ๊ฑธ๋ ธ๊ธฐ ๋•Œ๋ฌธ์— ํ›Œ๋ฅญํ•œ ๊ณ„ํš์ด๋ผ๋Š” ์‚ฌ์‹ค ์™ธ์—๋Š” ์•„๋ฌด ๋ง๋„ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

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

ํ•˜์ง€๋งŒ ๋ช…ํ™•ํ•˜์ง€ ์•Š๋”๋ผ๋„, ๋ถˆํŽธํ•˜๋”๋ผ๋„ ๋” ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๊ทธ๋Ÿฌํ•œ ์ƒํ™ฉ์—์„œ๋Š” โ€œ๊ฐ€์žฅ ์•ฝํ•œ ๊ณ ๋ฆฌ๊ฐ€ ๋ˆ„๊ตฌ์ธ๊ฐ€?โ€๋ฅผ ์ดํ•ดํ•˜์‹ญ์‹œ์˜ค. ๊ฑฐ์˜ ๋ถˆ๊ฐ€๋Šฅํ•œ. ๋”ฐ๋ผ์„œ ๊ฐœ๋ฐœ์ž ์ž์‹ ๋„ "๋งค๋‰ด์–ผ"์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‚ด์šฉ์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. โ€œ๊ณ„ํš์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์€ ๋ฐฐ์šฐ๊ณ  ๊ฒฝํ—˜ํ•ด์•ผ ํ•˜๋Š” ์˜ˆ์ˆ ์ž…๋‹ˆ๋‹ค...โ€.

ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ ๊ฐœ๋ฐœ์ž๋Š” 1000๋ช…์ธ๋ฐ, ์ด ๊ฒฝํ—˜์„ ๊ทธ๋“ค ๊ฐ์ž์—๊ฒŒ ์ „๋‹ฌํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜, ๋„ˆ, ๊ทธ ์‚ฌ๋žŒ์€ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์ €๊ธฐ ์žˆ๋Š” ๋ˆ„๊ตฐ๊ฐ€๋Š” ๋” ์ด์ƒ ๋ชจ๋ฅธ๋‹ค. ์–ด์ฉŒ๋ฉด ๊ทธ๋Š” ๋ฐฐ์šธ ์ˆ˜๋„ ์žˆ๊ณ  ์•„๋‹ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์ง€๊ธˆ์€ ์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋Š” ์–ด๋””์„œ ์ด ๊ฒฝํ—˜์„ ์–ป์„ ์ˆ˜ ์žˆ์„๊นŒ์š”?

๊ณ„ํš ์‹œ๊ฐํ™”

๊ทธ๋Ÿฌ๋ฏ€๋กœ ์šฐ๋ฆฌ๋Š” ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์กฐ์น˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ๊ณ„ํš์˜ ์ข‹์€ ์‹œ๊ฐํ™”. [๊ธฐ์‚ฌ]

PostgreSQL ์ฟผ๋ฆฌ์˜ ๋Œ€๋Ÿ‰ ์ตœ์ ํ™”. ํ‚ค๋ฆด ๋ณด๋กœ๋น„์ฝ”ํ”„(ํ…์„œ)

์šฐ๋ฆฌ๋Š” ๋จผ์ € "์‹œ์žฅ์„ ํ†ต๊ณผ"ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ธํ„ฐ๋„ท์„ ํ†ตํ•ด ๋ฌด์—‡์ด ์กด์žฌํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์–ด๋Š ์ •๋„ ๊ฐœ๋ฐœ ์ค‘์ธ ์ƒ๋Œ€์ ์œผ๋กœ "์‹ค์‹œ๊ฐ„" ์†”๋ฃจ์…˜์€ ๊ฑฐ์˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค. ๋ง ๊ทธ๋Œ€๋กœ ๋‹จ ํ•˜๋‚˜๋ฟ์ž…๋‹ˆ๋‹ค. explain.depesz.com ํœด๋ฒ ๋ฅดํŠธ ๋ฃจ๋ฐ”์ฒดํ”„์Šคํ‚ค(Hubert Lubaczewski). ๊ณ„ํš์˜ ํ…์ŠคํŠธ ํ‘œํ˜„์ธ "ํ”ผ๋“œ" ํ•„๋“œ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๊ตฌ๋ฌธ ๋ถ„์„๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋œ ํ…Œ์ด๋ธ”์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

  • ๋…ธ๋“œ ์ž์ฒด ์ฒ˜๋ฆฌ ์‹œ๊ฐ„
  • ์ „์ฒด ํ•˜์œ„ ํŠธ๋ฆฌ์— ๋Œ€ํ•œ ์ด ์‹œ๊ฐ„
  • ํ†ต๊ณ„์ ์œผ๋กœ ์˜ˆ์ƒ๋˜๋Š” ๊ฒ€์ƒ‰๋œ ๋ ˆ์ฝ”๋“œ ์ˆ˜
  • ๋…ธ๋“œ ๋ณธ์ฒด ์ž์ฒด

์ด ์„œ๋น„์Šค์—๋Š” ๋งํฌ ์•„์นด์ด๋ธŒ๋ฅผ ๊ณต์œ ํ•˜๋Š” ๊ธฐ๋Šฅ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๊ฑฐ๊ธฐ์— ๋‹น์‹ ์˜ ๊ณ„ํš์„ ์ง‘์–ด๋„ฃ๊ณ  ์ด๋ ‡๊ฒŒ ๋งํ–ˆ์Šต๋‹ˆ๋‹ค: "์•ˆ๋…•, Vasya, ์—ฌ๊ธฐ ๋งํฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฑฐ๊ธฐ์— ๋ญ”๊ฐ€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค."

PostgreSQL ์ฟผ๋ฆฌ์˜ ๋Œ€๋Ÿ‰ ์ตœ์ ํ™”. ํ‚ค๋ฆด ๋ณด๋กœ๋น„์ฝ”ํ”„(ํ…์„œ)

๊ทธ๋Ÿฌ๋‚˜ ์ž‘์€ ๋ฌธ์ œ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฒซ์งธ, ์—„์ฒญ๋‚œ ์–‘์˜ "๋ณต์‚ฌ-๋ถ™์—ฌ๋„ฃ๊ธฐ"์ž…๋‹ˆ๋‹ค. ํ†ต๋‚˜๋ฌด ์กฐ๊ฐ์„ ๊ฐ€์ ธ๋‹ค๊ฐ€ ๊ฑฐ๊ธฐ์— ๋ถ™์ด๊ณ , ๊ณ„์†ํ•ด์„œ ๋ถ™์ด์„ธ์š”.

๋‘˜์งธ, ์ฝ์€ ๋ฐ์ดํ„ฐ์˜ ์–‘์„ ๋ถ„์„ํ•˜์ง€ ์•Š์Œ โ€” ์ถœ๋ ฅ๊ณผ ๋™์ผํ•œ ๋ฒ„ํผ EXPLAIN (ANALYZE, BUFFERS), ์—ฌ๊ธฐ์—๋Š” ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Š” ๋‹จ์ˆœํžˆ ๊ทธ๊ฒƒ๋“ค์„ ๋ถ„ํ•ดํ•˜๊ณ  ์ดํ•ดํ•˜๊ณ  ์ž‘์—…ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ๋””์Šคํฌ์™€ ๋ฉ”๋ชจ๋ฆฌ ์บ์‹œ๋ฅผ ์ž˜๋ชป ํ• ๋‹นํ–ˆ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜๋ฉด ์ด ์ •๋ณด๋Š” ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

์„ธ ๋ฒˆ์งธ ๋ถ€์ •์ ์ธ ์ ์€ ์ด ํ”„๋กœ์ ํŠธ์˜ ๊ฐœ๋ฐœ์ด ๋งค์šฐ ์•ฝํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ปค๋ฐ‹์€ ๋งค์šฐ ์ž‘์Šต๋‹ˆ๋‹ค. XNUMX๊ฐœ์›”์— ํ•œ ๋ฒˆ์”ฉ ์ฝ”๋“œ๊ฐ€ Perl์— ์žˆ์œผ๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค.

PostgreSQL ์ฟผ๋ฆฌ์˜ ๋Œ€๋Ÿ‰ ์ตœ์ ํ™”. ํ‚ค๋ฆด ๋ณด๋กœ๋น„์ฝ”ํ”„(ํ…์„œ)

ํ•˜์ง€๋งŒ ์ด๊ฒƒ์€ ๋ชจ๋‘ "๊ฐ€์‚ฌ"์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์–ด๋–ป๊ฒŒ ๋“  ์ด๊ฒƒ์œผ๋กœ ์‚ด์•„๊ฐˆ ์ˆ˜ ์žˆ์ง€๋งŒ์ด ์„œ๋น„์Šค์—์„œ ์šฐ๋ฆฌ๋ฅผ ํฌ๊ฒŒ ๋ฉ€์–ด์ง€๊ฒŒ ๋งŒ๋“  ํ•œ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” CTE(Common Table Expression) ๋ฐ InitPlan/SubPlan๊ณผ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ๋™์  ๋…ธ๋“œ ๋ถ„์„์˜ ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค.

์ด ๊ทธ๋ฆผ์„ ๋ฏฟ๋Š”๋‹ค๋ฉด ๊ฐ ๊ฐœ๋ณ„ ๋…ธ๋“œ์˜ ์ด ์‹คํ–‰ ์‹œ๊ฐ„์€ ์ „์ฒด ์š”์ฒญ์˜ ์ด ์‹คํ–‰ ์‹œ๊ฐ„๋ณด๋‹ค ๊ธธ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จ ํ•ด - ์ด CTE์˜ ์ƒ์„ฑ ์‹œ๊ฐ„์€ CTE ์Šค์บ” ๋…ธ๋“œ์—์„œ ์ฐจ๊ฐ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.. ๋”ฐ๋ผ์„œ CTE ์Šค์บ” ์ž์ฒด์— ์†Œ์š”๋˜๋Š” ์‹œ๊ฐ„์— ๋Œ€ํ•œ ์ •๋‹ต์„ ๋” ์ด์ƒ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

PostgreSQL ์ฟผ๋ฆฌ์˜ ๋Œ€๋Ÿ‰ ์ตœ์ ํ™”. ํ‚ค๋ฆด ๋ณด๋กœ๋น„์ฝ”ํ”„(ํ…์„œ)

๊ทธ๋Ÿฐ ๋‹ค์Œ ์šฐ๋ฆฌ๋Š” ์ด์ œ ์šฐ๋ฆฌ ์ž์‹ ์˜ ๊ธ€์„ ์“ธ ์‹œ๊ฐ„์ด๋ผ๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ๋งŒ์„ธ! ๋ชจ๋“  ๊ฐœ๋ฐœ์ž๋Š” "์ด์ œ ์ง์ ‘ ์ž‘์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋งค์šฐ ์‰ฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค!"๋ผ๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์›น ์„œ๋น„์Šค์— ์ผ๋ฐ˜์ ์ธ ์Šคํƒ์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. Node.js + Express ๊ธฐ๋ฐ˜ ์ฝ”์–ด, ์•„๋ฆ„๋‹ค์šด ๋‹ค์ด์–ด๊ทธ๋žจ์„ ์œ„ํ•ด Bootstrap ๋ฐ D3.js๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ์˜ ๊ธฐ๋Œ€๋Š” ์™„์ „ํžˆ ์ถฉ์กฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” 2์ฃผ ๋งŒ์— ์ฒซ ๋ฒˆ์งธ ํ”„๋กœํ† ํƒ€์ž…์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.

  • ์‚ฌ์šฉ์ž ์ •์˜ ๊ณ„ํš ํŒŒ์„œ
    ์ฆ‰, ์ด์ œ PostgreSQL์—์„œ ์ƒ์„ฑ๋œ ๊ณ„ํš์—์„œ ๋ชจ๋“  ๊ณ„ํš์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋™์  ๋…ธ๋“œ์˜ ์˜ฌ๋ฐ”๋ฅธ ๋ถ„์„ - CTE ์Šค์บ”, InitPlan, SubPlan
  • ๋ฒ„ํผ ๋ถ„ํฌ ๋ถ„์„ - ๋ฐ์ดํ„ฐ ํŽ˜์ด์ง€๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ฝ๋Š” ๊ณณ, ๋กœ์ปฌ ์บ์‹œ์—์„œ ์ฝ๋Š” ๊ณณ, ๋””์Šคํฌ์—์„œ ์ฝ๋Š” ๊ณณ
  • ๋ช…ํ™•์„ฑ์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค
    ๋”ฐ๋ผ์„œ ๋กœ๊ทธ์—์„œ ์ด ๋ชจ๋“  ๊ฒƒ์„ "ํŒŒํ—ค์น˜๋Š”" ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ทธ๋ฆผ์—์„œ "๊ฐ€์žฅ ์•ฝํ•œ ๋งํฌ"๋ฅผ ๋ฐ”๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

PostgreSQL ์ฟผ๋ฆฌ์˜ ๋Œ€๋Ÿ‰ ์ตœ์ ํ™”. ํ‚ค๋ฆด ๋ณด๋กœ๋น„์ฝ”ํ”„(ํ…์„œ)

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

์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ๋ถ€๋ฅด๋Š” ๋‹จ์ถ• ํ‘œํ˜„์ž…๋‹ˆ๋‹ค. ๊ณ„ํš ํ…œํ”Œ๋ฆฟ.

PostgreSQL ์ฟผ๋ฆฌ์˜ ๋Œ€๋Ÿ‰ ์ตœ์ ํ™”. ํ‚ค๋ฆด ๋ณด๋กœ๋น„์ฝ”ํ”„(ํ…์„œ)

๋˜ ๋ฌด์—‡์ด ํŽธ๋ฆฌํ• ๊นŒ์š”? ์ด ์‹œ๊ฐ„ ์ค‘ ์–ด๋Š ๋ถ€๋ถ„์ด ์–ด๋Š ๋…ธ๋“œ์— ํ• ๋‹น๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์˜†์— "๋ถ™์—ฌ" ๋‘๋Š” ๊ฒƒ์ด ํŽธ๋ฆฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŒŒ์ด ์ฐจํŠธ.

๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋ฉด Seq Scan์ด ์ „์ฒด ์‹œ๊ฐ„์˜ 3/4 ๋ฏธ๋งŒ์ด ๊ฑธ๋ ธ๊ณ  ๋‚˜๋จธ์ง€ XNUMX/XNUMX๋Š” CTE Scan์ด ์ฐจ์ง€ํ•œ ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ๊ณตํฌ! ์ด๋Š” ์ฟผ๋ฆฌ์— CTE ์Šค์บ”์„ ์ ๊ทน์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ CTE ์Šค์บ”์˜ "๋ฐœ์‚ฌ ์†๋„"์— ๋Œ€ํ•œ ์ž‘์€ ์ฐธ๊ณ  ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ๊ทธ๋‹ค์ง€ ๋น ๋ฅด์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ํ…Œ์ด๋ธ” ์Šค์บ๋‹๋ณด๋‹ค ์—ด๋“ฑํ•ฉ๋‹ˆ๋‹ค. [๊ธฐ์‚ฌ] [๊ธฐ์‚ฌ]

๊ทธ๋Ÿฌ๋‚˜ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ทธ๋Ÿฌํ•œ ๋‹ค์ด์–ด๊ทธ๋žจ์€ ์šฐ๋ฆฌ๊ฐ€ ์ฆ‰์‹œ ์„ธ๊ทธ๋จผํŠธ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์˜ˆ๋ฅผ ๋“ค์–ด ์ผ๋ถ€ Seq ์Šค์บ”์ด "๋จน์€" ์‹œ๊ฐ„์˜ ์ ˆ๋ฐ˜ ์ด์ƒ์„ ๋ณผ ๋•Œ ๋” ํฅ๋ฏธ๋กญ๊ณ  ๋” ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ๋‚ด๋ถ€์—๋Š” ์ผ์ข…์˜ ํ•„ํ„ฐ๊ฐ€ ์žˆ์—ˆ๊ณ  ๊ทธ์— ๋”ฐ๋ผ ๋งŽ์€ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์‚ญ์ œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค... ์ด ์‚ฌ์ง„์„ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ง์ ‘ ๋˜์ง€๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. โ€œVasya, ์—ฌ๊ธฐ์„œ๋Š” ๋ชจ๋“  ๊ฒƒ์ด ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค! ์•Œ์•„๋‚ด์„ธ์š”. ๋ณด์„ธ์š”. ๋ญ”๊ฐ€ ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค!โ€

PostgreSQL ์ฟผ๋ฆฌ์˜ ๋Œ€๋Ÿ‰ ์ตœ์ ํ™”. ํ‚ค๋ฆด ๋ณด๋กœ๋น„์ฝ”ํ”„(ํ…์„œ)

๋‹น์—ฐํžˆ ์•ฝ๊ฐ„์˜ "๊ฐˆํ€ด"๊ฐ€ ๊ด€๋ จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ๋จผ์ € ์ ‘ํ•œ ๊ฒƒ์€ ๋ฐ˜์˜ฌ๋ฆผ ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค. ๊ณ„ํš์˜ ๊ฐ ๊ฐœ๋ณ„ ๋…ธ๋“œ์˜ ์‹œ๊ฐ„์€ 1ฮผs์˜ ์ •ํ™•๋„๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋…ธ๋“œ ์ฃผ๊ธฐ ์ˆ˜๊ฐ€ 1000์„ ์ดˆ๊ณผํ•˜๋ฉด PostgreSQL์„ ์‹คํ–‰ํ•œ ํ›„ "์ •ํ™•๋„ ๋‚ด"๋กœ ๋‚˜๋ˆˆ ๋‹ค์Œ ๋‹ค์‹œ ๊ณ„์‚ฐํ•  ๋•Œ ์ด ์‹œ๊ฐ„์ด "0.95ms์—์„œ 1.05ms ์‚ฌ์ด"๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์นด์šดํŠธ๊ฐ€ ๋งˆ์ดํฌ๋กœ์ดˆ๋กœ ๊ฐ€๋ฉด ๊ดœ์ฐฎ์ง€๋งŒ ์ด๋ฏธ [๋ฐ€๋ฆฌ]์ดˆ๊ฐ€ ๋˜๋ฉด "๋ˆ„๊ฐ€ ๋ˆ„๊ตฌ์—๊ฒŒ์„œ ์–ผ๋งˆ๋‚˜ ์†Œ๋น„ํ–ˆ๋Š”์ง€" ๊ณ„ํš์˜ ๋…ธ๋“œ์— ๋ฆฌ์†Œ์Šค๋ฅผ "ํ’€" ๋•Œ ์ด ์ •๋ณด๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

PostgreSQL ์ฟผ๋ฆฌ์˜ ๋Œ€๋Ÿ‰ ์ตœ์ ํ™”. ํ‚ค๋ฆด ๋ณด๋กœ๋น„์ฝ”ํ”„(ํ…์„œ)

๋‘ ๋ฒˆ์งธ๋กœ ๋” ๋ณต์žกํ•œ ์ ์€ ๋™์  ๋…ธ๋“œ ๊ฐ„์— ๋ฆฌ์†Œ์Šค(ํ•ด๋‹น ๋ฒ„ํผ)๋ฅผ ๋ฐฐํฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ”„๋กœํ† ํƒ€์ž…์˜ ์ฒซ 2์ฃผ์™€ ์ถ”๊ฐ€๋กœ 4์ฃผ๊ฐ€ ์†Œ์š”๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” CTE๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ์•„๋งˆ๋„ ๊ทธ ์•ˆ์— ์žˆ๋Š” ๋‚ด์šฉ์„ ์ฝ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ PostgreSQL์€ "์Šค๋งˆํŠธ"ํ•˜๋ฉฐ ๊ฑฐ๊ธฐ์—์„œ ์ง์ ‘ ์•„๋ฌด๊ฒƒ๋„ ์ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์—ฌ๊ธฐ์—์„œ ์ฒซ ๋ฒˆ์งธ ๋ ˆ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ๋™์ผํ•œ CTE์—์„œ XNUMX๋ฒˆ์งธ ๋ ˆ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

PostgreSQL ์ฟผ๋ฆฌ์˜ ๋Œ€๋Ÿ‰ ์ตœ์ ํ™”. ํ‚ค๋ฆด ๋ณด๋กœ๋น„์ฝ”ํ”„(ํ…์„œ)

์šฐ๋ฆฌ๋Š” ๊ณ„ํš์„ ๋ณด๊ณ  ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ์ด์ƒํ•ฉ๋‹ˆ๋‹ค. Seq ์Šค์บ”์—์„œ๋Š” 3๊ฐœ์˜ ๋ฒ„ํผ(๋ฐ์ดํ„ฐ ํŽ˜์ด์ง€)๊ฐ€ "์†Œ๋น„"๋˜๊ณ , CTE ์Šค์บ”์—์„œ๋Š” 1๊ฐœ๊ฐ€ ๋” ์žˆ๊ณ , ๋‘ ๋ฒˆ์งธ CTE ์Šค์บ”์—์„œ๋Š” 2๊ฐœ๊ฐ€ ๋” ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋‹จ์ˆœํžˆ ๋ชจ๋“  ๊ฒƒ์„ ํ•ฉ์‚ฐํ•˜๋ฉด 6์ด ๋‚˜์˜ค์ง€๋งŒ ํƒœ๋ธ”๋ฆฟ์—์„œ๋Š” 3๋งŒ ์ฝ์Šต๋‹ˆ๋‹ค! CTE Scan์€ ์–ด๋””์—์„œ๋“  ์•„๋ฌด๊ฒƒ๋„ ์ฝ์ง€ ์•Š๊ณ  ํ”„๋กœ์„ธ์Šค ๋ฉ”๋ชจ๋ฆฌ์™€ ์ง์ ‘ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์—ฌ๊ธฐ์—๋Š” ๋ถ„๋ช…ํžˆ ์ž˜๋ชป๋œ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค!

์‹ค์ œ๋กœ ์—ฌ๊ธฐ์—๋Š” Seq Scan์—์„œ ์š”์ฒญํ•œ 3ํŽ˜์ด์ง€์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ชจ๋‘ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ, ์ฒ˜์Œ 1ํŽ˜์ด์ง€๋Š” ์ฒซ ๋ฒˆ์งธ CTE ์Šค์บ”์„ ์š”์ฒญํ•˜๊ณ  ๊ทธ ๋‹ค์Œ ๋‘ ๋ฒˆ์งธ, 1ํŽ˜์ด์ง€๊ฐ€ ๋” ์ฝ์–ด์กŒ์Šต๋‹ˆ๋‹ค. 2ํŽ˜์ด์ง€๊ฐ€ ์•„๋‹Œ 2ํŽ˜์ด์ง€๋ฅผ ์ฝ์€ ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค.

PostgreSQL ์ฟผ๋ฆฌ์˜ ๋Œ€๋Ÿ‰ ์ตœ์ ํ™”. ํ‚ค๋ฆด ๋ณด๋กœ๋น„์ฝ”ํ”„(ํ…์„œ)

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

PostgreSQL ์ฟผ๋ฆฌ์˜ ๋Œ€๋Ÿ‰ ์ตœ์ ํ™”. ํ‚ค๋ฆด ๋ณด๋กœ๋น„์ฝ”ํ”„(ํ…์„œ)

์šฐ๋ฆฌ๋Š” ์ž ์‹œ ์ˆจ์„ ๋‚ด์‰ฌ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์ด๋ ‡๊ฒŒ ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. โ€œ์ž, ๋„ค์˜ค, ๋‹น์‹ ์€ ์ฟตํ‘ธ๋ฅผ ์•Œ๊ณ  ์žˆ๊ตฐ์š”! ์ด์ œ ์šฐ๋ฆฌ์˜ ๊ฒฝํ—˜์ด ๋ฐ”๋กœ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ์ด์ œ ์‚ฌ์šฉํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค." [๊ธฐ์‚ฌ]

๋กœ๊ทธ ํ†ตํ•ฉ

1000๋ช…์˜ ๊ฐœ๋ฐœ์ž๋“ค์€ ์•ˆ๋„์˜ ํ•œ์ˆจ์„ ์‰ฌ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ์ˆ˜๋ฐฑ ๊ฐœ์˜ "์ „ํˆฌ" ์„œ๋ฒ„๋งŒ ๋ณด์œ ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๊ฐœ๋ฐœ์ž ์ธก์˜ ์ด ๋ชจ๋“  "๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ๋„ฃ๊ธฐ"๊ฐ€ ์ „ํ˜€ ํŽธ๋ฆฌํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ์Šค์Šค๋กœ ์ˆ˜์ง‘ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค.

PostgreSQL ์ฟผ๋ฆฌ์˜ ๋Œ€๋Ÿ‰ ์ตœ์ ํ™”. ํ‚ค๋ฆด ๋ณด๋กœ๋น„์ฝ”ํ”„(ํ…์„œ)

์ผ๋ฐ˜์ ์œผ๋กœ ํ†ต๊ณ„๋ฅผ ์ˆ˜์ง‘ํ•  ์ˆ˜ ์žˆ๋Š” ํ‘œ์ค€ ๋ชจ๋“ˆ์ด ์žˆ์ง€๋งŒ ๊ตฌ์„ฑ์—์„œ๋„ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. pg_stat_statements ๋ชจ๋“ˆ. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋Š” ์šฐ๋ฆฌ์—๊ฒŒ ์ ํ•ฉํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์ฒซ์งธ, ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋‚ด์—์„œ ๋‹ค๋ฅธ ์ฒด๊ณ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ผํ•œ ์ฟผ๋ฆฌ์— ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ QueryId. ์ฆ‰, ๋จผ์ € ํ•ด๋ณด๋ฉด SET search_path = '01'; SELECT * FROM user LIMIT 1;๊ทธ๋ฆฌ๊ณ  ๋‚˜์„œ SET search_path = '02'; ๋™์ผํ•œ ์š”์ฒญ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ด ๋ชจ๋“ˆ์˜ ํ†ต๊ณ„๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๊ธฐ๋ก์„ ๊ฐ–๊ฒŒ ๋˜๋ฉฐ ๊ตฌ์„ฑํ‘œ๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š๊ณ ๋Š” ์ด ์š”์ฒญ ํ”„๋กœํ•„์˜ ๋งฅ๋ฝ์—์„œ ๊ตฌ์ฒด์ ์œผ๋กœ ์ผ๋ฐ˜ ํ†ต๊ณ„๋ฅผ ์ˆ˜์ง‘ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•˜๋Š” ๋‘ ๋ฒˆ์งธ ์ ์€ ๊ณ„ํš์ด ๋ถ€์กฑํ•˜๋‹ค. ์ฆ‰, ๊ณ„ํš์€ ์—†๊ณ  ์š”์ฒญ ์ž์ฒด๋งŒ ์žˆ์„ ๋ฟ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ฌด์—‡์ด ๋Š๋ ค์ง€๊ณ  ์žˆ๋Š”์ง€ ์•Œ์ง€๋งŒ ๊ทธ ์ด์œ ๋ฅผ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” ๋น ๋ฅด๊ฒŒ ๋ณ€ํ™”ํ•˜๋Š” ๋ฐ์ดํ„ฐ ์„ธํŠธ์˜ ๋ฌธ์ œ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰ ์ˆœ๊ฐ„ - "์‚ฌ์‹ค"์˜ ๋ถ€์กฑ. ์ฆ‰, ์ฟผ๋ฆฌ ์‹คํ–‰์˜ ํŠน์ • ์ธ์Šคํ„ด์Šค๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์•„๋ฌด ๊ฒƒ๋„ ์—†๊ณ  ์ง‘๊ณ„๋œ ํ†ต๊ณ„๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์œผ๋กœ ์ž‘์—…ํ•˜๋Š” ๊ฒƒ์€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๋งค์šฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

PostgreSQL ์ฟผ๋ฆฌ์˜ ๋Œ€๋Ÿ‰ ์ตœ์ ํ™”. ํ‚ค๋ฆด ๋ณด๋กœ๋น„์ฝ”ํ”„(ํ…์„œ)

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ๋ณต์‚ฌ ๋ถ™์—ฌ๋„ฃ๊ธฐ์™€ ์‹ธ์šฐ๊ธฐ๋กœ ๊ฒฐ์‹ฌํ•˜๊ณ  ๊ธ€์“ฐ๊ธฐ๋ฅผ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜์ง‘๊ฐ€.

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

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

๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ๋‘ ๊ฐ€์ง€ ์—ฐ๊ฒฐ์„ "ํ™•์žฅ"ํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ๋Š” ๋กœ๊ทธ ์ž์ฒด๋ฅผ "๋“ฃ๊ณ "์šฐ๋ฆฌ ์ž์‹ ์—๊ฒŒ ๊ฐ€์ ธ์˜ค๊ณ  ๋‘ ๋ฒˆ์งธ๋Š” ์ฃผ๊ธฐ์ ์œผ๋กœ ๊ธฐ์ง€์— ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. "๊ทธ๋Ÿฐ๋ฐ ๋กœ๊ทธ์—๋Š” oid 123์ด๋ผ๋Š” ํ‘œ์‹œ๊ฐ€ ์ฐจ๋‹จ๋˜์–ด ์žˆ๋‹ค๊ณ  ๋‚˜์˜ค๋„ค์š”." ํ•˜์ง€๋งŒ ์ด๋Š” ๊ฐœ๋ฐœ์ž์—๊ฒŒ๋Š” ์•„๋ฌด ์˜๋ฏธ๊ฐ€ ์—†๊ณ , ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— "๊ทธ๋‚˜์ €๋‚˜ OID = 123์ด ๋ญ์ฃ ?"๋ผ๊ณ  ๋ฌผ์–ด๋ณด๋Š” ๊ฒŒ ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ์šฐ๋ฆฌ ์ž์‹ ์— ๋Œ€ํ•ด ์•„์ง ๋ชจ๋ฅด๋Š” ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ์ฃผ๊ธฐ์ ์œผ๋กœ ๊ธฐ์ง€์— ๋ฌป์Šต๋‹ˆ๋‹ค.

PostgreSQL ์ฟผ๋ฆฌ์˜ ๋Œ€๋Ÿ‰ ์ตœ์ ํ™”. ํ‚ค๋ฆด ๋ณด๋กœ๋น„์ฝ”ํ”„(ํ…์„œ)

โ€œ๋‹น์‹ ์ด ๊ณ ๋ คํ•˜์ง€ ์•Š์€ ๊ฒƒ์ด ํ•˜๋‚˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋ผ๋ฆฌ ๊ฐ™์€ ๋ฒŒ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค!..โ€ ์šฐ๋ฆฌ๋Š” 10๋Œ€์˜ ์„œ๋ฒ„๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ์‹ถ์—ˆ์„ ๋•Œ ์ด ์‹œ์Šคํ…œ์„ ๊ฐœ๋ฐœํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฒ˜๋ฆฌํ•˜๊ธฐ ์–ด๋ ค์šด ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ๋ถ€๋ถ„์„ ์ดํ•ดํ•˜๋Š” ๋ฐ ๊ฐ€์žฅ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ XNUMX๋ถ„๊ธฐ ๋™์•ˆ ์šฐ๋ฆฌ๋Š” ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์œ„ํ•ด XNUMX๊ฑด์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ์ด ์ž‘๋™ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋‘๊ฐ€ ์›ํ–ˆ๊ณ  ๋ชจ๋‘๊ฐ€ ํŽธ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ชจ๋“  ๊ฒƒ์„ ํ•ฉ์‚ฐํ•ด์•ผ ํ•˜๋ฉฐ ๋ฐ์ดํ„ฐ ํ๋ฆ„์€ ํฌ๊ณ  ํ™œ๋™์ ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์šฐ๋ฆฌ๊ฐ€ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ๊ฒƒ, ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ PostgreSQL์„ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์šด์˜์ž๋ณด๋‹ค ๋ฐ์ดํ„ฐ๋ฅผ "์Ÿ๋Š”" ์†๋„๊ฐ€ ๋” ๋น ๋ฅธ ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค. COPY ์•„์ง ์•„๋‹˜.

ํ•˜์ง€๋งŒ ๋‹จ์ˆœํžˆ ๋ฐ์ดํ„ฐ๋ฅผ '์Ÿ๋Š”' ๊ฒƒ์€ ์‹ค์ œ๋กœ ์šฐ๋ฆฌ์˜ ๊ธฐ์ˆ ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด 50๊ฐœ์˜ ์„œ๋ฒ„์—์„œ ์ดˆ๋‹น ์•ฝ 100๊ฐœ์˜ ์š”์ฒญ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ํ•˜๋ฃจ์— 150-XNUMXGB์˜ ๋กœ๊ทธ๊ฐ€ ์ƒ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ๋ฒ ์ด์Šค๋ฅผ ์กฐ์‹ฌ์Šค๋Ÿฝ๊ฒŒ "์ ˆ๋‹จ"ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

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

๋‘˜์งธ, ์šฐ๋ฆฌ๋Š” ๋ฐฐ์› ๋‹ค(๊ฐ•์š”๋‹นํ–ˆ๋‹ค) ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ๋งค์šฐ ๋น ๋ฆ…๋‹ˆ๋‹ค. COPY. ์ฆ‰, ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ COPY๊ทธ ์‚ฌ๋žŒ๋ณด๋‹ค ๋น ๋ฅด๋‹ˆ๊นŒ. INSERT, ๊ทธ๋ฆฌ๊ณ  ํ›จ์”ฌ ๋” ๋น ๋ฆ…๋‹ˆ๋‹ค.

PostgreSQL ์ฟผ๋ฆฌ์˜ ๋Œ€๋Ÿ‰ ์ตœ์ ํ™”. ํ‚ค๋ฆด ๋ณด๋กœ๋น„์ฝ”ํ”„(ํ…์„œ)

์„ธ ๋ฒˆ์งธ ์š”์  - ํ•ด์•ผ ํ–ˆ์–ด์š” ํŠธ๋ฆฌ๊ฑฐ์™€ ์™ธ๋ž˜ ํ‚ค๋ฅผ ๊ฐ๊ฐ ํฌ๊ธฐํ•ฉ๋‹ˆ๋‹ค.. ์ฆ‰, ์ฐธ์กฐ ๋ฌด๊ฒฐ์„ฑ์ด ์ „ํ˜€ ์—†์Šต๋‹ˆ๋‹ค. ํ•œ ์Œ์˜ FK๊ฐ€ ์žˆ๋Š” ํ…Œ์ด๋ธ”์ด ์žˆ๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์กฐ์—์„œ "์—ฌ๊ธฐ์— FK์—์„œ ์ฐธ์กฐํ•˜๋Š” ๋กœ๊ทธ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ ˆ์ฝ”๋“œ ๊ทธ๋ฃน์— ๋Œ€ํ•ด"๋ผ๊ณ  ๋งํ•˜๋ฉด ์ด๋ฅผ ์‚ฝ์ž…ํ•˜๋ฉด PostgreSQL์ด ๋‚จ์€ ๊ฒŒ ์—†๊ณ  ์–ด๋–ป๊ฒŒ ๋ฐ›์•„๋“ค์ด๊ณ  ์†”์งํ•˜๊ฒŒ ํ•ด์•ผ ํ•˜๋Š”์ง€ SELECT 1 FROM master_fk1_table WHERE ... ์‚ฝ์ž…ํ•˜๋ ค๋Š” ์‹๋ณ„์ž๋กœ ์ด ๋ ˆ์ฝ”๋“œ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€, ์‚ฝ์ž… ์‹œ ์ด ์™ธ๋ž˜ ํ‚ค๋ฅผ "๋ถ„๋ฆฌ"ํ•˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋Œ€์ƒ ํ…Œ์ด๋ธ”๊ณผ ํ•ด๋‹น ์ธ๋ฑ์Šค์— ๋Œ€ํ•œ ํ•˜๋‚˜์˜ ๋ ˆ์ฝ”๋“œ ๋Œ€์‹  ์ฐธ์กฐํ•˜๋Š” ๋ชจ๋“  ํ…Œ์ด๋ธ”์—์„œ ์ฝ๋Š” ์ถ”๊ฐ€ ์ด์ ์„ ์–ป์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์ด ์ „ํ˜€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ์ž„๋ฌด๋Š” ์ตœ์†Œํ•œ์˜ ๋ถ€ํ•˜๋กœ ์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ๋…น์Œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ FK - ๋‹ค์šด!

๋‹ค์Œ ์š”์ ์€ ์ง‘๊ณ„์™€ ํ•ด์‹ฑ์ž…๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ์ด๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ๋ ˆ์ฝ”๋“œ๊ฐ€ ๋„์ฐฉํ•˜๋ฉด ์ผ์ข…์˜ ํƒœ๋ธ”๋ฆฟ์—์„œ ์ฆ‰์‹œ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ํŠธ๋ฆฌ๊ฑฐ ์˜ค๋ฅธ์ชฝ์— "+ XNUMX"์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.. ํŽธ๋ฆฌํ•˜์ง€๋งŒ ๋‚˜์œ ์ ์€ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ–ˆ์ง€๋งŒ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์—์„œ ๋‹ค๋ฅธ ํ•ญ๋ชฉ์„ ์ฝ๊ณ  ์จ์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ์ฝ๊ณ  ์“ฐ๋Š” ๊ฒƒ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ๋งค๋ฒˆ ํ•˜๋Š” ์ผ๋„ ํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ํŠน์ • ํ˜ธ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•œ ์š”์ฒญ ์ˆ˜๋ฅผ ๊ฐ„๋‹จํžˆ ๊ณ„์‚ฐํ•˜๋Š” ํ…Œ์ด๋ธ”์ด ์žˆ๋‹ค๊ณ  ์ƒ์ƒํ•ด ๋ณด์„ธ์š”. +1, +1, +1, ..., +1. ์›์น™์ ์œผ๋กœ๋Š” ์ด๊ฒƒ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋‘ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค ์ˆ˜์ง‘๊ธฐ์˜ ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ๋Š” ํ•ฉ๊ณ„ ํ•œ ๋ฒˆ์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ์ „์†ก +10.

์˜ˆ, ์ผ๋ถ€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋…ผ๋ฆฌ์  ๋ฌด๊ฒฐ์„ฑ์ด "๋ฌด๋„ˆ์งˆ" ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋Š” ๊ฑฐ์˜ ๋น„ํ˜„์‹ค์ ์ธ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ์„œ๋ฒ„๊ฐ€ ์žˆ๊ณ  ์ปจํŠธ๋กค๋Ÿฌ์— ๋ฐฐํ„ฐ๋ฆฌ๊ฐ€ ์žˆ๊ณ  ํŠธ๋žœ์žญ์…˜ ๋กœ๊ทธ๊ฐ€ ์žˆ๊ณ  ์„œ๋ฒ„์— ๋กœ๊ทธ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํŒŒ์ผ ์‹œ์Šคํ…œ... ์ผ๋ฐ˜์ ์œผ๋กœ ๊ทธ๋Ÿด ๊ฐ€์น˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํŠธ๋ฆฌ๊ฑฐ/FK ์‹คํ–‰์œผ๋กœ ์ธํ•œ ์ƒ์‚ฐ์„ฑ ์†์‹ค์€ ๋ฐœ์ƒํ•˜๋Š” ๋น„์šฉ๋งŒํผ ๊ฐ€์น˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

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

ํ…์ŠคํŠธ(์š”์ฒญ, ๊ณ„ํš, ํ…œํ”Œ๋ฆฟ ๋“ฑ)์—์„œ MD5๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์™„๋ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜์ง‘๊ธฐ ์ธก์—์„œ ์ด๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  ๊ธฐ์„ฑ ID๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— "๋ถ“์Šต๋‹ˆ๋‹ค". MD5์˜ ๊ธธ์ด์™€ ์ผ์ผ ํŒŒํ‹ฐ์…”๋‹์„ ํ†ตํ•ด ์ถฉ๋Œ ๊ฐ€๋Šฅ์„ฑ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

PostgreSQL ์ฟผ๋ฆฌ์˜ ๋Œ€๋Ÿ‰ ์ตœ์ ํ™”. ํ‚ค๋ฆด ๋ณด๋กœ๋น„์ฝ”ํ”„(ํ…์„œ)

ํ•˜์ง€๋งŒ ์ด ๋ชจ๋“  ๊ฒƒ์„ ๋น ๋ฅด๊ฒŒ ๋…น์Œํ•˜๋ ค๋ฉด ๋…น์Œ ์ ˆ์ฐจ ์ž์ฒด๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ณดํ†ต ์–ด๋–ป๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์“ฐ์‹œ๋‚˜์š”? ์šฐ๋ฆฌ๋Š” ์ผ์ข…์˜ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ์ด๋ฅผ ์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ”๋กœ ๋ถ„ํ• ํ•œ ๋‹ค์Œ ์ด๋ฅผ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋จผ์ € ์ฒซ ๋ฒˆ์งธ, ๋‘ ๋ฒˆ์งธ, ์„ธ ๋ฒˆ์งธ๋กœ... ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ์„ ์„ธ ๋‹จ๊ณ„๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ ๊ฐ™์•„์„œ ๋ถˆํŽธํ•ฉ๋‹ˆ๋‹ค. ์ˆœ์ฐจ์ ์œผ๋กœ. ๋ถˆ์พŒํ•œ. ๋” ๋นจ๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹โ€‹โ€‹์žˆ์Šต๋‹ˆ๊นŒ? ํ•  ์ˆ˜ ์žˆ๋‹ค!

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

PostgreSQL ์ฟผ๋ฆฌ์˜ ๋Œ€๋Ÿ‰ ์ตœ์ ํ™”. ํ‚ค๋ฆด ๋ณด๋กœ๋น„์ฝ”ํ”„(ํ…์„œ)

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

๋˜ํ•œ ์ด๋Ÿฌํ•œ ๋กœ๋“œ ํ”„๋กœํ•„์˜ ๊ฒฝ์šฐ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ผ๊ด„์ ์œผ๋กœ ์ˆ˜์ง‘ํ•˜๋Š” ์ง‘๊ณ„๋Š” ์ข‹์ง€ ์•Š๋‹ค๋Š” ์‚ฌ์‹ค๋„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ณ ์ „์ ์ธ ์•…์€ INSERT ... VALUES ๊ทธ๋ฆฌ๊ณ  ์ถ”๊ฐ€๋กœ 1000๊ฐœ์˜ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์‹œ์ ์— ๋ฏธ๋””์–ด์— ์ตœ๋Œ€ ์“ฐ๊ธฐ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ๋””์Šคํฌ์— ๋ฌด์–ธ๊ฐ€๋ฅผ ์“ฐ๋ ค๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  ์‚ฌ๋žŒ์ด ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์„ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ด์ƒ ํ˜„์ƒ์„ ์ œ๊ฑฐํ•˜๋ ค๋ฉด ์•„๋ฌด ๊ฒƒ๋„ ์ง‘๊ณ„ํ•˜์ง€ ๋งˆ์„ธ์š”. ์ „ํ˜€ ๋ฒ„ํผ๋งํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๊ทธ๋ฆฌ๊ณ  ๋””์Šคํฌ์— ๋Œ€ํ•œ ๋ฒ„ํผ๋ง์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ(๋‹คํ–‰ํžˆ Node.js์˜ Stream API๋ฅผ ํ†ตํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ) ์ด ์—ฐ๊ฒฐ์„ ์—ฐ๊ธฐํ•˜์„ธ์š”. ๋‹ค์‹œ ๋ฌด๋ฃŒ๋ผ๋Š” ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›์œผ๋ฉด ๋ˆ„์ ๋œ ๋Œ€๊ธฐ์—ด์—์„œ ์ด๋ฒคํŠธ์— ์”๋‹ˆ๋‹ค. ๋ฐ”์œ ๋™์•ˆ ํ’€์—์„œ ๋‹ค์Œ ๋ฌด๋ฃŒ ํ•ญ๋ชฉ์„ ๊ฐ€์ ธ์™€์„œ ์ž‘์„ฑํ•˜์„ธ์š”.

๋ฐ์ดํ„ฐ ๊ธฐ๋ก์— ์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ๋„์ž…ํ•˜๊ธฐ ์ „์—๋Š” ์•ฝ 4K ์“ฐ๊ธฐ ์ž‘์—…์ด ์žˆ์—ˆ๊ณ  ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ๋กœ๋“œ๊ฐ€ 4๋ฐฐ โ€‹โ€‹๊ฐ์†Œํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์ƒˆ๋กœ์šด ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ์ธํ•ด ์ตœ๋Œ€ 6MB/s๊นŒ์ง€ 100๋ฐฐ ๋” ์„ฑ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด์ œ ์šฐ๋ฆฌ๋Š” ๋ชจ๋“  ๊ฐœ๋ฐœ์ž๊ฐ€ ๋‹จ 3๊ฐœ์›” ์•ˆ์— ๋ชจ๋“  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ผ๋ฉด์„œ ์ง€๋‚œ 10๊ฐœ์›” ๋™์•ˆ์˜ ๋กœ๊ทธ๋ฅผ ์•ฝ 15-XNUMXTB์˜ ๋ณผ๋ฅจ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๋ฌธ์ œ๋ฅผ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค

๊ทธ๋Ÿฌ๋‚˜ ๋‹จ์ˆœํžˆ ์ด ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ๊ฒƒ์€ ํ›Œ๋ฅญํ•˜๊ณ  ์œ ์šฉํ•˜๋ฉฐ ๊ด€๋ จ์„ฑ์ด ์žˆ์ง€๋งŒ ์ถฉ๋ถ„ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์ดํ•ด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋ฃจ์— ์ˆ˜๋ฐฑ๋งŒ ๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ๊ณ„ํš์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

PostgreSQL ์ฟผ๋ฆฌ์˜ ๋Œ€๋Ÿ‰ ์ตœ์ ํ™”. ํ‚ค๋ฆด ๋ณด๋กœ๋น„์ฝ”ํ”„(ํ…์„œ)

ํ•˜์ง€๋งŒ ์ˆ˜๋ฐฑ๋งŒ ๋‹ฌ๋Ÿฌ๋Š” ๊ด€๋ฆฌํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋จผ์ € "๋” ์ž‘๊ฒŒ" ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์šฐ์„ , ์ด "๋” ์ž‘์€" ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ์ •๋ฆฌํ•  ๊ฒƒ์ธ์ง€ ๊ฒฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์„ธ ๊ฐ€์ง€ ํ•ต์‹ฌ ์‚ฌํ•ญ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.

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

"๋ˆ„๊ฐ€" ์š”์ฒญ์„ ๋ณด๋ƒˆ๋Š”์ง€ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ํ‘œ์ค€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ธ์…˜ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. SET application_name = '{bl-host}:{bl-method}'; โ€” ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ํ˜ธ์ŠคํŠธ์˜ ์ด๋ฆ„๊ณผ ์š”์ฒญ์„ ์‹œ์ž‘ํ•œ ๋ฉ”์„œ๋“œ ๋˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ด๋ฆ„์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

์š”์ฒญ์˜ "์†Œ์œ ์ž"๋ฅผ ์ „๋‹ฌํ•œ ํ›„์—๋Š” ๋กœ๊ทธ์— ์ถœ๋ ฅ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ๋ณ€์ˆ˜๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. log_line_prefix = ' %m [%p:%v] [%d] %r %a'. ๊ด€์‹ฌ ์žˆ์œผ์‹  ๋ถ„๋“ค์€ ์•„๋งˆ๋„ ์„ค๋ช…์„œ๋ฅผ ๋ด๊ทธ๊ฒŒ ๋‹ค ๋ฌด์Šจ ๋œป์ด์•ผ? ๋กœ๊ทธ์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‚ด์šฉ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

  • ์‹œ๊ฐ„
  • ํ”„๋กœ์„ธ์Šค ๋ฐ ํŠธ๋žœ์žญ์…˜ ์‹๋ณ„์ž
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด๋ฆ„
  • ์ด ์š”์ฒญ์„ ๋ณด๋‚ธ ์‚ฌ๋žŒ์˜ IP
  • ๋ฐ ๋ฉ”์†Œ๋“œ ์ด๋ฆ„

PostgreSQL ์ฟผ๋ฆฌ์˜ ๋Œ€๋Ÿ‰ ์ตœ์ ํ™”. ํ‚ค๋ฆด ๋ณด๋กœ๋น„์ฝ”ํ”„(ํ…์„œ)

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

์ž ์—ฌ๊ธฐ ์ปท์ด ์žˆ์Šต๋‹ˆ๋‹ค "ํ•˜๋‚˜์˜ ์„œ๋ฒ„ - ํ•˜๋ฃจ" ์–ด๋–ค ๋ถ„์„์—๋„ ์ถฉ๋ถ„ํ•˜๋‹ค๋Š” ๊ฒƒ์ด ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ ๋ถ„์„ ์„น์…˜์€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. "๊ฒฌ๋ณธ" - ๋ชจ๋“  ์ˆ˜์น˜ ์ง€ํ‘œ๊ฐ€ ์‚ญ์ œ๋œ ๊ณ„ํš ์ œ์‹œ์˜ ์ถ•์•ฝ๋œ ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ์ปท์€ ์ ์šฉ์ด๋‚˜ ๋ฐฉ๋ฒ•์ด๊ณ , ์„ธ ๋ฒˆ์งธ ์ปท์€ ์šฐ๋ฆฌ์—๊ฒŒ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚จ ํŠน์ • ๊ณ„ํš ๋…ธ๋“œ์ž…๋‹ˆ๋‹ค.

ํŠน์ • ์ธ์Šคํ„ด์Šค์—์„œ ํ…œํ”Œ๋ฆฟ์œผ๋กœ ์ „ํ™˜ํ•˜๋ฉด ํ•œ ๋ฒˆ์— ๋‘ ๊ฐ€์ง€ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

PostgreSQL ์ฟผ๋ฆฌ์˜ ๋Œ€๋Ÿ‰ ์ตœ์ ํ™”. ํ‚ค๋ฆด ๋ณด๋กœ๋น„์ฝ”ํ”„(ํ…์„œ)

๋‚˜๋จธ์ง€ ๋ฐฉ๋ฒ•์€ ๊ณ„ํš์—์„œ ์ถ”์ถœํ•œ ์ง€ํ‘œ(์ด๋Ÿฌํ•œ ํŒจํ„ด์ด ๋ฐœ์ƒํ•œ ํšŸ์ˆ˜, ์ „์ฒด ๋ฐ ํ‰๊ท  ์‹œ๊ฐ„, ๋””์Šคํฌ์—์„œ ์ฝ์€ ๋ฐ์ดํ„ฐ์˜ ์–‘, ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ฝ์€ ๋ฐ์ดํ„ฐ์˜ ์–‘)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ํ˜ธ์ŠคํŠธ์— ๋Œ€ํ•œ ๋ถ„์„ ํŽ˜์ด์ง€๋ฅผ ๋ฐฉ๋ฌธํ–ˆ์„ ๋•Œ ๋””์Šคํฌ์—์„œ ๋ฌด์–ธ๊ฐ€๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์ด ์ฝ๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„์˜ ๋””์Šคํฌ๊ฐ€ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ฐ€ ์ด๋ฅผ ์ฝ์Šต๋‹ˆ๊นŒ?

๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“  ์—ด์„ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•˜๊ณ  ์ง€๊ธˆ ์ฒ˜๋ฆฌํ•  ํ•ญ๋ชฉ(ํ”„๋กœ์„ธ์„œ๋‚˜ ๋””์Šคํฌ์˜ ๋กœ๋“œ ๋˜๋Š” ์ด ์š”์ฒญ ์ˆ˜)์„ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ์ •๋ ฌํ•˜๊ณ  "์ƒ์œ„" ํ•ญ๋ชฉ์„ ์‚ดํŽด๋ณด๊ณ  ์ˆ˜์ •ํ•œ ๋‹ค์Œ ์ƒˆ๋กœ์šด ๋ฒ„์ „์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ถœ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค.
[๋™์˜์ƒ๊ฐ•์˜]

๊ทธ๋ฆฌ๊ณ  ์ฆ‰์‹œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์š”์ฒญ์—์„œ ๋™์ผํ•œ ํ…œํ”Œ๋ฆฟ๊ณผ ํ•จ๊ป˜ ์ œ๊ณต๋˜๋Š” ๋‹ค์–‘ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. SELECT * FROM users WHERE login = 'Vasya'. ํ”„๋ก ํŠธ์—”๋“œ, ๋ฐฑ์—”๋“œ, ์ฒ˜๋ฆฌ... ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ์ƒํ˜ธ ์ž‘์šฉํ•˜์ง€ ์•Š๋Š”๋ฐ ์ฒ˜๋ฆฌ๊ฐ€ ์‚ฌ์šฉ์ž๋ฅผ ์ฝ๋Š” ์ด์œ ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜๋Œ€ ๋ฐฉ๋ฒ•์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์„ ์ฆ‰์‹œ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ”„๋ŸฐํŠธ์—”๋“œ๋Š” this, this, this, this๋กœ ํ•œ ์‹œ๊ฐ„์— ํ•œ ๋ฒˆ(ํƒ€์ž„๋ผ์ธ์ด ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค)์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ฆ‰์‹œ ์งˆ๋ฌธ์ด ๋– ์˜ค๋ฆ…๋‹ˆ๋‹ค. ํ•œ ์‹œ๊ฐ„์— ํ•œ ๋ฒˆ์”ฉ ๋ญ”๊ฐ€๋ฅผ ํ•˜๋Š” ๊ฒƒ์ด ํ”„๋ก ํŠธ์—”๋“œ์˜ ์ผ์ด ์•„๋‹Œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค...

PostgreSQL ์ฟผ๋ฆฌ์˜ ๋Œ€๋Ÿ‰ ์ตœ์ ํ™”. ํ‚ค๋ฆด ๋ณด๋กœ๋น„์ฝ”ํ”„(ํ…์„œ)

์–ผ๋งˆ ํ›„ ์šฐ๋ฆฌ๋Š” ์ง‘๊ณ„๊ฐ€ ๋ถ€์กฑํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ๊ณ„ํš ๋…ธ๋“œ๋ณ„ ํ†ต๊ณ„. ์šฐ๋ฆฌ๋Š” ํ…Œ์ด๋ธ” ์ž์ฒด์˜ ๋ฐ์ดํ„ฐ๋กœ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋…ธ๋“œ(์ธ๋ฑ์Šค๋กœ ์ฝ๊ธฐ/์“ฐ๊ธฐ ์—ฌ๋ถ€)๋งŒ ๊ณ„ํš์—์„œ ๊ฒฉ๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค, ์ด์ „ ์‚ฌ์ง„์— ๋น„ํ•ด ํ•œ ๊ฐ€์ง€ ์ธก๋ฉด๋งŒ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋…ธ๋“œ๊ฐ€ ์šฐ๋ฆฌ์—๊ฒŒ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๊ธฐ๋ก์„ ๊ฐ€์ ธ์™”๋‚˜์š”?๋ฐ ์‚ญ์ œ๋œ ์ˆ˜(ํ•„ํ„ฐ์— ์˜ํ•ด ์ œ๊ฑฐ๋œ ํ–‰).

ํ”Œ๋ ˆ์ดํŠธ์— ์ ํ•ฉํ•œ ์ธ๋ฑ์Šค๊ฐ€ ์—†๊ณ  ์š”์ฒญ์„ ํ•˜๋ฉด ์ธ๋ฑ์Šค๋ฅผ ์ง€๋‚˜์„œ Seq Scan์— ๋“ค์–ด๊ฐ€๊ณ ... ํ•˜๋‚˜๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ๋ฅผ ํ•„ํ„ฐ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋ฃจ์— 100์–ต ๊ฐœ์˜ ํ•„ํ„ฐ๋ง๋œ ๋ ˆ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ธ๋ฑ์Šค๋ฅผ ๋กค์—…ํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚ซ์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

PostgreSQL ์ฟผ๋ฆฌ์˜ ๋Œ€๋Ÿ‰ ์ตœ์ ํ™”. ํ‚ค๋ฆด ๋ณด๋กœ๋น„์ฝ”ํ”„(ํ…์„œ)

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

์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•œ ๋ชจ๋“  ์‚ฌ๋žŒ์€ ์•„๋งˆ๋„ "Vasya์˜ ๋งˆ์ง€๋ง‰ ์ฃผ๋ฌธ, ๋‚ ์งœ๋ฅผ ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค."๋ผ๋Š” ํŒจํ„ด์„ ์ ‘ํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚ ์งœ๋ณ„ ์ƒ‰์ธ์ด ์—†๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•œ ์ƒ‰์ธ์— ๋‚ ์งœ๊ฐ€ ์—†๋‹ค๋ฉด ๋˜‘๊ฐ™์€ "๊ฐˆํ€ด"๋ฅผ ๋ฐŸ์œผ์„ธ์š”.

๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์ด "๊ฐˆํ€ด"๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋ฌด์—‡์„ ํ•ด์•ผ ํ•˜๋Š”์ง€ ์ฆ‰์‹œ ์•Œ๋ ค์ฃผ๋Š” ๊ฒƒ์€ ์–ด๋–จ๊นŒ์š”? ๋”ฐ๋ผ์„œ ์ง€๊ธˆ ๊ณ„ํš์„ ์—ด ๋•Œ ์šฐ๋ฆฌ ๊ฐœ๋ฐœ์ž๋Š” ํŒ์ด ํฌํ•จ๋œ ์•„๋ฆ„๋‹ค์šด ๊ทธ๋ฆผ์„ ์ฆ‰์‹œ ๋ณด๊ณ  "์—ฌ๊ธฐ ์ €๊ธฐ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์ง€๋งŒ ์ด ๋ฐฉ๋ฒ• ์ € ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค."๋ผ๊ณ  ์ฆ‰์‹œ ๋งํ•ฉ๋‹ˆ๋‹ค.

๊ทธ ๊ฒฐ๊ณผ ์ฒ˜์Œ์—๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ํ•„์š”ํ–ˆ๋˜ ๊ฒฝํ—˜๋Ÿ‰์ด ์ง€๊ธˆ์€ ํฌ๊ฒŒ ์ค„์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ข…๋ฅ˜์˜ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

PostgreSQL ์ฟผ๋ฆฌ์˜ ๋Œ€๋Ÿ‰ ์ตœ์ ํ™”. ํ‚ค๋ฆด ๋ณด๋กœ๋น„์ฝ”ํ”„(ํ…์„œ)

์ถœ์ฒ˜ : habr.com

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