SQLD QnA - ynjch97/YNJCH_WIKI GitHub Wiki

1. ORACLE JOIN

1-1. JOIN์˜ ๋ฐฉ์‹

  • ์กฐ์ธ์—ฐ์‚ฐ(JOIN OPERATION)
    • ์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ”์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ๋ฒˆ์— ์กฐํšŒํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” DBMS์˜ ๊ธฐ๋Šฅ
    • ๋‘ ์ง‘ํ•ฉ(ํ…Œ์ด๋ธ”) ๊ฐ„์˜ ๊ณฑ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ ๋ฐ์ดํ„ฐ ์—ฐ๊ฒฐ ๋ฐฉ๋ฒ•
  • ๋ฌผ๋ฆฌ์  ์กฐ์ธ : ์˜ตํ‹ฐ๋งˆ์ด์ €์— ์˜ํ•ด ๋ฐœ์ƒํ•˜๋Š” ์กฐ์ธ
  • ๋…ผ๋ฆฌ์ ์ธ ์กฐ์ธ์„ ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ DBMS ๋‚ด๋ถ€์—์„œ ๋ฌผ๋ฆฌ์ ์ธ ์กฐ์ธ์œผ๋กœ ํ‘œํ˜„
  • Join ์ž‘์—…์„ ํ•  ๋•Œ ์˜ตํ‹ฐ๋งˆ์ด์ €๋Š” ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์กฐ์ธ์„ ํ• ์ง€ ์‹คํ–‰๊ณ„ํš์„ ์„ธ์šฐ๊ฒŒ ๋จ

1-1-1. Nested-Loop Join

  • ๋‘๊ฐœ์˜ ํ…Œ์ด๋ธ”์˜ ํ–‰์„ ๊ฐ๊ฐ ๋ชจ๋‘ ํ™•์ธํ•˜์—ฌ ์กฐ์ธํ•˜๋Š” ๋ฐฉ๋ฒ•
  • 2๊ฐœ ์ด์ƒ์˜ ํ…Œ์ด๋ธ”์—์„œ ํ•˜๋‚˜์˜ ์ง‘ํ•ฉ์„ ๊ธฐ์ค€์œผ๋กœ ์ˆœ์ฐจ์ ์œผ๋กœ ์ƒ๋Œ€๋ฐฉ Row๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ์กฐํ•ฉํ•˜๋Š” ๋ฐฉ์‹
  • ์„ ํ–‰ ํ…Œ์ด๋ธ”์˜ ์ฒ˜๋ฆฌ ๋ฒ”์œ„๋ฅผ ํ•˜๋‚˜์”ฉ ์•ก์„ธ์Šคํ•˜๋ฉด์„œ ์ถ”์ถœ๋œ ๊ฐ’์œผ๋กœ ์—ฐ๊ฒฐํ•  ํ…Œ์ด๋ธ”์„ ์กฐ์ธ
  • ์‹คํ–‰๊ณ„ํš์—์„œ ๋จผ์ € ์‹คํ–‰๋˜๋Š” ํ…Œ์ด๋ธ”์ด Driving ํ…Œ์ด๋ธ”, ๋‚˜์ค‘์— ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ด Driven ํ…Œ์ด๋ธ”
// ์ค‘์ฒฉ๋œ for๋ฌธ์˜ ์›๋ฆฌ์™€ ๋™์ผํ•จ
for (i=0; i<100; i++) {
	for (j=0; j<100; j++) {
    	(์ƒ๋žต)
    }
}

Nested-Loop Join ํŠน์ง•

  • ์ข์€ ๋ฒ”์œ„์— ์ฒ˜๋ฆฌ์— ์ตœ์ ํ™” / ์†Œ๋Ÿ‰ ๋ฐ์ดํ„ฐ ์กฐ์ธ ์‹œ ์‚ฌ์šฉ
  • ํ•œ ๋ ˆ์ฝ”๋“œ์”ฉ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌ
  • Random Access ์œ„์ฃผ์˜ ์กฐ์ธ ๋ฐฉ์‹ > ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ ์กฐ์ธ ์‹œ Random Access ์ฆ๊ฐ€
  • ํ›„ํ–‰ ํ…Œ์ด๋ธ”(Driven)์—๋Š” ์กฐ์ธ์„ ์œ„ํ•œ ์ธ๋ฑ์Šค ์ƒ์„ฑ ํ•„์š”
  • ์‹คํ–‰์†๋„ = ์„ ํ–‰ ํ…Œ์ด๋ธ” ์‚ฌ์ด์ฆˆ * ํ›„ํ–‰ ํ…Œ์ด๋ธ” ์ ‘๊ทผํšŸ์ˆ˜

