๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • Round and Round
DB/SQLP

[SQLP] 1-3. SQL ๊ณต์œ  ๋ฐ ์žฌ์‚ฌ์šฉ

by ํ‰๊ธ€ํ‰๊ธ€ 2025. 2. 9.

๐Ÿงท SQL ๊ณต์œ  ๋ฐ ์žฌ์‚ฌ์šฉ

๐Ÿ–‡๏ธ ์†Œํ”„ํŠธ ํŒŒ์‹ฑ VS ํ•˜๋“œ ํŒŒ์‹ฑ

SGA(System Global Area)๋Š” ์„œ๋ฒ„ ํ”„๋กœ์„ธ์Šค์™€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ณตํ†ต์ ์œผ๋กœ ์•ก์„ธ์Šค ํ•˜๋Š” ๋ฐ์ดํ„ฐ์™€ ์ œ์–ด๊ตฌ์กฐ๋ฅผ ์บ์‹ฑํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด๋‹ค. SGA ๊ตฌ์„ฑ์š”์†Œ ์ค‘์— SQLํŒŒ์‹ฑ, ์ตœ์ ํ™”, ๋กœ์šฐ ์†Œ์Šค ์ƒ์„ฑ ๊ณผ์ •์„ ๊ฑฐ์ณ ์ƒ์„ฑํ•œ ๋‚ด๋ถ€ ํ”„๋กœ์‹œ์ €๋ฅผ ๋ฐ˜๋ณต ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์บ์‹ฑํ•ด ๋‘๋Š” ๊ณต๊ฐ„์„  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์บ์‹œ(Library Cache) ์ด๋ผ๊ณ  ํ•œ๋‹ค.

 

SGA ๊ตฌ์กฐ

 

  • ์†Œํ”„ํŠธ ํŒŒ์‹ฑ(Soft Parsing) : SQL ํŒŒ์‹ฑ ํ›„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์บ์‹œ์— ํ•ด๋‹น SQL์ด ์กด์žฌํ•˜๋ฉด ๋ฐ”๋กœ ์‹คํ–‰ํ•œ๋‹ค.
  • ํ•˜๋“œ ํŒŒ์‹ฑ(Hard Parsing) : ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์บ์‹œ์— SQL์ด ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ์ตœ์ ํ™” ๋ฐ ๋กœ์šฐ ์ƒ์„ฑ ๊ณผ์ •์„ ๊ฑฐ์นœ๋‹ค.
ํ•˜๋“œ ํŒŒ์‹ฑ์ด ๋А๋ฆฐ ์ด์œ  

 

 ํ•˜๋“œ ํŒŒ์‹ฑ(Hard Parsing)์€ ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์ตœ์ ํ™”ํ•˜๋Š” ๋™์•ˆ ๋งŽ์€ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์‹คํ–‰ ๊ฒฝ๋กœ๋ฅผ ๊ฒฐ์ •ํ•ด์•ผ ํ•˜๋ฏ€๋กœ CPU ์†Œ๋ชจ๊ฐ€ ํฌ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ๋‹ค์Œ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ๊ณ ๋ คํ•œ๋‹ค.

 

  • ํ…Œ์ด๋ธ”, ์นผ๋Ÿผ, ์ธ๋ฑ์Šค ๊ตฌ์กฐ์— ๊ด€ํ•œ ๊ธฐ๋ณธ ์ •๋ณด
  • ์˜ค๋ธŒ์ ํŠธ ํ†ต๊ณ„ : ํ…Œ์ด๋ธ” ํ†ต๊ณ„, ์ธ๋ฑ์Šค ํ†ต๊ณ„, (ํžˆ์Šคํ† ๊ทธ๋žจ์„ ํฌํ•จํ•œ) ์นผ๋Ÿผ ํ†ต๊ณ„
  • ์‹œ์Šคํ…œ ํ†ต๊ณ„ : CPU ์†๋„, Single Block I/O ์†๋„, Multiblock I/O ์†๋„ ๋“ฑ
  • ์˜ตํ‹ฐ๋งˆ์ด์ € ๊ด€๋ จ ํŒŒ๋ผ๋ฏธํ„ฐ

