ν…Œμ΄λΈ” μŠ€μΊ” 방식에 λ”°λ₯Έ DB Block IO μ „λž΅ (Single vs Multi)

2023. 12. 2. 18:09ㆍDatabase/DB μŠ€ν„°λ””

Databaseκ°€ μΏΌλ¦¬μ—μ„œ μš”κ΅¬ν•˜λŠ” 데이터λ₯Ό κ²€μƒ‰ν•˜κΈ° μœ„ν•΄ ν…Œμ΄λΈ”μ— μ ‘κ·Όν•˜λŠ” λ°©μ‹μ—λŠ” λ‹€μ–‘ν•œ μ’…λ₯˜κ°€ μžˆλ‹€. 

ν¬κ²ŒλŠ” 인덱슀의 ν™œμš© 여뢀에 따라 갈리고, 인덱슀λ₯Ό μ–΄λ–€ λ°©μ‹μœΌλ‘œ μŠ€μΊ”ν• μ§€μ— λŒ€ν•΄μ„œλ„ μ’…λ₯˜κ°€ λ‚˜λ‰œλ‹€. μ΄λ ‡κ²Œ λ‚˜λ‰œ ν…Œμ΄λΈ” μŠ€μΊ” 방식은 λŒ€λž΅ μ•„λž˜μ™€ 같이 λ‚˜νƒ€λ‚Ό 수 μžˆλ‹€.

  • Table Full Scan(Sequential Scan)
  • Index Range Scan
  • Index Full Scan
  • Index Unique Scan
  • Index Skip Scan
  • Index Fast Full Scan

이 λ•Œ 각 μŠ€μΊ” 방식듀은 내뢀적인 μž‘λ™ 방식에 따라 μ„œλ‘œ λ‹€λ₯Έ Block IO μ „λž΅μ„ κ°–κ²Œ λ˜λŠ”λ°, μ΄λŸ¬ν•œ λ‚΄λΆ€ μž‘λ™μ˜ 차이λ₯Ό μ΄ν•΄ν•˜λ©΄ μ™œ DBκ°€ ν•΄λ‹Ή 방식을 μ‚¬μš©ν–ˆλŠ”μ§€μ— λŒ€ν•œ 이해도λ₯Ό 높일 수 μžˆλ‹€.

λ”°λΌμ„œ ν•΄λ‹Ή κΈ€μ—μ„œλŠ” 이에 λŒ€ν•΄ 닀뀄보렀고 ν•œλ‹€.

 

Block IOλž€?

본문으둜 λ“€μ–΄κ°€κΈ° 전에 Block IO에 λŒ€ν•œ κ°œλ…μ„ λ¨Όμ € 닀루렀고 ν•œλ‹€.

DatabaseλŠ” 기본적으둜 데이터듀을 Disk에 μ €μž₯ν•˜κ³ , 읽어 올 땐 λ‚΄λΆ€ 버퍼 μΊμ‹œμ— 데이터가 μ—†λŠ” 경우 Disk IOλ₯Ό λ°œμƒμ‹œμΌœ 데이터λ₯Ό μ½μ–΄μ˜¨ λ’€ 이λ₯Ό DB λ‚΄λΆ€ 버퍼 μΊμ‹œμ— μ μž¬ν•˜μ—¬ λ‹€μ–‘ν•œ 처리λ₯Ό μ§„ν–‰ν•œλ‹€. 이 λ•Œ Disk IO의 μ΅œμ†Œ λ‹¨μœ„κ°€ λ˜λŠ” 것이 λ°”λ‘œ Block이닀. ν…Œμ΄λΈ” λ‚΄ λ°μ΄ν„°λ‚˜ μΈλ±μŠ€κ°€ 이에 μ €μž₯λœλ‹€. 일반적으둜 ν•˜λ‚˜μ˜ Block의 ν¬κΈ°λŠ” 8KBλ₯Ό κ°–λŠ”λ‹€. (Mysql의 κ²½μš°μ—” 16KBκ°€ κΈ°λ³Έ μ„€μ •)

즉, λ””μŠ€ν¬μ—μ„œ Block λ‹¨μœ„λ‘œ 데이터λ₯Ό μ½μ–΄μ™€μ„œ 버퍼 μΊμ‹œμ— μ μž¬ν•˜λŠ” 과정을 Block IO라고 μΉ­ν•œλ‹€.

 

