λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
  • Round and Round
DB/SQLP

[SQLP] 2-1. 인덱슀 ꡬ쑰

by 퉁글퉁글 2025. 2. 22.

🧷 인덱슀 ꡬ쑰

πŸ–‡οΈ 인덱슀 νŠœλ‹

온라인 νŠΈλžœμž­μ…˜ 처리(OLTP) μ‹œμŠ€ν…œμ—μ„œλŠ” μ†ŒλŸ‰μ˜ 데이터λ₯Ό λΉ λ₯΄κ²Œ κ²€μƒ‰ν•˜λŠ” 것이 μ€‘μš”ν•˜λ‹€. λ”°λΌμ„œ λŒ€κ·œλͺ¨ ν…Œμ΄λΈ”μ—μ„œ μ†ŒλŸ‰μ˜ 데이터λ₯Ό 효율적으둜 검색할 수 μžˆλ„λ‘ 인덱슀λ₯Ό μ΅œμ ν™”ν•˜λŠ” νŠœλ‹μ΄ ν•„μˆ˜μ μ΄λ‹€. 인덱슀 μŠ€μΊ” κ³Όμ •μ—μ„œ μ„±λŠ₯을 κ²°μ •ν•˜λŠ” μš”μ†ŒλŠ” μ—¬λŸ¬ κ°€μ§€κ°€ μžˆμ§€λ§Œ, ν•΅μ‹¬μ μœΌλ‘œ κ³ λ €ν•΄μ•Ό ν•  두 κ°€μ§€ μš”μ†ŒλŠ” λ‹€μŒκ³Ό κ°™λ‹€.

 

βœ”οΈ 핡심 μš”μ†Œ

  • 인덱슀 μŠ€μΊ” νš¨μœ¨ν™” νŠœλ‹
    • 인덱슀 μŠ€μΊ” κ³Όμ •μ—μ„œ λΆˆν•„μš”ν•œ 연산을 μ΅œμ†Œν™”ν•˜λŠ” 것이 μ€‘μš”ν•˜λ‹€.
    • 인덱슀 μ •λ ¬ 방식과 μ ‘κ·Ό 방식을 μ΅œμ ν™”ν•˜μ—¬ μŠ€μΊ” 횟수λ₯Ό μ€„μ΄λŠ” 것이 핡심이닀.
  • 랜덀 μ•‘μ„ΈμŠ€ μ΅œμ†Œν™” νŠœλ‹
    • 인덱슀 μŠ€μΊ” ν›„ ν…Œμ΄λΈ” 데이터λ₯Ό κ°€μ Έμ˜¬ λ•Œ 랜덀 I/Oλ₯Ό μ΅œμ†Œν™”ν•΄μ•Ό ν•œλ‹€.
    • ν…Œμ΄λΈ” μ ‘κ·Ό 횟수λ₯Ό 쀄이면 λ””μŠ€ν¬ I/O 뢀담을 쀄일 수 μžˆμ–΄ μ„±λŠ₯ ν–₯상에 직접적인 영ν–₯을 λ―ΈμΉœλ‹€.

βœ”οΈ 랜덀 μ•‘μ„ΈμŠ€ μ΅œμ†Œν™”κ°€ μ€‘μš”ν•œκ°€?

 

λ°μ΄ν„°λ² μ΄μŠ€ μ„±λŠ₯이 μ €ν•˜λ˜λŠ” μ£Όμš” 원인은 λ””μŠ€ν¬ I/O λ•Œλ¬Έμ΄λ‹€. 특히 OLTP μ‹œμŠ€ν…œμ—μ„œλŠ” 인덱슀λ₯Ό ν™œμš©ν•œ 검색이 λ§ŽμœΌλ―€λ‘œ, 랜덀 I/Oκ°€ μ„±λŠ₯ μ €ν•˜μ˜ μ£Όμš” μš”μΈμ΄ λœλ‹€. 즉, SQLνŠœλ‹μ˜ 핡심은 랜덀 μ•‘μ„ΈμŠ€ μ΅œμ†Œν™” ν•˜λŠ” 것 이라고 ν•  수 μžˆλ‹€.

 