์ด ๊ณผ์ •์„ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์บ์‹œ์—์„œ ๋‚ด๋ถ€ ํ”„๋กœ์‹œ์ €๋ฅผ ์žฌ์‚ฌ์šฉํ•˜์—ฌ ํšจ์œจ์„ฑ์„ ๋†’์ธ๋‹ค.

 

๐Ÿ–‡๏ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์บ์‹œ

Shared Pool ๋‚ด์— ์œ„์น˜ํ•˜๊ณ , SQL ๊ณต์œ  ์ปค์„œ, PL/SQL ์˜ค๋ธŒ์ ํŠธ(์ปดํŒŒ์ผ์„ ๊ฑฐ์นœ ํ”„๋กœ์‹œ์ €, ํ•จ์ˆ˜ ๋“ฑ) ๋ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์˜ค๋ธŒ์ ํŠธ(ํ…Œ์ด๋ธ”, ์ธ๋ฑ์Šค ๋“ฑ)์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์บ์‹ฑํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด๋‹ค. ์ฝ”๋“œ ์บ์‹œ๋ผ๊ณ ๋„ ๋ถ€๋ฅธ๋‹ค.

1. ์บ์‹œ ์ •๋ณด์˜ ์ข…๋ฅ˜์™€ ๋ถ„๋ฅ˜ ๊ธฐ์ค€

(1) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์บ์‹œ ์˜ค๋ธŒ์ ํŠธ(LCO)

LCO : ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์บ์‹œ ๋‚ด ์ €์žฅ๋˜๋Š” ์ •๋ณด ๋‹จ์œ„

  • ์‹คํ–‰๊ฐ€๋Šฅ LCO : SQL ์ปค์„œ์™€ PL/SQL ์˜ค๋ธŒ์ ํŠธ์ฒ˜๋Ÿผ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์˜ค๋ธŒ์ ํŠธ
  • ์˜ค๋ธŒ์ ํŠธ LCO : ์ฐธ์กฐํ•˜๋Š” ํ…Œ์ด๋ธ”, ์ธ๋ฑ์Šค, ํด๋Ÿฌ์Šคํ„ฐ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ •๋ณด๋“ค๋„ ํ•˜๋‚˜์˜ ์˜ค๋ธŒ์ ํŠธ๋กœ์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์บ์‹œ์— ์ €์žฅ
  • LCO ๊ฐ๊ฐ์—๋Š” ์ž์‹ ์„ ์ฐธ์กฐํ•˜๋Š” ๋‹ค๋ฅธ ์‹คํ–‰๊ฐ€๋Šฅ LCO ๋ชฉ๋ก์„ ๊ฐ–๋Š”๋‹ค.
    • ์Šคํ‚ค๋งˆ ์˜ค๋ธŒ์ ํŠธ ์ •๋ณด์˜ ๊ฒฝ์šฐ, ๋”•์…”๋„ˆ๋ฆฌ ์บ์‹œ์—๋„ ์บ์‹ฑ๋˜์–ด ์žˆ์Œ์—๋„ LCO ๊ฐ„ ์˜์กด์„ฑ์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ค‘๋ณต ์ €์žฅ ๊ด€๋ฆฌํ•œ๋‹ค.