Nested-Loop Join ์ฃผ์˜์‚ฌํ•ญ

  • ๋ฐ์ดํ„ฐ๋ฅผ Random Access > ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์ด ๋งŽ์œผ๋ฉด ๋А๋ ค์ง
  • ์กฐ์ธ ์ปฌ๋Ÿผ์— Index๊ฐ€ ์žˆ์–ด์•ผ ํ…Œ์ด๋ธ” ์ „์ฒด๋ฅผ ํƒ์ƒ‰ํ•˜์ง€ ์•Š๊ณ  ํ•„์š”ํ•œ ํ–‰์— ๋Œ€ํ•ด์„œ๋งŒ ํƒ์ƒ‰ํ•˜์—ฌ ํšจ์œจ์ 
  • Row ์ˆ˜๊ฐ€ ์ ์€ ํ…Œ์ด๋ธ”์„ Driving ํ…Œ์ด๋ธ”๋กœ ์„ ์ •ํ•ด์•ผ ์ฒ˜๋ฆฌ ์†๋„ ํ–ฅ์ƒ
  • ํ…Œ์ด๋ธ” ์ค‘ ์ ์€ ์ชฝ์„ Driven ํ…Œ์ด๋ธ”๋กœ ์„ค์ •

1-1-2. Sort Merge Join

  • ์กฐ์ธ์˜ ๋Œ€์ƒ๋ฒ”์œ„๊ฐ€ ๋„“์„ ๊ฒฝ์šฐ ๋ฐœ์ƒํ•˜๋Š” Random Access๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•œ ๊ฒฝ์šฐ๋‚˜ ์—ฐ๊ฒฐ๊ณ ๋ฆฌ์— ๋งˆ๋•…ํ•œ Index๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์กฐ์ธ ๋ฐฉ์•ˆ
  • ์–‘์ชฝ ํ…Œ์ด๋ธ”์˜ ์ฒ˜๋ฆฌ๋ฒ”์œ„๋ฅผ ๊ฐ์ž Accessํ•˜์—ฌ ์ •๋ ฌํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ฐจ๋ก€๋กœ Scanํ•˜๋ฉด์„œ ์—ฐ๊ฒฐ๊ณ ๋ฆฌ์˜ ์กฐ๊ฑด์œผ๋กœ Mergeํ•˜๋Š” ๋ฐฉ์‹
  • ๋‘ ๊ฐœ์˜ ํ…Œ์ด๋ธ”์„ ์กฐ์ธ ์นผ๋Ÿผ์œผ๋กœ ์ •๋ ฌํ•˜์—ฌ ์กฐ์ธ

Sort Merge Join ํŠน์ง•

  • ์—ฐ๊ฒฐ์„ ์œ„ํ•ด Random Access๋ฅผ ํ•˜์ง€ ์•Š๊ณ  ์Šค์บ”์„ ํ•˜๋ฉด์„œ ์ˆ˜ํ–‰
  • Nested Loop Join์ฒ˜๋Ÿผ ์„ ํ–‰์ง‘ํ•ฉ ๊ฐœ๋…์ด ์—†์Œ
  • ์ •๋ ฌ์„ ์œ„ํ•œ ์˜์—ญ(Sort Area Size)์— ๋”ฐ๋ผ ํšจ์œจ์— ํฐ ์ฐจ์ด ๋ฐœ์ƒ
  • ์กฐ์ธ ์—ฐ์‚ฐ์ž๊ฐ€ '='์ด ์•„๋‹Œ ๊ฒฝ์šฐ Nested Loop Join ๋ณด๋‹ค ์œ ๋ฆฌ
  • Outer ์ง‘ํ•ฉ์ด ์ •๋ ฌ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ, Non equi join์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์œ ๋ฆฌ
  • ์กฐ์ธ๋˜๋Š” ์ปฌ๋Ÿผ์— Index๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ์œ ๋ฆฌ

Sort Merge Join ์ฃผ์˜์‚ฌํ•ญ

  • ๋‘ ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์˜ ํฌ๊ธฐ๊ฐ€ ์ฐจ์ด๊ฐ€ ๋งŽ์ด ๋‚˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋น„ํšจ์œจ์ 
  • ์ •๋ ฌํ•  ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์€ ๊ฒฝ์šฐ ๋ถ€๋‹ด์ด ๊ฐ€์žฅ ํฐ ๋ฐฉ๋ฒ•
  • Sorting ๋ฉ”๋ชจ๋ฆฌ์— ์œ„์น˜ํ•˜๋Š” ๋Œ€์ƒ์€ join key๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Select list๋„ ํฌํ•จ๋˜๋ฏ€๋กœ ๋ถˆํ•„์š”ํ•œ Select ํ•ญ๋ชฉ ์ œ๊ฑฐ