λ”°λΌμ„œ 인덱슀 νŠœλ‹μ„ 톡해 λΆˆν•„μš”ν•œ ν…Œμ΄λΈ” μ•‘μ„ΈμŠ€λ₯Ό 쀄이고 랜덀 I/Oλ₯Ό μ΅œμ†Œν™”ν•˜λŠ” 것이 μ„±λŠ₯ μ΅œμ ν™”μ˜ 핡심 μ „λž΅μ΄λ‹€.

 

πŸ–‡οΈ 인덱슀 ꡬ쑰

μΈλ±μŠ€λŠ” λŒ€μš©λŸ‰ ν…Œμ΄λΈ”μ—μ„œ ν•„μš”ν•œ λ°μ΄ν„°λ§Œ λΉ λ₯΄κ³  효율적으둜 μ•‘μ„ΈμŠ€ ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” 객체(Object)이닀.

1. 인덱슀 기본 ꡬ쑰

μ—¬λŸ¬ μ’…λ₯˜μ˜ 인덱슀 쀑 κ°€μž₯ 일반적으둜 μ‚¬μš©λ˜λŠ” B * Tree 인덱슀 κ΅¬μ‘°λŠ” 루트(Root), 브랜치(Branch), 그리고 리프(Leaf) λΈ”λ‘μœΌλ‘œ κ΅¬μ„±λœλ‹€.

인덱슀 ꡬ쑰

  • 루트 및 브랜치 블둝
    • ν•˜μœ„ λ…Έλ“œ 블둝을 μ ‘κ·Όν•˜κΈ° μœ„ν•œ μ£Όμ†Œ 정보 (DBA, Data Block Address) 정보λ₯Ό κ°–κ³  μžˆλ‹€.
    • νŠΉλ³„ν•œ μ—”νŠΈλ¦¬μΈ Leftmost Child (LMC)κ°€ μ‘΄μž¬ν•˜λŠ”λ°, κ°€μž₯ μ™Όμͺ½ 첫 번째 λ ˆμ½”λ“œμ΄κ³  μžμ‹ λ…Έλ“œ 쀑에 κ°€μž₯ μ™Όμͺ½ 끝에 μœ„μΉ˜ν•œ 블둝을 가리킨닀. LMCλŠ” λͺ…μ‹œμ μΈ ν‚€ 값을 κ°–μ§€ μ•Šλ”λΌλ„ ν‚€ 값을 κ°€μ§„ 첫번째 μ—”νŠΈλ¦¬λ³΄λ‹€ μž‘μ€ κ°’μ˜ 의미λ₯Ό κ°–λŠ”λ‹€.
  • 리프 블둝
    • 인덱슀 ν‚€ 컬럼 κ°’κ³Ό ν•΄λ‹Ή 값을 κ°€μ§„ ν…Œμ΄λΈ” λ ˆμ½”λ“œλ₯Ό μ°ΎκΈ° μœ„ν•œ ROWID 정보λ₯Ό μ €μž₯ν•œλ‹€.
    • 리프 블둝은 항상 ν‚€ 컬럼 순으둜 μ •λ ¬λ˜μ–΄ μžˆμ–΄, νŠΉμ • λ²”μœ„ λ‚΄μ—μ„œ μ—°μ†λœ 값을 λΉ λ₯΄κ²Œ 검색할 수 μžˆλŠ” λ²”μœ„ μŠ€μΊ”(Range Scan) 이 κ°€λŠ₯ν•˜λ‹€. 인덱슀 킀값이 κ°™μ„λ•ŒλŠ” ROWID 순으둜 μ •λ ¬λ˜μ–΄ μžˆλ‹€.

βœ”οΈ λ²”μœ„ μŠ€μΊ”

 