(2) ๋ณด๊ด€ ๊ธฐ๊ฐ„

  • Stored Object : ์ƒ์„ฑ ํ›„ Drop ํ•˜๊ธฐ ์ „๊นŒ์ง€ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ์˜๊ตฌ์ ์œผ๋กœ ๋ณด๊ด€๋˜๋Š” ์˜ค๋ธŒ์ ํŠธ ์ •๋ณด
    • ์˜ˆ : ํ…Œ์ด๋ธ”, ์ธ๋ฑ์Šค, ํด๋Ÿฌ์Šคํ„ฐ, ๋ทฐ, ํŠธ๋ฆฌ๊ฑฐ, ํŒจํ‚ค์ง€, ์‚ฌ์šฉ์ž ์ •์˜ ํ•จ์ˆ˜/ํ”„๋กœ์‹œ์ € ๋“ฑ
    • ์ƒ์„ฑ๋  ๋•Œ๋ถ€ํ„ฐ ์ด๋ฆ„์„ ๊ฐ€์ง€๋Š” ๊ฒƒ์ด ํŠน์ง•
  • Transient Object : ์‹คํ–‰์‹œ์ ์— ์ƒ์„ฑ๋ผ์„œ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋– ์žˆ๋Š” ๋™์•ˆ์—๋งŒ ์กด์žฌํ•˜๋Š” ์ผ์‹œ์ ์ธ ์˜ค๋ธŒ์ ํŠธ ์ •๋ณด (ex, Anonymous)
    • ์˜ˆ : ์ปค์„œ, Anonymous PL/SQL๋ฌธ
    • ์ด๋ฆ„์„ ๋”ฐ๋กœ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฌธ์žฅ์„ ๊ตฌ์„ฑํ•˜๋Š” ์ „์ฒด ๋ฌธ์ž์—ด์ด ์ด๋ฆ„ ์—ญํ• ์„ ํ•œ๋‹ค.

2. ์บ์‹ฑ ๊ด€๋ฆฌ ๋ฐฉ๋ฒ•

(1) LRU ์•Œ๊ณ ๋ฆฌ์ฆ˜

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์บ์‹œ๋Š” Shared Pool ๋‚ด์— ์œ„์น˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— LRU ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ†ตํ•ด ๊ด€๋ฆฌ๋˜๊ณ  ์žˆ๋‹ค. (Shared Pool๋„ DB ๋ฒ„ํผ ์บ์‹œ์ฒ˜๋Ÿผ LRU ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ด์šฉ) ์‚ฌ์šฉ๋นˆ๋„๊ฐ€ ๋‚ฎ์€ SQL์€ ์บ์‹œ์—์„œ ๋ฐ€์–ด๋ƒ„์œผ๋กœ์จ ์ƒˆ๋กœ์šด SQL์„ ์บ์‹ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ณต๊ฐ„์„ ํ™•๋ณดํ•œ๋‹ค.

(2) ํ•ด์‹œ๊ตฌ์กฐ

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์บ์‹œ๋„ DB ๋ฒ„ํผ ์บ์‹œ์ฒ˜๋Ÿผ ํ•ด์‹œ ๊ตฌ์กฐ๋กœ ๊ด€๋ฆฌ๋œ๋‹ค. ์ฆ‰, ํ•ด์‹œ ๋ฒ„ํ‚ท์— LCO ํ•ธ๋“ค(LOC์„ ์‹๋ณ„ํ•˜๊ณ  ํž™์„ ํฌ์ธํŠธ ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ)์ด ์ฒด์ธ์œผ๋กœ ์—ฐ๊ฒฐ๋ผ ์žˆ๊ณ , ํ•ธ๋“ค์„ ํ†ตํ•ด LCO Heap์„ ์ฐพ์•„๊ฐ€๋Š” ๊ตฌ์กฐ๋‹ค. ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋ฆฌํ„ด๋œ ํ•ด์‹œ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ํ•ด์‹œ ๋ฒ„ํ‚ท์„ ํ• ๋‹นํ•œ๋‹ค.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์บ์‹œ ํ•ด์‹œ ๊ตฌ์กฐ

(3) ์ปค์„œ