1-1-3. Hash Join

- ํ•ด์‹ฑ ํ•จ์ˆ˜(Hashing Function) ์— ์˜ํ•œ ํƒ์ƒ‰์„ ํ•˜์—ฌ ์กฐ์ธ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ์‹

  • ํ•ด์‹ฑ ํ•จ์ˆ˜๋Š” ์ง์ ‘์ ์ธ ์—ฐ๊ฒฐ์„ ๋‹ด๋‹นํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์—ฐ๊ฒฐ๋  ๋Œ€์ƒ์„ ํŠน์ • ์ง€์—ญ(partition)์— ๋ชจ์•„๋‘๋Š” ์—ญํ• ๋งŒ์„ ๋‹ด๋‹น
  • ํ•ด์‹œ๊ฐ’์„ ์ด์šฉํ•˜์—ฌ ํ…Œ์ด๋ธ”์„ ์กฐ์ธํ•˜๋Š” ๋ฐฉ์‹ - Sort-Merge ์กฐ์ธ์€ ์ •๋ ฌ์˜ ๋ถ€ํ•˜๊ฐ€ ๋งŽ์ด ๋ฐœ์ƒํ•˜์—ฌ, ์ด๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ Sort ๋Œ€์‹  ํ•ด์‰ฌ๊ฐ’์„ ์ด์šฉํ•˜๋Š” ์กฐ์ธ

Hash Join ํŠน์ง•

  • Random Access์™€ ์ •๋ ฌ์— ๋Œ€ํ•œ ๋ถ€๋‹ด์„ ํ•ด์†Œ > ๋Œ€์šฉ๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์‹œ ์‚ฌ์šฉ๋จ
  • parallel processing์„ ์ด์šฉํ•œ Hash Join์€ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์ตœ์ ์˜ ์†”๋ฃจ์…˜
  • 2๊ฐœ์˜ ์กฐ์ธ ํ…Œ์ด๋ธ” ์ค‘ small rowset์„ ๊ฐ€์ง€๊ณ  hash_area_size์— ์ง€์ •๋œ ๋ฉ”๋ชจ๋ฆฌ ๋‚ด์—์„œ hash table ์ƒ์„ฑ
  • CBO์—์„œ๋งŒ ๊ฐ€๋Šฅํ•˜๋ฉฐ, CPU ์„ฑ๋Šฅ์— ์˜์กด์ (CPU ์ž์› ๋งŽ์ด ์†Œ๋น„)
  • Hash table ์ƒ์„ฑ ํ›„ Nested Loop์ฒ˜๋Ÿผ ์ˆœ์ฐจ์ ์ธ ์ฒ˜๋ฆฌ ํ˜•ํƒœ๋กœ ์ˆ˜ํ–‰
  • ๋ฐฐ์น˜ ์ž‘์—…์— ์œ ๋ฆฌ

Hash Join ์ฃผ์˜์‚ฌํ•ญ

  • ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์—์„œ๋Š” ์ƒ๋‹นํžˆ ํฐ hash area๋ฅผ ํ•„์š”๋กœ ํ•จ์œผ๋กœ, ๋ฉ”๋ชจ๋ฆฌ์˜ ์ง€๋‚˜์นœ ์‚ฌ์šฉ์œผ๋กœ ์˜ค๋ฒ„ํ—ค๋“œ ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ
    • ์†Œ๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ธํ•  ๋•Œ ์˜คํžˆ๋ ค ๋ถˆํ•„์š”ํ•œ I/O๊ฐ€ ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ์Œ
  • ์—ฐ๊ฒฐ์กฐ๊ฑด ์—ฐ์‚ฐ์ž๊ฐ€ โ€˜=โ€™์ธ ๋™์น˜์กฐ์ธ์ธ ๊ฒฝ์šฐ์—๋งŒ ๊ฐ€๋Šฅ
  • Equi Join์—์„œ๋งŒ ๊ฐ€๋Šฅ > Non-Equal ์กฐ์ธ ์กฐ๊ฑด์ธ ๊ฒฝ์šฐ Hash Join์œผ๋กœ ์ˆ˜ํ–‰๋˜์ง€ ๋ชปํ•˜๊ณ  Merge Join์œผ๋กœ ์ˆ˜ํ–‰๋จ
  • Outer Table์˜ ํ•ด์‹œ ํ‚ค ์นผ๋Ÿผ์— ์ค‘๋ณต๊ฐ’์ด ์ ์€ ๊ฒฝ์šฐ์— ์‚ฌ์šฉ
  • ๋‘ ์ง‘ํ•ฉ ์ค‘ ํฌ๊ธฐ๊ฐ€ ์ž‘์€ ์ง‘ํ•ฉ์„ Outer Table๋กœ ๊ฒฐ์ •
  • ์กฐ์ธ ์นผ๋Ÿผ์— ์ ๋‹นํ•œ Index๊ฐ€ ์—†๋Š”๋ฐ Nested Loop Join์ด ๋น„ํšจ์œจ ์ ์ผ ๋•Œ ์‚ฌ์šฉ
    • Nested Loop Join์—์„œ ์กฐ์ธ ์นผ๋Ÿผ Index๊ฐ€ ์žˆ๋”๋ผ๋„ Random Access ๋ถ€ํ•˜๊ฐ€ ์‹ฌํ•  ๋•Œ ์‚ฌ์šฉ