ν…Œμ΄λΈ”μ€ μ²˜μŒλΆ€ν„° λκΉŒμ§€ λͺ¨λ“  λ ˆμ½”λ“œλ₯Ό 읽어야 μ™„μ „ν•œ 결과집합을 얻을 수 μžˆμ§€λ§Œ, μΈλ±μŠ€λŠ” ν‚€ 값이 μ •λ ¬λ˜μ–΄ 있기 λ•Œλ¬Έμ— νŠΉμ • λ²”μœ„ λ‚΄μ—μ„œ μ—°μ†λœ 값을 효율적으둜 검색할 수 μžˆλ‹€. νŠΉμ • μœ„μΉ˜μ—μ„œ μŠ€μΊ”μ„ μ‹œμž‘ν•΄ 검색 쑰건에 μΌμΉ˜ν•˜μ§€ μ•ŠλŠ” 값을 λ§Œλ‚˜λŠ” μˆœκ°„ 멈좜 수 있기 λ•Œλ¬Έμ— 인덱슀λ₯Ό ν†΅ν•΄μ„œλŠ” λ²”μœ„ μŠ€μΊ”μ΄ κ°€λŠ₯ν•˜λ‹€.

 

반면, 일반적인 νž™ ꡬ쑰 ν…Œμ΄λΈ”μ€ 데이터가 물리적으둜 μ •λ ¬λ˜μ–΄ μžˆμ§€ μ•ŠμœΌλ―€λ‘œ λ²”μœ„ μŠ€μΊ”μ΄ μ–΄λ ΅λ‹€. μ •λ ¬ μƒνƒœκ°€ μœ μ§€λ˜λ„λ‘ μ‚¬μš©μžκ°€ 데이터λ₯Ό μž…λ ₯ν•œλ‹€ ν•˜μ—¬λ„, μ˜΅ν‹°λ§ˆμ΄μ €κ°€ 이λ₯Ό 그것을 μ‹ λ’°ν•΄ ν…Œμ΄λΈ”μ—μ„œ λ²”μœ„ μŠ€μΊ”μ΄ μΌμ–΄λ‚˜λ„λ‘ μ‹€ν–‰κ³„νšμ„ μˆ˜λ¦½ν•˜μ§€ μ•ŠλŠ”λ‹€. 단, IOT(index-organized table)λŠ” νŠΉμ • 컬럼 순으둜 데이터λ₯Ό μ €μž₯ν•˜κΈ° λ•Œλ¬Έμ— λ²”μœ„ μŠ€μΊ”μ΄ κ°€λŠ₯ν•˜λ‹€.

 

2. μΈλ±μŠ€μ™€ ν…Œμ΄λΈ” κ°„μ˜ 관계

일뢀 DBMSμ—μ„œλŠ” 값이 NULL 여뢀와 관계없이 μΈλ±μŠ€μ— μ €μž₯ν•˜λŠ” 반면, Oracle은 인덱슀 ꡬ성 컬럼의 값이 λͺ¨λ‘ NULL인 λ ˆμ½”λ“œλŠ” μ €μž₯ν•˜μ§€ μ•ŠλŠ”λ‹€. 즉, 인덱슀 ꡬ성 컬럼의 값이 μ „λΆ€ NULL이 아닐 경우, μΈλ±μŠ€μ™€ ν…Œμ΄λΈ” λ ˆμ½”λ“œλŠ” 1:1 λŒ€μ‘κ΄€κ³„λ₯Ό κ°–λŠ”λ‹€. (단, ν΄λŸ¬μŠ€ν„° μΈλ±μŠ€λŠ” 1:M 관계) λ˜ν•œ, λΈŒλžœμΉ˜μ— μ €μž₯된 λ ˆμ½”λ“œ μˆ˜λŠ” ν•΄λ‹Ή 브랜치의 ν•˜μœ„ 블둝 μˆ˜μ™€ μΌμΉ˜ν•œλ‹€.

 

μœ„μ—μ„œ μ–ΈκΈ‰ν–ˆλ“―μ΄ 인덱슀 λ¦¬ν”„μ˜ λ ˆμ½”λ“œμ™€ ν…Œμ΄λΈ” λ ˆμ½”λ“œλŠ” 1:1 관계이며, μ΄λ“€μ˜ ν‚€ 값도 λ™μΌν•˜λ‹€. λ”°λΌμ„œ ν…Œμ΄λΈ” λ ˆμ½”λ“œμ—μ„œ 값이 κ°±μ‹ λ˜λ©΄, λŒ€μ‘ν•˜λŠ” 인덱슀 ν‚€ 값도 ν•¨κ»˜ κ°±μ‹ (delete & insert)λœλ‹€.

 