์˜ค๋ธŒ์ ํŠธ LCO(ํ…Œ์ด๋ธ” ์ •๋ณด)์™€ ์‹คํ–‰๊ฐ€๋Šฅ LCO(SQL ์ปค์„œ)๊ฐ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์บ์‹œ์— ํ•จ๊ป˜ ์ ์žฌ๋˜์–ด ์žˆ๋‹ค. ์ปค์„œ๋Š” Parent ์ปค์„œ ๋ฐ‘์— Child ์ปค์„œ๊ฐ€ ์—ฐ๊ฒฐ๋˜๋Š” ๊ตฌ์กฐ๋ฅผ ๊ฐ–๋Š”๋‹ค. SQL์ด ๋™์ผํ•ด๋„ ์ปค์„œ๋ฅผ ๊ณต์œ ํ•˜์ง€ ๋ชปํ•˜๊ณ  ๋ณ„๋„๋กœ ์ƒ์„ฑํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ๋Š”๋ฐ, ๊ทธ๋Ÿด ๋•Œ ๋‹ค์ค‘ Child ์ปค์„œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

3. Latch

Latch : ๋ฉ”๋ชจ๋ฆฌ ๋‚ด ์ž์›์— ๋Œ€ํ•ด ๋™์‹œ ์ ‘๊ทผ ํ•  ๋•Œ, ์กฐ์œจํ•˜๊ณ  ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋„๋ก ๋„์™€์ฃผ๋Š” ์ผ์ข…์˜ ์ž ๊ธˆ์žฅ์น˜

(1) Shared Pool ๋ž˜์น˜

Shared Pool์—์„œ ํŠน์ • ์˜ค๋ธŒ์ ํŠธ ์ •๋ณด ๋˜๋Š” SQL ์ปค์„œ๋ฅผ ์œ„ํ•œ Free Chunk๋ฅผ ํ• ๋‹น๋ฐ›์œผ๋ ค ํ•  ๋•Œ ํ•„์š”ํ•œ ๋ž˜์น˜๊ฐ€ Shared Pool ๋ž˜์น˜์ด๋‹ค. ์ด์ „์—๋Š” ๋ž˜์น˜ 1๊ฐœ๋กœ ๊ด€๋ฆฌํ•˜์˜€์ง€๋งŒ, 9i๋ถ€ํ„ฐ๋Š” 7๊ฐœ๊นŒ์ง€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ, ๋™์‹œ ์‚ฌ์šฉ์ž๊ฐ€ ์ˆœ๊ฐ„์ ์œผ๋กœ ๊ณผ๋„ํ•œ ํ•˜๋“œ ํŒŒ์‹ฑ ๋ถ€ํ•˜๋ฅผ ์ผ์œผํ‚จ๋‹ค๋ฉด Shared Pool ๋ž˜์น˜์— ๋Œ€ํ•œ ๊ฒฝํ•ฉํ˜„์ƒ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

(2) Library Cache ๋ž˜์น˜

DB ๋ฒ„ํผ ์บ์‹œ์—์„œ ์ฒด์ธ์— ์—ฐ๊ฒฐ๋œ ๋ฆฌ์ŠคํŠธ ๊ตฌ์กฐ๋ฅผ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•ด Cache Buffers Chains ๋ž˜์น˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์บ์‹œ ์ฒด์ธ์„ ํƒ์ƒ‰ํ•˜๊ณ  ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ๋จผ์ € Library Cache ๋ž˜์น˜๋ฅผ ํš๋“ํ•ด์•ผ ํ•œ๋‹ค. ์ด์— ๋Œ€ํ•œ ๊ฒฝํ•ฉ์ด ๋ฐœ์ƒํ•  ๋•Œ, latch : library cache ๋Œ€๊ธฐ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

Library Cache๊ฐ€ ๋งŽ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ํ•˜๋“œ ํŒŒ์‹ฑ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์†Œํ”„ํŠธ ํŒŒ์‹ฑ์ด ๋งŽ์ด ๋ฐœ์ƒํ•ด๋„ ๋ž˜์น˜์— ๋Œ€ํ•œ ๊ฒฝํ•ฉ์ด ์ฆ๊ฐ€ํ•˜๊ฒŒ ๋œ๋‹ค.

(3) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์บ์‹œ Lock / Pin