1-2. JOIN์˜ ์ข…๋ฅ˜

1-4-1. CROSS JOIN

  • ๋‘ ๊ฐœ์˜ ํ…Œ์ด๋ธ”์˜ ๋ ˆ์ฝ”๋“œ ์ˆ˜๋ฅผ ๊ณฑํ•œ ์ˆ˜ = ์ „์ฒด row
  • ์•„๋ž˜ ๋‘ ์ฟผ๋ฆฌ๊ฐ€ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํ•จ
SELECT * FROM A, B;
SELECT * FROM A CROSS JOIN B;

1-4-2. FULL OUTER JOIN

  • ๋‘ ํ…Œ์ด๋ธ” ๊ฐ„์˜ ํ•ฉ์ง‘ํ•ฉ์„ ๋‚˜ํƒ€๋ƒ„
  • ์„œ๋กœ์˜ ํ…Œ์ด๋ธ”์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฐ’์— ๋Œ€ํ•ด NULL ํ‘œ๊ธฐ
SELECT * FROM A FULL OUTER JOIN B ON A.C1 = B.C1;

1-4-3. LEFT OUTER JOIN

  • ์™ผ์ชฝ ํ…Œ์ด๋ธ” ๊ธฐ์ค€์œผ๋กœ JOIN ํ•˜๋ฉฐ, RIGHT OUTER JOIN์€ ๋ฐ˜๋Œ€๋˜๋Š” ๊ฐœ๋…
    • ๊ธฐํ˜ธ๊ฐ€ ๋ถ™์ง€ ์•Š์€ ํ…Œ์ด๋ธ”์ด ๊ธฐ์ค€ ํ…Œ์ด๋ธ”์ด ๋จ
  • ์•„๋ž˜ ๋‘ ์ฟผ๋ฆฌ๊ฐ€ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํ•จ
SELECT * FROM A LEFT OUTER JOIN B ON A.C1 = B.C1;
SELECT * FROM A, B WHERE A.C1 = B.C1(+);

1-4-4. JOIN

  • ์•„๋ž˜ ๋‘ ์ฟผ๋ฆฌ๊ฐ€ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํ•จ
SELECT * FROM A JOIN B ON A.C1 = B.C1;
SELECT * FROM A, B WHERE A.C1 = B.C1;

1-4-5. NATURAL JOIN

  • ๋™์ผํ•œ ํƒ€์ž…๊ณผ ์ด๋ฆ„์„ ๊ฐ€์ง„ ์ปฌ๋Ÿผ์„ ์กฐ์ธ ์กฐ๊ฑด์œผ๋กœ ์ด์šฉ

2. ์‹คํ–‰ ๊ณ„ํš

  • ์‹คํ–‰๊ณ„ํš์ด๋ž€ ์‚ฌ์šฉ์ž๊ฐ€ SQL์„ ์‹คํ–‰ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์ˆ˜๋ฆฝํ•˜๋Š” ์ž‘์—… ์ ˆ์ฐจ
  • ์ฟผ๋ฆฌ๋ฌธ์˜ ์‹คํ–‰ ๊ณ„ํš์„ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ• : EXPLAIN PLAN, AUTOTRACE, SQL TRACE