반면, 리프 λ…Έλ“œμ˜ μ—”νŠΈλ¦¬ ν‚€ 값이 κ°±μ‹ λ˜λ”λΌλ„ 브랜치 λ…Έλ“œκΉŒμ§€ 값이 λ³€κ²½λ˜μ§€ μ•ŠλŠ”λ‹€. 브랜치 블둝에 μœ„μΉ˜ν•œ μ—”νŠΈλ¦¬λŠ” ν•˜μœ„ λ…Έλ“œ 블둝 쀑 μžμ‹ μ˜ ν‚€ κ°’κ³Ό κ°™κ±°λ‚˜ 큰 값을 κ°€μ§„ μ˜μ—­μ„ ν¬μΈνŒ… ν•˜λŠ”λ°, κ·Έ ν‚€ 값은 μžμ‹ λ…Έλ“œ 전체가 ν¬ν•¨ν•˜λŠ” κ°’μ˜ λ²”μœ„λ₯Ό λ‚˜νƒ€λ‚΄κΈ° λ•Œλ¬Έμ΄λ‹€. λ”°λΌμ„œ, ν•˜μœ„ λ…Έλ“œμ˜ 첫 번째 λ ˆμ½”λ“œμ™€ μ •ν™•νžˆ μΌμΉ˜ν•˜μ§€ μ•Šμ„ 수 μžˆλ‹€. 참고둜, 브랜치 λ…Έλ“œμ˜ 갱신은 인덱슀 λΆ„ν•  κ³Όμ •μ—μ„œ μƒˆλ‘œμš΄ 블둝이 μΆ”κ°€λ˜κ±°λ‚˜ μ‚­μ œλ  λ•Œλ§Œ λ°œμƒν•œλ‹€.

 

  • 리프 λ…Έλ“œ
    • 리프 λ…Έλ“œμƒμ˜ 인덱슀 λ ˆμ½”λ“œμ™€ ν…Œμ΄λΈ” λ ˆμ½”λ“œ κ°„μ—λŠ” 1:1 관계
    • 리프 λ…Έλ“œμƒμ˜ ν‚€ κ°’κ³Ό ν…Œμ΄λΈ” λ ˆμ½”λ“œ ν‚€ 값은 μ„œλ‘œ 일치
  • 브랜치 λ…Έλ“œ
    • 브랜치 λ…Έλ“œμƒμ˜ λ ˆμ½”λ“œ κ°œμˆ˜λŠ” ν•˜μœ„ 블둝 κ°œμˆ˜μ™€ 일치
    • 브랜치 λ…Έλ“œμƒμ˜ ν‚€ 값은 ν•˜μœ„ λ…Έλ“œκ°€ κ°–λŠ” κ°’μ˜ λ²”μœ„λ₯Ό 의미

μ΄λŸ¬ν•œ 인덱슀 ꡬ쑰와 νŠΉμ§•μ„ λͺ…ν™•νžˆ μ΄ν•΄ν•˜λ©΄ 인덱슀 탐색 과정을 보닀 μ‰½κ²Œ νŒŒμ•…ν•  수 μžˆλ‹€.

 

3. ROWID

ROWIDλŠ” ν…Œμ΄λΈ” λ ˆμ½”λ“œμ˜ 물리적 μœ„μΉ˜ 정보λ₯Ό λ‚˜νƒ€λ‚΄λŠ” pseudo 컬럼으둜, μ‹€μ œ ν…Œμ΄λΈ”μ— μ €μž₯λ˜λŠ” 값이 μ•„λ‹ˆλΌ, μΈλ±μŠ€μ™€ 데이터 블둝 헀더에 μ‘΄μž¬ν•˜λŠ” 정보λ₯Ό 기반으둜 λ™μ μœΌλ‘œ μƒμ„±λœλ‹€.

 

β‘  ꡬ성 μš”μ†Œ

  • ROWID = 데이터 블둝 μ£Όμ†Œ + 둜우 번호
  • 데이터 블둝 μ£Όμ†Œ (DBA) = 데이터 파일 번호 + 블둝 번호
  • 블둝 번호 : 데이터 파일 λ‚΄μ—μ„œ λΆ€μ—¬ν•œ μƒλŒ€μ  순번
  • 둜우 번호 : 블둝 λ‚΄ λ ˆμ½”λ“œ 순번