DB ๋ฒ„ํผ ์บ์‹œ์—์„œ ๋ฒ„ํผ ์ž์ฒด๋ฅผ ๋ณดํ˜ธํ•˜๋ ค๊ณ  ๋ฒ„ํผ Lock์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ LCO๋ฅผ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์บ์‹œ Lock / Pin์„ ์‚ฌ์šฉํ•œ๋‹ค. LCO์— ์ ‘๊ทผํ•  ๋•Œ๋Š” ๋จผ์ € ํ•ธ๋“ค์— ๋Œ€ํ•œ Lock์„ ํš๋“ํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๊ณ  ๋‚˜์„œ, LCO์˜ ์‹ค์ œ๋‚ด์šฉ์ด ๋‹ด๊ธด ํž™์—์„œ ์ •๋ณด๋ฅผ ์ฝ๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•  ๋•Œ๋Š” Pin์„ ๊ฑธ์–ด๋‘์–ด์•ผ ํ•œ๋‹ค. ์ฆ‰, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์บ์‹œ ํž™์„ Pin ํ•˜๋ ค๋ฉด ๋จผ์ € ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์บ์‹œ Lock์„ ํš๋“ํ•ด์•ผ ํ•œ๋‹ค.

 

Lock์„ ํ†ตํ•ด LCO ํ•ธ๋“ค์„ ๋ณดํ˜ธํ•˜๊ณ , Pin์€ LCO์— ์‹ค์ œ๋กœ ๋‹ด๊ธด Heap์„ ๋ณดํ˜ธํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด LCO์„ ์ฝ๊ณ , ์“ฐ๊ณ , ์‹คํ–‰ํ•˜๋Š” ๋™์•ˆ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์— ์˜ํ•ด ์ •๋ณด๊ฐ€ ๋ณ€๊ฒฝ๋˜๊ฑฐ๋‚˜ ์บ์‹œ์— ๋ฐ€๋ ค๋‚˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•œ๋‹ค.

(4) ๊ฒฝํ•ฉํ˜„์ƒ

  • Shared Pool ๋ž˜์น˜ / Library Catch ๋ž˜์น˜ ๊ฒฝํ•ฉ์€ ์†Œํ”„ํŠธ/ํ•˜๋“œ ํŒŒ์‹ฑ์„ ๋™์‹œ์— ์‹ฌํ•˜๊ฒŒ ์ผ์œผํ‚ฌ ๋•Œ ๋ฐœ์ƒํ•œ๋‹ค.
  • Library Cache Lock / Pin ๋Œ€๊ธฐ ์ด๋ฒคํŠธ๋Š” ์ฃผ๋กœ SQL ์ˆ˜ํ–‰ ๋„์ค‘ DDL์„ ๋‚ ๋ฆด ๋•Œ ๋ฐœ์ƒํ•œ๋‹ค.

4. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์บ์‹œ ์ตœ์ ํ™”

  1. ์ปค์„œ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๋กœ ์ž‘์„ฑ
    • ํŠนํžˆ, ๋ฐ”์ธ๋“œ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ™์€ ํ˜•ํƒœ์˜ SQL์— ๋Œ€ํ•œ ๋ฐ˜๋ณต์ ์ธ ํ•˜๋“œ ํŒŒ์‹ฑ์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋„๋ก ์ฒ˜๋ฆฌ
  2. ์„ธ์…˜ ์ปค์„œ ์บ์‹ฑ ๊ธฐ๋Šฅ์„ ์ด์šฉํ•ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์บ์‹œ์—์„œ SQL ์ฐพ๋Š” ๋น„์šฉ ๊ฐ์†Œ ์ฒ˜๋ฆฌ
  3. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปค์„œ ์บ์‹ฑ์„ ์ด์šฉํ•ด Parse Call ๋ฐœ์ƒ๋Ÿ‰์„ ๊ฐ์†Œ ์ฒ˜๋ฆฌ

 

๐Ÿ–‡๏ธ ์ปค์„œ ๊ณต์œ 

1. Cursor๋ž€?