Single Block IO vs Multi Block IO

Block IOκ°€ 무엇인지 μ„€λͺ…ν–ˆκΈ° λ•Œλ¬Έμ—, Singleκ³Ό Multi의 차이λ₯Ό μ΄ν•΄ν•˜λŠ” 것은 κ°„λ‹¨ν•˜λ‹€.

λ§κ·ΈλŒ€λ‘œ Single일 κ²½μš°μ—” ν•œλ²ˆμ˜ μ‹œμŠ€ν…œ μ½œμ—μ„œ ν•˜λ‚˜μ˜ Blockλ§Œμ„ μ½λŠ” 것을 μ˜λ―Έν•˜κ³ , Multi의 κ²½μš°μ—” ν•œλ²ˆμ˜ μ‹œμŠ€ν…œ μ½œμ—μ„œ μ—¬λŸ¬ Block을 μ½λŠ” 것을 μ˜λ―Έν•œλ‹€.

μ‹œμŠ€ν…œμ½œμ΄ λ°œμƒν•  λ•Œλ§ˆλ‹€ ν”„λ‘œκ·Έλž¨μ€ μš΄μ˜μ²΄μ œμ— CPU μ œμ–΄κΆŒμ„ λ„˜κ²¨μ£Όκ³  사싀상 λ©ˆμΆ°μžˆμ–΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ—(wait) ν•œλ²ˆμ— μ—¬λŸ¬ 블둝을 μ½μ–΄μ˜€λŠ” Multi Block IOκ°€ 무쑰건 쒋은 것 μ•„λ‹Œκ°€λΌκ³  생각할 수 μžˆλ‹€.

μ™œ Single Block IO 방식이 λ”°λ‘œ μ‘΄μž¬ν•˜λŠ”μ§€ μ΄ν•΄ν•˜κΈ° μœ„ν•΄ μ–΄λ–€ μŠ€μΊ” 방식이 Single Block IOλ₯Ό μ‚¬μš©ν•˜λŠ”μ§€ μ•Œ ν•„μš”κ°€ μžˆλ‹€.

 

Single Block IOλ₯Ό μ‚¬μš©ν•˜λŠ” μŠ€μΊ” 방식

μ„œλ‘ μ—μ„œ μ–ΈκΈ‰ν•œ μŠ€μΊ” 방식듀 쀑, Single Block IOλ₯Ό μ‚¬μš©ν•˜λŠ” μŠ€μΊ” 방식은 μ•„λž˜μ™€ κ°™λ‹€.

이듀 μŠ€μΊ” λ°©μ‹μ—λŠ” μ–΄λ–€ 곡톡점이 μžˆμ„κΉŒ?

  • Index Range Scan
  • Index Full Scan(단, 인덱슀λ₯Ό 톡해 좔가적인 ν…Œμ΄λΈ” μŠ€μΊ” μ†Œμš”κ°€ μžˆλŠ” κ²½μš°μ— ν•œν•¨)
  • Index Unique Scan
  • Index Skip Scan

λ°”λ‘œ 인덱슀의 논리적 ꡬ쑰에 μ˜μ‘΄ν•œ 채 μ •λ ¬λœ 인덱슀λ₯Ό 순차적으둜 νƒμƒ‰ν•˜λŠ” μŠ€μΊ” λ°©μ‹μ΄λΌλŠ” 점이닀.

μΈλ±μŠ€λŠ” 항상 μ •λ ¬λœ μƒνƒœλ₯Ό μœ μ§€ν•˜λŠ” 자료ꡬ쑰λ₯Ό κ°–λŠ”λ°, μ—¬κΈ°μ—μ„œ λ‚˜νƒ€λ‚˜λŠ” μ •λ ¬μ˜ κ°œλ…μ΄ νŠΉμ • 블둝 레벨(물리적 κ°œλ…)μ—μ„œλŠ” λ¬΄μ˜λ―Έν•΄μ§„λ‹€. (논리적 μ •λ ¬ ꡬ쑰 != 물리적 ꡬ쑰)

즉, ν•˜λ‚˜μ˜ 인덱슀 ꡬ쑰에 λŒ€ν•œ μš”μ†Œλ“€μ€ μ—¬λŸ¬ Block에 λ‚˜λ‰˜μ–΄ μ €μž₯되고 μ΄λŠ” μΈλ±μŠ€κ°€ λ…Όλ¦¬μ μœΌλ‘œ μ •λ ¬λœ μˆœμ„œμ™€ 상관이 μ—†λ‹€λŠ” μ˜λ―Έμ΄λ‹€.