이처럼 ROWIDμ—λŠ” 데이터 파일 번호, 블둝 번호, 둜우 번호 λ“± ν…Œμ΄λΈ” λ ˆμ½”λ“œμ˜ 물리적 μœ„μΉ˜ 정보가 ν¬ν•¨λ˜λ©°, 이 μ •λ³΄λŠ” ν…Œμ΄λΈ” μžμ²΄μ— μ €μž₯λ˜λŠ” 것이 μ•„λ‹ˆλΌ μΈλ±μŠ€μ— μ €μž₯λœλ‹€. λ”°λΌμ„œ ROWIDλ₯Ό 좜λ ₯ν•  μˆ˜λŠ” μžˆμ§€λ§Œ, μ‹€μ œ ν…Œμ΄λΈ” λ°μ΄ν„°λ‘œ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€.

 

인덱슀λ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” μΏΌλ¦¬μ—μ„œ ROWIDκ°€ μš”κ΅¬λ  경우, 데이터 블둝 헀더에 μ €μž₯된 였브젝트 및 데이터 파일 번호, μƒλŒ€μ  블둝 λ²ˆν˜Έμ™€ λ ˆμ½”λ“œμ˜ 슬둯 번호λ₯Ό ν™œμš©ν•˜μ—¬ λ™μ μœΌλ‘œ 가곡해 좜λ ₯ν•  수 μžˆλ‹€.

 

β‘‘ Oracle 버전에 λ”°λ₯Έ ROWID 포맷 λ³€ν™”

 

Oracle 7 이전 (μ œν•œ ROWID 포맷)κΉŒμ§€μ˜ ROWIDλŠ” 6λ°”μ΄νŠΈ 크기λ₯Ό κ°€μ§€λ©°, 데이터 파일 번호, 블둝 번호, 둜우 번호의 3개 κ΅¬μ„±μš”μ†Œλ‘œ 이루어진닀.

 

Oracle 8 이후 (ν™•μž₯ ROWID 포맷)λΆ€ν„°λŠ” λ°μ΄ν„°μ˜ μ–‘ 증가와 더 λ§Žμ€ 데이터 파일 관리, νŒŒν‹°μ…”λ‹ κΈ°λŠ₯ λ„μž… λ“±μ˜ 이유둜 였브젝트 λ²ˆν˜ΈκΉŒμ§€ μ €μž₯ν•  ν•„μš”κ°€ 생겼기 λ•Œλ¬Έμ— ROWID 크기가 10λ°”μ΄νŠΈλ‘œ ν™•λŒ€λ˜μ—ˆλ‹€. κΈ°μ‘΄ 3개의 κ΅¬μ„±μš”μ†Œμ— 데이터 였브젝트 λ²ˆν˜Έκ°€ μΆ”κ°€λ˜μ–΄ 총 4개의 κ΅¬μ„±μš”μ†Œλ‘œ κ΅¬μ„±λœλ‹€.

 

  • 데이터 였브젝트 번호: λ°μ΄ν„°λ² μ΄μŠ€ μ„Έκ·Έλ¨ΌνŠΈλ₯Ό μ‹λ³„ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜λŠ” 데이터 였브젝트 번호
  • 데이터 파일 번호: ν…Œμ΄λΈ”μŠ€νŽ˜μ΄μŠ€ λ‚΄μ—μ„œμ˜ μƒλŒ€μ  번호(버전 7κΉŒμ§€λŠ” λ°μ΄ν„°λ² μ΄μŠ€ λ‚΄μ—μ„œ μœ μΌν•œ κ°’)
  • 블둝 번호: 데이터 파일 λ‚΄μ—μ„œμ˜ μƒλŒ€μ  블둝 번호
  • 둜우 번호: ν•΄λ‹Ή 블둝 λ‚΄ λ ˆμ½”λ“œ 순번

이와 같이 ROWID의 ꡬ쑰λ₯Ό μ΄ν•΄ν•˜λŠ” 것은 Oracleμ—μ„œ ν…Œμ΄λΈ” λ ˆμ½”λ“œμ˜ 물리적 μ ‘κ·Ό 방식 및 μΈλ±μŠ€μ™€μ˜ 관계λ₯Ό νŒŒμ•…ν•˜λŠ” 데 맀우 μ€‘μš”ν•˜λ‹€.