๊ณต์œ  ์ปค์„œ (Shared cursor) : ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์บ์‹œ์— ๊ณต์œ ๋ผ ์žˆ๋Š” Shared SQL Area

 

JAVA, PL/SQL ๋“ฑ์—์„œ SQL์„ ์ˆ˜ํ–‰ํ•˜๋ฉด, ์„œ๋ฒ„ ํ”„๋กœ์„ธ์Šค๋Š” ํ•ด๋‹น SQL์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์บ์‹œ์— ๊ณต์œ ๋ผ ์žˆ๋Š”์ง€๋ฅผ ๋จผ์ € ํ™•์ธํ•œ๋‹ค.
 ์—†์œผ๋ฉด, ์ตœ์ ํ™” ๊ณผ์ •์„ ํ†ตํ•ด ์‹คํ–‰๊ณ„ํš์„ ๋งŒ๋“ค๊ณ , ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์บ์‹œ์— ๊ณต์œ ํ•œ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์บ์‹œ์— ๊ณต์œ ๋ผ ์žˆ๋Š” Shared SQL Area๋ฅผ '์ปค์„œ'๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

์„ธ์…˜ ์ปค์„œ (Session cursor) : Private SQL Area์— ์ €์žฅ๋œ ์ปค์„œ

 

Private SQL Area์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์บ์‹œ์— ๊ณต์œ ๋ผ ์žˆ๋Š” ์ปค์„œ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ, PGA ์˜์—ญ์— ํ• ๋‹น๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋งํ•œ๋‹ค. Shared SQL Area๋ฅผ ์ฝ์–ด ์ปค์„œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ •๋ณด๋“ค์„ Private SQL Area์— ๋‹ด๊ณ , ๊ณต์œ  ์ปค์„œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ๋ฅผ ์œ ์ง€ํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ปค์„œ์˜ ์ƒํƒœ ์ •๋ณด(open, bound, execute, close ๋“ฑ)๋„ ๊ด€๋ฆฌํ•œ๋‹ค. ์ปค์„œ๋ฅผ ์˜คํ”ˆํ•˜๋ฉด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์บ์‹œ์— ๊ณต์œ ๋ผ ์žˆ๋Š” ์ปค์„œ๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•จ์œผ๋กœ์จ PGA์— ์ปค์„œ๋ฅผ ์œ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ํ• ๋‹นํ•˜๊ณ , ์‹ค์ œ ๋ฐ์ดํ„ฐ ์ถ”์ถœ์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ค€๋น„ํ•œ๋‹ค.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปค์„œ (Application Cursor) : ์„ธ์…˜ ์ปค์„œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํ•ธ๋“ค

 

PGA์— ์žˆ๋Š” ์ปค์„œ๋ฅผ ํ•ธ๋“ค๋งํ•˜๋ ค๋ฉด JAVA, PL/SQ ๊ฐ™์€ ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—๋„ ๋ฆฌ์†Œ์Šค๋ฅผ ํ• ๋‹นํ•ด์•ผ ํ•˜๋Š”๋ฐ ์ด๋ฅผ ์ปค์„œ๋ผ๊ณ  ํ•œ๋‹ค.

2. ์ปค์„œ ๊ณต์œ 