λ”°λΌμ„œ λ…Όλ¦¬μ μœΌλ‘œ μ •λ ¬λœ 인덱슀 ꡬ쑰λ₯Ό 따라 탐색을 μ§„ν–‰ν•˜λ €λ©΄ ν•œλ²ˆμ— ν•˜λ‚˜μ˜ Block λ§Œμ„ 읽어가며 확인을 ν•΄μ•Όν•œλ‹€.

 

Single Block IO둜 μΈν•œ ν•œκ³„

λ§Œμ•½ Single Block IO 방식을 톡해 읽어내야할 λ°μ΄ν„°μ˜ μˆ˜κ°€ λ§Žλ‹€λ©΄, μ‹œμŠ€ν…œ 콜 건당 λΉ„νš¨μœ¨μ΄ λˆ„μ λœλ‹€. λ”°λΌμ„œ 읽어내야할 데이터가 전체 데이터에 λΉ„ν•΄ κ½€ λ§Žλ‹€λ©΄ ν•΄λ‹Ή 방식을 μ‚¬μš©ν•˜λŠ” 것이 였히렀 더 느릴 수 μžˆλ‹€. 

인덱슀λ₯Ό μ΄μš©ν•œ μŠ€μΊ”μ΄ λͺ¨λ“  κ²½μš°μ— λŒ€ν•΄ 더 λΉ λ₯Έ 선택지가 μ•„λ‹Œ μ΄μœ κ°€ λ°”λ‘œ 이 것이닀.

이런 κ²½μš°μ—” Multi Block IOλ₯Ό 톡해 μ‹œμŠ€ν…œ  콜 호좜 횟수λ₯Ό μ€„μ΄λŠ” 것이 더 λΉ λ₯Έ 선택지가 λœλ‹€.

μΈλ±μŠ€κ°€ ν™œμš©ν•  수 μžˆλŠ” κ²½μš°μž„μ—λ„ μ’…μ’… DBκ°€ 전체 ν…Œμ΄λΈ”μ„ μ½λŠ” μ΄μœ λ„, DB λ‚΄λΆ€μ˜ μ˜΅ν‹°λ§ˆμ΄μ €κ°€ μœ„ 논리에 따라 νŒλ‹¨ν–ˆκΈ° λ•Œλ¬Έμ΄λ‹€.

 

Index Fast Full Scan

인덱슀λ₯Ό ν™œμš©ν•˜λ©΄μ„œλ„ Multi Block I/O 방식을 μ‚¬μš©ν•˜λŠ” κ²½μš°λ„ μžˆλŠ”λ°, λ°”λ‘œ Index Fast Full Scan 방식이닀.

이 방식은 인덱슀의 논리적 μ •λ ¬ ꡬ쑰λ₯Ό μ™„μ „νžˆ λ¬΄μ‹œν•œ 채, μ—¬λŸ¬ Block을 ν•œλ²ˆμ— 버퍼에 가져와 μ½μ–΄λ‚΄λŠ” 방식이닀.

μ •λ ¬ ꡬ쑰λ₯Ό λ¬΄μ‹œν•˜κΈ° λ•Œλ¬Έμ— 버퍼에 읽어왔을 땐 μ •λ ¬ μƒνƒœκ°€ μœ μ§€λ˜μ§€ μ•ŠλŠ”λ‹€λŠ” 단점이 μžˆλ‹€.

정렬이 μœ μ§€λ˜μ§€ μ•ŠλŠ” 인덱슀 μŠ€μΊ”μ΄λΌλ©΄ 무슨 μ˜λ―Έκ°€ μžˆμ„κΉŒ 싢을 수 μžˆμ§€λ§Œ,

쿼리에 ν¬ν•¨λœ λͺ¨λ“  칼럼이 μΈλ±μŠ€μ— μ‘΄μž¬ν•˜λŠ” κ²½μš°μ— 이λ₯Ό Multi Block IO λ°©μ‹μœΌλ‘œ μ½μ–΄μ˜¬ 수 있기 λ•Œλ¬Έμ— ν™œμš©λ˜λŠ” 방식이닀.