πŸ–‡οΈ 인덱슀 탐색

1. 인덱슀 탐색

인덱슀 탐색은 크게 수직적 탐색과 μˆ˜ν‰μ  νƒμƒ‰μœΌλ‘œ λ‚˜λˆŒ 수 μžˆλ‹€.

(1) 인덱슀 수직적 탐색

μ •λ ¬λœ 인덱슀 λ ˆμ½”λ“œ μ€‘μ—μ„œ 쑰건을 λ§Œμ‘±ν•˜λŠ” 첫 번째 λ ˆμ½”λ“œλ₯Ό μ°ΎλŠ” κ³Όμ •, 인덱슀 μ‹œμž‘ 지점을 μ°ΎλŠ” κ³Όμ •

 

수직적 탐색은 μˆ˜ν‰μ  탐색을 μœ„ν•œ μ‹œμž‘ 지점을 μ°ΎλŠ” 과정이라고 ν•  수 있으며, 인덱슀 트리의 λ£¨νŠΈμ—μ„œ 리프 λΈ”λ‘κΉŒμ§€ λ‚΄λ €κ°€λŠ” λ°©μ‹μœΌλ‘œ μ§„ν–‰λ˜λ―€λ‘œ ‘수직적’이라고 λΆ€λ₯Έλ‹€

 

βœ”οΈ 탐색과정

  1. 탐색은 루트 λΈ”λ‘μ—μ„œ μ‹œμž‘ν•˜μ—¬, 각 λ…Έλ“œμ— μ €μž₯된 ν•˜μœ„ 블둝에 λŒ€ν•œ μ£Όμ†Œκ°’μ„ μ΄μš©ν•˜μ—¬ 리프 λΈ”λ‘κΉŒμ§€ μ§„ν–‰λœλ‹€.
  2. 찾고자 ν•˜λŠ” 값보닀 ν¬κ±°λ‚˜ 같은 값을 λ§Œλ‚˜λ©΄ λ°”λ‘œ 직전 λ ˆμ½”λ“œκ°€ κ°€λ¦¬ν‚€λŠ” ν•˜μœ„ λΈ”λ‘μœΌλ‘œ μ΄λ™ν•œλ‹€.

이 과정은 쑰건을 λ§Œμ‘±ν•˜λŠ” λ ˆμ½”λ“œλ₯Ό μ°Ύμ•„κ°€λŠ” 과정이 μ•„λ‹ˆλΌ 쑰건을 λ§Œμ‘±ν•˜λŠ” 첫번째 λ ˆμ½”λ“œλ₯Ό μ°ΎλŠ” 과정이닀. λ˜ν•œ, 쑰건을 λ§Œμ‘±ν•˜λŠ” μ‹œμž‘μ μ„ λΉ λ₯΄κ²Œ μ°ΎκΈ° μœ„ν•œ κ²ƒμœΌλ‘œ, μ΄ν›„μ˜ μˆ˜ν‰μ  탐색 μ€€λΉ„ 단계라고 λ³Ό 수 μžˆλ‹€.

 

(2) 인덱슀 μˆ˜ν‰μ  탐색

μΈλ±μŠ€μ—μ„œ 본격적으둜 데이터λ₯Ό μ°ΎλŠ” κ³Όμ •

 

μˆ˜ν‰μ  탐색은 λ²”μœ„ μŠ€μΊ”(range scan)이라고 ν•  수 있으며, 인덱슀의 리프 블둝에 μ €μž₯된 λ ˆμ½”λ“œλ“€μ΄ 논리적 μˆœμ„œλŒ€λ‘œ λ°°μ—΄λ˜μ–΄ μžˆμ–΄ μ’Œμ—μ„œ 우 λ˜λŠ” μš°μ—μ„œ 쒌둜 순차적으둜 μŠ€μΊ”ν•˜κ²Œ λœλ‹€.

 