์„ธ์…˜ ์ปค์„œ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปค์„œ๋ฅผ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์™€ ๊ณต์œ ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— "์ปค์„œ๋ฅผ ๊ณต์œ ํ•œ๋‹ค."์˜ ์ปค์„œ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์บ์‹œ์˜ ๊ณต์œ  ์ปค์„œ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

 

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์บ์‹œ์— ๊ณต์œ ๋ผ ์žˆ๋Š” ์ปค์„œ์˜ ์ˆ˜ํ–‰ ํ†ต๊ณ„๋Š” V$SQL์„ ํ†ตํ•ด ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.

  • parse_calls : ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์บ์‹œ์—์„œ SQL ์ปค์„œ๋ฅผ ์ฐพ์œผ๋ ค๋Š” ์š”์ฒญ ํšŸ์ˆ˜
  • loads : ํ•˜๋“œํŒŒ์‹ฑ์„ ๊ฑฐ์นœ SQL ์‹คํ–‰๊ณ„ํš์„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์บ์‹œ์— ์ ์žฌํ•œ ํšŸ์ˆ˜
  • executions : SQL์„ ์ˆ˜ํ–‰ํ•œ ํšŸ์ˆ˜
  • invalidations : ์ปค์„œ๊ฐ€ ๋ฌดํšจํ™”๋œ ํšŸ์ˆ˜
    ์œ„์˜ ์ •๋ณด๋ฅผ ํ†ตํ•ด ํ•ด๋‹น SQL์ด ๋ช‡ ๋ฒˆ ํ•˜๋“œํŒŒ์‹ฑ๋˜์—ˆ๋Š”์ง€, ์†Œํ”„ํŠธ ํŒŒ์‹ฑ๋˜์—ˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ๊ณต์œ ๋œ ํ•˜๋‚˜์˜ ์ปค์„œ๋ฅผ ๋ช‡ ๋ฒˆ ์žฌ์‚ฌ์šฉํ–ˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

3. ๊ณต์œ  ๋ถˆ๊ฐ€

(1) Child cursor ๊ณต์œ  ๋ถˆ๊ฐ€

SQL ๋ฌธ์žฅ์ด 100% ๋™์ผํ•œ๋Œ€๋„ SQL ์ปค์„œ๋ฅผ ๊ณต์œ ํ•˜์ง€ ๋ชปํ•  ๊ฒฝ์šฐ, ๋ณ„๋„์˜ Child ์ปค์„œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. SQL ์ปค์„œ์ฒ˜๋Ÿผ ์‹คํ–‰์‹œ์ ์— ์ƒ์„ฑ๋ผ์„œ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋– ์žˆ๋Š” ๋™์•ˆ์—๋งŒ ์กด์žฌํ•˜๋Š” Transient Object๋Š” ์ด๋ฆ„์„ ๋”ฐ๋กœ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ  ๋ฌธ์žฅ์„ ๊ตฌ์„ฑํ•˜๋Š” ์ „์ฒด ๋ฌธ์ž์—ด ๊ทธ๋Œ€๋กœ๊ฐ€ LCO๋ฅผ ์‹๋ณ„ํ•˜๋Š” ์ด๋ฆ„ ์—ญํ• ์„ ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ์ „์ฒด ๋ฌธ์ž์—ด์€ ๊ฐ™์ง€๋งŒ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์‹คํ–‰ํ•ด์•ผ ํ•˜๊ฑฐ๋‚˜, ํŒŒ์‹ฑ ์Šคํ‚ค๋งˆ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ์ƒํ™ฉ์—์„œ Child ์ปค์„œ๊ฐ€ ํ•„์š”ํ•˜๊ฒŒ ๋œ๋‹ค.

 

์ฆ‰, SQL๋งˆ๋‹ค ํ•˜๋‚˜์˜ Parent ์ปค์„œ๋ฅผ ๊ฐ€์ง€๋ฉฐ, Child ์ปค์„œ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ ์ผ ์ˆ˜ ์žˆ๋‹ค(๋‹ค์ค‘ Child ์ปค์„œ). ๊ทธ๋Ÿฌ๋‚˜ version count ์ˆ˜์น˜๊ฐ€ ๋†’์€ SQL ์ผ์ˆ˜๋ก ์ปค์„œ๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐ ๋” ๋งŽ์€ ์‹œ๊ฐ„์„ ์†Œ๋น„ํ•˜๋ฏ€๋กœ library cache ๋ž˜์น˜์— ๋Œ€ํ•œ ๊ฒฝํ•ฉ ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ์„ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค. ๋งŽ์€ SQL ์ปค์„œ๋ฅผ ๊ฐ–๋Š” ๊ตฌ์กฐ์ผ์ˆ˜๋ก ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์บ์‹œ ํšจ์œจ์ด ๋‚˜๋น ์ง„๋‹ค.