AutoTrace

  • AutoTrace ๊ฒฐ๊ณผ์—๋Š” SQL์„ ํŠœ๋‹ํ•˜๋Š”๋ฐ ์œ ์šฉํ•œ ์ •๋ณด๋“ค์ด ๋งŽ์ด ํฌํ•จ๋˜์–ด ์žˆ์–ด ๊ฐ€์žฅ ์ฆ๊ฒจ ์‚ฌ์šฉ๋˜๋Š” ๋„๊ตฌ ์ค‘ ํ•˜๋‚˜์ž„
  • SQL Plus์—์„œ ์‹คํ–‰๊ณ„ํš์„ ๊ฐ€์žฅ ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ํ™•์ธํ•ด ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•
    • Operation : ๊ฐ ๋‹จ๊ณ„์—์„œ์˜ ์–ด๋–ค ์ž‘์—…์ด ์ผ์–ด๋‚ฌ๋Š”์ง€ ํ‘œ์‹œ
    • Name : ํ…Œ์ด๋ธ”๋ช…์ด๋‚˜ Index ๋ช…์„ ํ‘œ์‹œํ•จ
    • Rows : ํ•ด๋‹น ์ฟผ๋ฆฌ ๊ณ„ํš ๋‹จ๊ณ„์—์„œ ๋‚˜์˜ฌ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜๋Š” ํ–‰์˜ ์ˆ˜
    • Byte : ์‹คํ–‰ ๊ณ„ํš์˜ ๊ฐ ๋‹จ๊ณ„๊ฐ€ ๋ฐ˜ํ™˜ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ ๋˜๋Š” ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ๋ฅผ ๋ฐ”์ดํŠธ๋กœ ๋‚˜ํƒ€๋‚ธ ์ˆ˜
    • Cost : CBO๊ฐ€ ์ฟผ๋ฆฌ ๊ณ„ํš์˜ ๊ฐ ๋‹จ๊ณ„์— ํ• ๋‹นํ•œ ๋น„์šฉ
    • Time : ๊ฐ ๋‹จ๊ณ„๋ณ„ ์ˆ˜ํ–‰ ์‹œ๊ฐ„ image

2-1. ์‹คํ–‰ ๊ณ„ํš ํ•ด์„

  • ์‹คํ–‰ ๊ณ„ํš์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋‹จ๊ณ„๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋Š”๋ฐ ์ด๊ฒƒ์„ ์Šคํ…์ด๋ผ๊ณ  ํ•จ
  • ๊ฐ๊ฐ์˜ ์Šคํ…์—๋Š” ๊ทธ ๋‹จ๊ณ„์—์„œ ์ˆ˜ํ–‰๋œ ๋ช…๋ น, ์ฒ˜๋ฆฌ๋œ ๋ฐ์ดํ„ฐ ๊ฑด์ˆ˜, ์†Œ์š”๋œ ๋น„์šฉ๊ณผ ์‹œ๊ฐ„์„ ํ‘œ์‹œ

์‹คํ–‰ ๊ณ„ํš ์ˆœ์„œ ์ฝ๊ธฐ

  • ์œ„์—์„œ ์•„๋ž˜๋กœ ์ฝ์–ด ๋‚ด๋ ค๊ฐ€๋ฉฐ ์ œ์ผ ๋จผ์ € ์ฝ์„ ์Šคํ… ํŒŒ์•…
  • ๊ฐ™์€ ๋ ˆ๋ฒจ์˜ ๋“ค์—ฌ์“ฐ๊ธฐ ์กด์žฌ ์‹œ ์œ„ -> ์•„๋ž˜ ์ˆœ์„œ๋กœ ์ฝ๊ธฐ
  • ํ•˜์œ„ ์Šคํ…์ด ์กด์ œํ•˜๋ฉด ์ตœํ•˜์œ„ ์Šคํ…๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ์ƒ์œ„ ์Šคํ…์œผ๋กœ ์ฝ์–ด๋‚˜์˜ด image
  • 5 > 4 > 6 > 3 > 7 > 2 > 8 > 1 > 0 ์ˆœ์œผ๋กœ ์ฝ์Œ

2-2. SCAN์˜ ์ข…๋ฅ˜

  • SCAN : ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” ์ž‘์—…
  • SCAN์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ์‹์„ ์ ‘๊ทผ ๊ฒฝ๋กœ๋ผ๊ณ  ํ•จ
  • ํ…Œ์ด๋ธ”์— ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์ง€ ์•Š์•„ INDEX๋ฅผ ํƒ€๋Š” ์‹œ๊ฐ„์ด ๋ถˆํ•„์š”ํ•˜๊ฑฐ๋‚˜, ๋ฐ์ดํ„ฐ๊ฐ€ ์•„์ฃผ ๋งŽ์€ ๊ฒฝ์šฐ FULL TABLE SCAN์ด ์œ ๋ฆฌ
  • ๋งŽ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ํ…Œ์ด๋ธ”์—์„œ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด๋ผ๋ฉด INDEX SCAN์ด ์œ ๋ฆฌ