βœ”οΈ 탐색과정

  1. 수직적 탐색을 톡해 μŠ€μΊ” μ‹œμž‘μ (첫 번째 λ ˆμ½”λ“œ)을 μ°Ύμ•˜μœΌλ©΄ 리프 블둝을 μˆ˜ν‰μ μœΌλ‘œ 탐색을 μ§„ν–‰ν•œλ‹€.
    • 인덱슀 리프 블둝은 μ–‘λ°©ν–₯ μ—°κ²° 리슀트 ꡬ쑰둜 λ˜μ–΄ μžˆμ–΄, μ‹œμž‘ λ ˆμ½”λ“œμ—μ„œ 쒌우둜 순차적(μˆ˜ν‰μ ) μŠ€μΊ”μ΄ κ°€λŠ₯ν•˜λ‹€.
  2. 이 과정을 톡해 쑰건에 λΆ€ν•©ν•˜λŠ” λ ˆμ½”λ“œλ“€μ˜ ROWIDλ₯Ό νšλ“ν•œλ‹€.
  3. λ§Œμ•½ 인덱슀만으둜 ν•„μš”ν•œ λͺ¨λ“  컬럼 정보λ₯Ό μ œκ³΅ν•  수 μžˆλ‹€λ©΄ 탐색은 μ—¬κΈ°μ„œ μ’…λ£Œλ˜μ§€λ§Œ, κ·Έλ ‡μ§€ μ•Šμ€ 경우 νšλ“ν•œ ROWIDλ₯Ό μ΄μš©ν•˜μ—¬ ν…Œμ΄λΈ” 데이터λ₯Ό μΆ”κ°€λ‘œ μ‘°νšŒν•œλ‹€.

수직적 탐색과 μˆ˜ν‰μ  탐색을 λͺ¨λ‘ μˆ˜ν–‰ν•˜λŠ” μ΄μœ λŠ”, 쑰건에 λΆ€ν•©ν•˜λŠ” λͺ¨λ“  데이터λ₯Ό μ°Ύμ•„λ‚΄κ³  그에 ν•΄λ‹Ήν•˜λŠ” ROWIDλ₯Ό ν™•λ³΄ν•˜κΈ° μœ„ν•¨μ΄λ‹€. λ§Œμ•½ ν•„μš”ν•œ 컬럼이 μΈλ±μŠ€μ— λͺ¨λ‘ ν¬ν•¨λ˜μ–΄ μžˆλ‹€λ©΄ 이 과정을 톡해 검색을 μ™„λ£Œν•  수 μžˆμœΌλ‚˜, κ·Έλ ‡μ§€ μ•Šμ€ 경우 ν…Œμ΄λΈ” 접근이 ν•„μš”ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

2. κ²°ν•© 인덱슀 ꡬ쑰와 탐색

두 개 μ΄μƒμ˜ μ»¬λŸΌμ„ κ²°ν•©ν•˜μ—¬ 인덱슀λ₯Ό 생성할 수 μžˆλ‹€. κ²°ν•© 인덱슀의 경우, 인덱슀 λ‚΄μ˜ 컬럼 μˆœμ„œμ— 관계없이 "=" 쑰건으둜 검색할 λ•Œ μ½λŠ” 인덱슀 블둝 μˆ˜λŠ” λ™μΌν•˜λ‹€.
즉, 인덱슀 컬럼 μˆœμ„œμ™€ 상관없이, λͺ¨λ“  κ²½λ‘œκ°€ B * Tree의 κ· ν˜• ꡬ쑰λ₯Ό λ”°λ₯΄κΈ° λ•Œλ¬Έμ— λ£¨νŠΈλΆ€ν„° λ¦¬ν”„κΉŒμ§€μ˜ λ†’μ΄λŠ” 항상 λ™μΌν•˜λ©°, 이에 따라 블둝 I/O νšŸμˆ˜λ„ κ°™μœΌλ―€λ‘œ μ„±λŠ₯도 λ˜‘κ°™λ‹€.

 

단, "=" 쑰건 검색에 ν•œμ •λœ 이야기이며, λ²”μœ„ μ‘°κ±΄μ΄λ‚˜ κ²°ν•© 쑰건에 λ”°λΌμ„œλŠ” μ ‘κ·Ό 방식에 차이가 λ°œμƒν•  수 μžˆλ‹€.