ํ•˜๋‚˜์˜ SQL ๋ฌธ์žฅ์ด ์—ฌ๋Ÿฌ ๊ฐœ Child ์ปค์„œ๋ฅผ ๊ฐ–๊ฒŒ ๋˜๋Š” ์ด์œ  
  • SQL์—์„œ ์ฐธ์กฐํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ ๋ช…์ด ๊ฐ™์ง€๋งŒ, SQL์„ ์‹คํ–‰ํ•œ ์‚ฌ์šฉ์ž์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ๋•Œ
  • ์ฐธ์กฐ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๋ณ€๊ฒฝ๋ผ ์ปค์„œ๊ฐ€ ๋ฌดํšจํ™”๋˜๋ฉด ์ดํ›„ ๊ทธ ์ปค์„œ๋ฅผ ์ฒ˜์Œ ์‚ฌ์šฉํ•˜๋ ค๋Š” ์„ธ์…˜์— ์˜ํ•ด ๋‹ค์‹œ ํ•˜๋“œํŒŒ์‹ฑ๋ผ์•ผ ํ•˜๋Š”๋ฐ, ํŠน์ • ์„ธ์…˜์ด ์•„์ง ๊ธฐ์กด ์ปค์„œ๋ฅผ ์‚ฌ์šฉ ์ค‘(Pin) ์ผ ๋•Œ
  • ์˜ตํ‹ฐ๋งˆ์ด์ € ๋ชจ๋“œ๋ฅผ ๋น„๋กฏํ•ด ์˜ตํ‹ฐ๋งˆ์ด์ € ๊ด€๋ จ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๋‹ค๋ฅผ ๋•Œ
  • ์ž…๋ ฅ๋œ ๋ฐ”์ธ๋“œ ๊ฐ’์˜ ๊ธธ์ด๊ฐ€ ํฌ๊ฒŒ ๋‹ค๋ฅผ ๋•Œ
  • NLS ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋‹ค๋ฅด๊ฒŒ ์„ค์ •ํ–ˆ์„ ๋•Œ
  • SQL ํŠธ๋ ˆ์ด์Šค๋ฅผ ํ™œ์„ฑํ™”ํ–ˆ์„ ๋•Œ

(2) Parent cursor ๊ณต์œ  ๋ถˆ๊ฐ€

์˜๋ฏธ์ ์œผ๋กœ ๊ฐ™๊ณ  ์‹คํ–‰ํ™˜๊ฒฝ์ด ๊ฐ™์€๋ฐ๋„ ์ปค์„œ๋ฅผ ๊ณต์œ ํ•˜์ง€ ๋ชปํ•ด Parent ์ปค์„œ ์ž์ฒด๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์ƒ์„ฑ๋˜๋Š” ๊ฒฝ์šฐ 
  1. ๊ณต๋ฐฑ ๋ฌธ์ž ๋˜๋Š” ์ค„ ๋ฐ”๊ฟˆ
  2. ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„
  3. ํ…Œ์ด๋ธ” Owner ๋ช…์‹œ
  4. ์ฃผ์„
  5. ์˜ตํ‹ฐ๋งˆ์ด์ € Hint
  6. ์กฐ๊ฑด์ ˆ ๋น„๊ต ๊ฐ’ (๋ฐ”์ธ๋“œ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , Literal ๊ฐ’์œผ๋กœ ๋ฌธ์ž์—ด์„ ๋Œ€์ฒดํ•˜๋Š” ๊ฒฝ์šฐ)

๋‹ค๋ฅธ ๊ฒฝ์šฐ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์บ์‹œ ํšจ์œจ์ด ํฌ๊ฒŒ ๋‚˜๋น ์ง€์ง€ ์•Š์ง€๋งŒ, 6๋ฒˆ์˜ ๊ฒฝ์šฐ ์ข‹์€ ์„ฑ๋Šฅ์„ ๋ณด์žฅํ•  ์ˆ˜ ์—†๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ”์ธ๋“œ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค.

 

 


Reference