2-2-1. FULL TABLE SCAN

  • ํ…Œ์ด๋ธ”์˜ ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด ์กฐ๊ฑด์— ๋งž๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•˜๋Š” ๋ฐฉ์‹

FULL TABLE SCAN ์‚ฌ์šฉ

  • ์กฐ๊ฑด์ ˆ์—์„œ ๋น„๊ตํ•œ ์นผ๋Ÿผ์— INDEX๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ
  • INDEX๊ฐ€ ์žˆ์ง€๋งŒ ์กฐ๊ฑด์— ๋งŒ์กฑํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ํ…Œ์ด๋ธ”์˜ ๋งŽ์€ ์–‘์„ ์ฐจ์ง€ํ•˜์—ฌ FULL TABLE SCAN์ด ๋‚ซ๋‹ค๊ณ  ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ํŒ๋‹จ
  • INDEX๊ฐ€ ์žˆ์ง€๋งŒ ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ ์ž์ฒด๊ฐ€ ์ ์–ด FULL TABLE SCAN์ด ๋‚ซ๋‹ค๊ณ  ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ํŒ๋‹จ

2-2-2. ROWID SCAN

  • ROWID๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•˜๋ฉฐ ๋‹จ์ผ ํ–‰์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ์‹ ์ค‘์—์„œ ๊ฐ€์žฅ ๋น ๋ฆ„

ROWID SCAN ์‚ฌ์šฉ

  • ์กฐ๊ฑด์ ˆ์— ROWID๋ฅผ ์ง์ ‘ ๋ช…์‹œํ•  ๊ฒฝ์šฐ
  • INDEX SCAN์„ ํ†ตํ•ด ROWID๋ฅผ ์ถ”์ถœํ•œ ํ›„ ํ…Œ์ด๋ธ”์— ์ ‘๊ทผํ•  ๊ฒฝ์šฐ

2-2-3. INDEX SCAN

  • ์ธ๋ฑ์Šค๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•˜๋Š” ๋ฐฉ์‹

INDEX SCAN ์‚ฌ์šฉ

  • INDEX UNIQUE SCAN
    • UNIQUE INDEX๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ชจ๋“  ์ปฌ๋Ÿผ์ด ์กฐ๊ฑด์— "="๋กœ ๋ช…์‹œ๋œ ๊ฒฝ์šฐ
  • INDEX RANGE SCAN
    • UNIQUE ์„ฑ๊ฒฉ์˜ ๊ฒฐํ•ฉ ์ธ๋ฑ์Šค์˜ ์„ ๋‘ ์ปฌ๋Ÿผ์ด WHERE์ ˆ์— ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ / ์ผ๋ฐ˜ ์ธ๋ฑ์Šค์˜ ์ปฌ๋Ÿผ์ด WHERE์ ˆ์— ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ
  • INDEX RANGE SCAN DESCENDING
    • INDEX RANGE SCAN์„ ์ˆ˜ํ–‰ํ•จ๊ณผ ๋™์‹œ์— ORDER BY DESC์ ˆ์„ ๋งŒ์กฑํ•˜๋Š” ๊ฒฝ์šฐ
  • INDEX SKIP SCAN
    • ๊ฒฐํ•ฉ ์ธ๋ฑ์Šค์˜ ์„ ํ–‰ ์ปฌ๋Ÿผ์ด WHERE์ ˆ์— ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ / ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ INDEX SKIP SCAN์ด FULL TABLE SCAN๋ณด๋‹ค ๋‚ซ๋‹ค๊ณ  ํŒ๋‹จํ•˜๋Š” ๊ฒฝ์šฐ
  • INDEX FULL SCAN
    • ORDER BY / GROUP BY์˜ ๋ชจ๋“  ์ปฌ๋Ÿผ์ด ์ธ๋ฑ์Šค์˜ ์ „์ฒด ๋˜๋Š” ์ผ๋ถ€๋กœ ์ •์˜๋œ ๊ฒฝ์šฐ / ์ •๋ ฌ์ด ํ•„์š”ํ•œ ๋ช…๋ น์—์„œ INDEX ENTRY๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฝ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌ๋œ ๊ฒฝ์šฐ
  • INDEX FULL SCAN DESCENDING
    • INDEX FULL SCAN์„ ์ˆ˜ํ–‰ํ•จ๊ณผ ๋™์‹œ์— ORDER BY DESC์ ˆ์„ ๋งŒ์กฑํ•˜๋Š” ๊ฒฝ์šฐ
  • INDEX FAST FULL SCAN
    • FULL TABLE SCAN์„ ํ•˜์ง€ ์•Š๊ณ ๋„ INDEX FAST FULL SCAN์œผ๋กœ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ๊ณ  ์ถ”์ถœ๋œ ๋ฐ์ดํ„ฐ์˜ ์ •๋ ฌ์ด ํ•„์š” ์—†์œผ๋ฉฐ ๊ฒฐํ•ฉ ์ธ๋ฑ์Šค๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์ปฌ๋Ÿผ ์ค‘์— ์ตœ์†Œ ํ•œ๊ฐœ ์ด์ƒ์€ NOT NULL์ธ ๊ฒฝ์šฐ
  • INDEX JOIN
    • ์ถ”์ถœํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์กฐ์ธํ•˜๋Š” ์ธ๋ฑ์Šค์— ๋ชจ๋‘ ํฌํ•จ๋˜์–ด ์žˆ๊ณ  ์ถ”์ถœํ•˜๋Š” ๋ฐ์ดํ„ฐ์˜ ์ •๋ ฌ์ด ํ•„์š”์—†๋Š” ๊ฒฝ์šฐ

3. ์ •๋ ฌ

3-1. ORDER BY

  • ์กฐํšŒ๋œ ๋ฐ์ดํ„ฐ๋“ค์„ ๋‹ค์–‘ํ•œ ๋ชฉ์ ์— ๋งž๊ฒŒ ํŠน์ • ์นผ๋Ÿผ์„ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•˜์—ฌ ์ถœ๋ ฅํ•˜๋Š”๋ฐ ์‚ฌ์šฉ
  • ์ปฌ๋Ÿผ๋ช… ๋Œ€์‹  ALIAS๋‚˜ ์ปฌ๋Ÿผ ์ˆœ์„œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜ ์‚ฌ์šฉ๋„ ๊ฐ€๋Šฅ
  • ๊ธฐ๋ณธ์ ์ธ ์ •๋ ฌ ์ˆœ์„œ๋Š” ์˜ค๋ฆ„์ฐจ์ˆœ
  • ์ˆซ์žํ˜• ๋ฐ์ดํ„ฐ ํƒ€์ž… : ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ–ˆ์„ ๊ฒฝ์šฐ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’๋ถ€ํ„ฐ ์ถœ๋ ฅ
  • ๋‚ ์งœํ˜• ๋ฐ์ดํ„ฐ ํƒ€์ž… : ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ–ˆ์„ ๊ฒฝ์šฐ ๋‚ ์งœ ๊ฐ’์ด ๊ฐ€์žฅ ๋น ๋ฅธ ๊ฐ’์ด ๋จผ์ € ์ถœ๋ ฅ (๊ณผ๊ฑฐ๊ฐ€ ๋จผ์ € ์ถœ๋ ฅ)

ORDER BY์ ˆ์˜ NULL ๊ฐ’

  • Oracle์€ NULL ๊ฐ’์„ ๊ฐ€์žฅ ํฐ ๊ฐ’์œผ๋กœ ๊ฐ„์ฃผ
    • ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ–ˆ์„ ๊ฒฝ์šฐ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์—, ๋‚ด๋ฆผ์ฐจ์ˆœ์˜ ๊ฒฝ์šฐ ๊ฐ€์žฅ ๋จผ์ € ์œ„์น˜
  • SQL SERVER๋Š” NULL ๊ฐ’์„ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์œผ๋กœ ๊ฐ„์ฃผ

4. ๊ทธ๋ฃน

4-1. GROUP BY

4-2. ROLLUP

  • ์ธ์ˆ˜์˜ ์ˆœ์„œ์— ์˜ํ–ฅ์„ ๋ฐ›์Œ

ROLLUP(item_id, month)

SELECT item_id, month, SUM(amount) AS amount
FROM sales
GROUP BY ROLLUP(item_id, month);

ROLLUP(month, item_id)

SELECT month, item_id, SUM(amount) AS amount
FROM sales
GROUP BY ROLLUP(month, item_id);

4-3. CUBE

  • ๊ทธ๋ฃนํ•‘ ์ปฌ๋Ÿผ์ด ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜์— ๋Œ€ํ•˜์—ฌ ์†Œ๊ณ„(SUBTOTAL)๊ณผ ์ด๊ณ„(GRAND TOTAL)์„ ์ƒ์„ฑ
SELECT item_id, month, SUM(amount) AS amount
FROM sales
GROUP BY CUBE(item_id, month);

4-4. GROUPING SETS

  • ์ธ์ž๋ณ„ ์†Œ๊ณ„(SUBTOTAL)๋งŒ์ด ์ƒ์„ฑ๋จ
  • ROLLUP๊ณผ CUBE์™€ ๋‹ฌ๋ฆฌ ๊ณ„์ธต ๊ตฌ์กฐ๊ฐ€ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์Œ > ์ธ์ž์˜ ์ˆœ์„œ๊ฐ€ ๋‹ฌ๋ผ๋„ ๊ฒฐ๊ณผ๋Š” ๋™์ผ
SELECT item_id, month, SUM(amount) AS amount
FROM sales
GROUP BY GROUPING SETS(item_id, month);

  • ๊ด„ํ˜ธ๋กœ ๋ฌถ์€ ์ง‘ํ•ฉ๋ณ„๋กœ๋„ ์ง‘๊ณ„๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ์Œ
SELECT item_id, month, company, SUM(amount) AS amount
FROM sales
GROUP BY GROUPING SETS((item_id, month), company);

4-5. GROUPING

  • ์ง์ ‘ ๊ทธ๋ฃน๋ณ„ ์ง‘๊ณ„๋ฅผ ๊ตฌํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ROLLUP, CUBE, GROUPING SETS๋ฅผ ์ง€์›ํ•˜๋Š” ์—ญํ• 
  • ์ง‘๊ณ„๊ฐ€ ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ๋Š” GROUPING(ํ‘œํ˜„์‹) = 1, ๊ทธ ์™ธ์—๋Š” GROUPING(ํ‘œํ˜„์‹) = 0
SELECT 
	CASE GROUPING(item_id) WHEN 1 THEN '๋ชจ๋“  ์ƒํ’ˆID' ELSE item_id END AS item_id, 
    CASE GROUPING(month) WHEN 1 THEN '๋ชจ๋“  ์›”' ELSE month END AS month,
    SUM(amount) AS amount
FROM sales
GROUP BY GROUPING SETS((item_id, month), company);

5. ์ง‘ํ•ฉ ์—ฐ์‚ฐ์ž

  • ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ๊ฐœ์˜ ๊ฒฐ๊ณผ๋ฅผ ์—ฐ์‚ฐ์„ ํ†ตํ•ด ์ƒˆ๋กœ์šด ๊ฒฐ๊ณผ ์ถ”์ถœ

์ง‘ํ•ฉ ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ ์กฐ๊ฑด

  • ๋‘ ์ง‘ํ•ฉ์˜ SELECT ์ ˆ์— ์˜ค๋Š” ์ปฌ๋Ÿผ์˜ ๊ฐœ์ˆ˜, ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด ๋™์ผํ•ด์•ผ ํ•จ
  • ๋‘ ์ง‘ํ•ฉ์˜ ์ปฌ๋Ÿผ๋ช…์€ ๋‹ฌ๋ผ๋„ ์ƒ๊ด€ ์—†์Œ

์ง‘ํ•ฉ ์—ฐ์‚ฐ์ž์˜ ์ข…๋ฅ˜

  • UNION : ๋‘ ์ง‘ํ•ฉ์„ ๋”ํ•ด์„œ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅ / ์ค‘๋ณต ๊ฐ’ ์ œ๊ฑฐํ•˜๊ณ  ์ •๋ ฌ
  • UNION ALL : ๋‘ ์ง‘ํ•ฉ์„ ๋”ํ•ด์„œ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅ / ์ค‘๋ณต ๊ฐ’ ์ œ๊ฑฐ ์•ˆํ•˜๊ณ  ์ •๋ ฌ ์•ˆํ•จ
  • INTERSECT : ๋‘ ์ง‘ํ•ฉ์˜ ๊ต์ง‘ํ•ฉ ๊ฒฐ๊ณผ๋ฅผ ์ •๋ ฌํ•˜์—ฌ ์ถœ๋ ฅ
  • MINUS : ๋‘ ์ง‘ํ•ฉ์˜ ์ฐจ์ง‘ํ•ฉ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅ / ์ฟผ๋ฆฌ์˜ ์ˆœ์„œ ์ค‘์š” / INTERSECT์™€ ๋ฐ˜๋Œ€์˜ ๊ฒฐ๊ณผ

5-1. INTERSECT

  • ๋ฐ์ดํ„ฐ์˜ ํƒ€์ž…, ์ˆœ์„œ, ๊ฐœ์ˆ˜๊ฐ€ ๋งž์•„์•ผ ํ•จ
SELECT col1, col2 FROM table1
INTERSECT
SELECT col3, col4 FROM table2;

์ฐธ๊ณ  ์‚ฌ์ดํŠธ