Skip to content

Latest commit

Β 

History

History
203 lines (118 loc) Β· 6.8 KB

Deep_Dive_SQL_이둠_#3.md

File metadata and controls

203 lines (118 loc) Β· 6.8 KB

Deep Dive SQL 이둠 #3


μ„±λŠ₯ 데이터 λͺ¨λΈλ§ β˜…


아킀텍쳐 λͺ¨λΈλ§

  • 데이터 λͺ¨λΈλ§ κ³Όμ •μ—μ„œ λ°μ΄ν„°μ˜ ꡬ쑰와 관계λ₯Ό μ •μ˜.

  • μ•„ν‚€ν…μ²˜ λͺ¨λΈλ§μ€ μ‹œμŠ€ν…œμ˜ μ „λ°˜μ μΈ ꡬ쑰와 데이터 ν”Œλ‘œμš°λ₯Ό μ€‘μ μ μœΌλ‘œ 닀룬닀.

  • μ •κ·œν™”: λ°μ΄ν„°μ˜ 쀑볡을 μ΅œμ†Œν™”ν•˜κ³  λ°μ΄ν„°μ˜ 무결성을 μœ μ§€ν•˜κΈ° μœ„ν•΄ 데이터λ₯Ό κ΅¬μ‘°ν™”ν•˜λŠ” κ³Όμ •.

  • λ°˜μ •κ·œν™”: μ„±λŠ₯ ν–₯상을 μœ„ν•΄ μΌλΆ€λŸ¬ λ°μ΄ν„°μ˜ 쀑볡을 ν—ˆμš©ν•˜λŠ” κ³Όμ •.


SQL νŠœλ‹

  • λ°μ΄ν„°λ² μ΄μŠ€μ˜ μ„±λŠ₯을 μ΅œμ ν™”ν•˜κΈ° μœ„ν•΄ SQL 쿼리λ₯Ό μˆ˜μ •ν•˜λŠ” κ³Όμ •.

    • μ΄λŠ” 쿼리의 μ‹€ν–‰ 속도λ₯Ό λ†’μ΄κ±°λ‚˜ μ‹œμŠ€ν…œ λ¦¬μ†ŒμŠ€ μ‚¬μš©μ„ μ€„μ΄λŠ” 데 쀑점을 λ‘”λ‹€.
  • Join μˆ˜ν–‰ 원리: 두 개 μ΄μƒμ˜ ν…Œμ΄λΈ”μ—μ„œ 데이터λ₯Ό κ²°ν•©ν•˜λŠ” 방식에 λŒ€ν•œ 원리.


Hash Join

  • Hash Join은 주둜 쀑간 크기의 ν…Œμ΄λΈ” κ°„μ˜ Join에 유리.

  • λ“±κ°€ Join: 두 ν…Œμ΄λΈ”μ—μ„œ 같은 값을 가진 λ ˆμ½”λ“œλ₯Ό κ²°ν•©ν•˜λŠ” Join 방식.

  • μ„ ν–‰ ν…Œμ΄λΈ”: Hash Joinμ—μ„œ λ¨Όμ € μŠ€μΊ” λ˜λŠ” ν…Œμ΄λΈ”.


NL (Nested Loop) Join

  • λŒ€μš©λŸ‰ sort μž‘μ—….

  • μ„ ν–‰ ν…Œμ΄λΈ”μ΄ μž‘μ„μˆ˜λ‘ 유리.

  • 랜덀 μ•‘μ„ΈμŠ€: λ°μ΄ν„°λ² μ΄μŠ€μ˜ λ ˆμ½”λ“œμ— λ¬΄μž‘μœ„λ‘œ μ ‘κ·Όν•˜λŠ” 것.


Sort Merge Join

  • 두 ν…Œμ΄λΈ”μ˜ Join Keyλ₯Ό λ¨Όμ € μ •λ ¬ν•œ ν›„ Join을 μˆ˜ν–‰ν•˜λŠ” 방식.

Optimizer

  • λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ 쿼리λ₯Ό μ–΄λ–»κ²Œ 싀행할지 κ²°μ •ν•˜λŠ” μ»΄ν¬λ„ŒνŠΈ.

  • CBO (Cost-Based Optimizer): 쿼리의 μ‹€ν–‰ κ³„νšμ„ κ²°μ •ν•  λ•Œ μ˜ˆμƒ λΉ„μš©μ„ 기반으둜 졜적의 μ‹€ν–‰ κ³„νšμ„ 선택.

  • RBO (Rule-Based Optimizer): 미리 μ •μ˜λœ κ·œμΉ™ μ„ΈνŠΈλ₯Ό 기반으둜 쿼리의 μ‹€ν–‰ κ³„νšμ„ κ²°μ •.





μ •κ·œν™” β˜…β˜…β˜…



  • Select μ‹œ join λ•Œλ¬Έμ— 느렀질 수 μžˆλ‹€. (ν…Œμ΄λΈ”μ΄ λŠ˜μ–΄λ‚˜μ„œ)
  • Insert, updateλŠ” 빨라질 수 μžˆλ‹€. (ν…Œμ΄λΈ” μ‚¬μ΄μ¦ˆκ°€ μž‘μ•„μ Έμ„œ)



이상 ν˜„μƒ

  • μ‚½μž… 이상(insertion anomaly)οΌšμƒˆ 데이터λ₯Ό μ‚½μž…ν•˜κΈ° μœ„ν•΄μ„œ λΆˆν•„μš”ν•œ 데이터도 ν•¨κ»˜ μ‚½μž…ν•΄μ•Ό ν•˜λŠ” 이상 문제

  • κ°±μ‹  이상(update anomaly)οΌšμ€‘λ³΅νŠœν”Œ 쀑 μΌλΆ€λ§Œ λ³€κ²½ν•˜μ—¬ 데이터가 λΆˆμΌμΉ˜ν•˜κ²Œ λ˜λŠ” 이상 문제

  • μ‚­μ œ 이상(delete anomaly)οΌšνŠœν”Œμ„ μ‚­μ œν•˜λ©΄ ν•„μš”ν•œ λ°μ΄ν„°κΉŒμ§€ ν•¨κ»˜ μ‚­μ œλ˜λŠ” 이상 문제



반 μ •κ·œν™” β˜…β˜…

  • 반 μ •κ·œν™”λŠ” λ°μ΄ν„°μ˜ 무결성을 ν•΄μΉ  수 μžˆμœΌλ―€λ‘œ μ£Όμ˜κ°€ ν•„μš”ν•˜λ‹€.

절차

    1. λŒ€λŸ‰ λ²”μœ„ 처리 λΉˆλ„μˆ˜ 쑰사
    1. λ²”μœ„ 처리 λΉˆλ„μˆ˜
    1. ν†΅κ³„μ²˜λ¦¬ μ—¬λΆ€

μ’…λ₯˜ μ„€λͺ…
ν…Œμ΄λΈ” 병합 1:1/1:M 두 개의 ν…Œμ΄λΈ”μ„ ν•˜λ‚˜λ‘œ ν•©μΉ˜λŠ” 방식
슈퍼/μ„œλΈŒνƒ€μž… 병합 슈퍼 νƒ€μž…κ³Ό μ„œλΈŒνƒ€μž…μ˜ ν…Œμ΄λΈ”μ„ ν•©μΉ˜λŠ” 방식
λΆ€λΆ„ ν…Œμ΄λΈ” λΆ„ν•  ν•˜λ‚˜μ˜ ν…Œμ΄λΈ”μ„ μ—¬λŸ¬ λΆ€λΆ„ ν…Œμ΄λΈ”λ‘œ 뢄리
톡계 ν…Œμ΄λΈ” λΆ„ν•  톡계 정보λ₯Ό 담은 ν…Œμ΄λΈ”μ„ λΆ„ν• 
쀑볡 ν…Œμ΄λΈ” λΆ„ν•  μ€‘λ³΅λœ 정보λ₯Ό κ°–λŠ” ν…Œμ΄λΈ”μ„ λΆ„ν• 
이λ ₯ 컬럼 μΆ”κ°€ 데이터 λ³€κ²½ 이λ ₯을 μΆ”μ ν•˜κΈ° μœ„ν•œ 컬럼 μΆ”κ°€
쀑볡 컬럼 μΆ”κ°€ μ„±λŠ₯ ν–₯상을 μœ„ν•œ 쀑볡 컬럼 μΆ”κ°€
PKλ₯Ό 일반 컬럼으둜 병합 Primary Keyλ₯Ό 일반 컬럼으둜 λ³€κ²½
νŒŒμƒ 컬럼 μΆ”κ°€ λ‹€λ₯Έ μ»¬λŸΌμ—μ„œ νŒŒμƒλœ 값을 μ €μž₯ν•˜λŠ” 컬럼 μΆ”κ°€
μ‘μš©μ‹œμŠ€ν…œ μ˜€μž‘λ™μ„ ν”Όν•˜κΈ° μœ„ν•œ μž„μ‹œ κ°’ 컬럼 μΆ”κ°€ μž„μ‹œκ°’μ„ μ €μž₯ν•˜λŠ” 컬럼 μΆ”κ°€
쀑볡 관계 μΆ”κ°€ μ€‘λ³΅λœ 관계λ₯Ό ν…Œμ΄λΈ”μ— μΆ”κ°€



데이터에 λ”°λ₯Έ μ„±λŠ₯


Row Migration (ν–‰ 이전)

ν•­λͺ© μ„€λͺ…
μ •μ˜ Update둜 인해 ν–‰ 길이가 μ¦κ°€ν–ˆμ„ λ•Œ λ°œμƒν•˜λŠ” ν˜„μƒ.
원리 μ›λž˜ 정보λ₯Ό κΈ°μ‘΄ 블둝에 남겨두고 μ‹€μ œ λ°μ΄ν„°λŠ” λ‹€λ₯Έ 블둝에 μ €μž₯. 이둜 인해 μ„±λŠ₯ κ°μ†Œ λ°œμƒ.
ν•΄κ²°μ±… PCTFREE μ˜μ—­μ„ μΆ©λΆ„νžˆ ν• λ‹Ή. 단, λ„ˆλ¬΄ 크게 μ„€μ •ν•˜λ©΄ 곡간 νš¨μœ¨μ„±μ΄ κ°μ†Œλ  수 있음.

Chaining (ν–‰ μ—°κ²°)

ν•­λͺ© μ„€λͺ…
μ •μ˜ 데이터 크기 λ•Œλ¬Έμ— μ—¬λŸ¬ 블둝에 λ‚˜λˆ„μ–΄ μ €μž₯λ˜λŠ” ν˜„μƒ.
원리 2개 μ΄μƒμ˜ 데이터 블둝을 검색해야 함. 행쑰각 및 Row Pointer둜 블둝 내에 μ €μž₯.
ν•΄κ²°μ±… DB_BLOCK_SIZEλ₯Ό 크게 μ„€μ •ν•˜μ—¬ μ΅œμ†Œν™” κ°€λŠ₯. 단, 크게 μ„€μ •ν•˜κΈ° μ–΄λ ΅κ±°λ‚˜ 항상 λ°”λžŒμ§ν•˜μ§€ μ•Šμ„ 수 있음.

Partitioning

Partition Type κΈ°μ€€ νŠΉμ§•
List partition νŠΉμ • κ°’ 관리가 μ‰¬μš°λ‚˜ 데이터가 ν•œμͺ½μœΌλ‘œ 치우칠 수 있음.
Range partition νŠΉμ • κ°’μ˜ λ²”μœ„ 관리가 μ‰¬μš°λ©° κ°€μž₯ 널리 μ‚¬μš©λ¨.
Hash partition λ°μ΄ν„°μ˜ λΆ„μ‚° 관리가 μƒλŒ€μ μœΌλ‘œ 어렀움.



슈퍼/μ„œλΈŒνƒ€μž…




  • νŠΈλžœμž­μ…˜μ€ 항상 μΌκ΄„λ‘œ μ²˜λ¦¬ν•˜λŠ”λ° ν…Œμ΄λΈ”μ€ κ°œλ³„λ‘œ μœ μ§€λ˜μ–΄ Union 연산에 μ˜ν•΄ μ„±λŠ₯이 μ €ν•˜λ  수 μžˆλ‹€.

  • νŠΈλžœμž­μ…˜μ€ 항상 μ„œλΈŒνƒ€μž… κ°œλ³„λ‘œ μ²˜λ¦¬ν•˜λŠ”λ° ν…Œμ΄λΈ”μ€ ν•˜λ‚˜λ‘œ ν†΅ν•©λ˜μ–΄ μžˆμ–΄ λΆˆν•„μš”ν•˜κ²Œ λ§Žμ€ μ–‘μ˜ 데이터 λ•Œλ¬Έμ— μ„±λŠ₯이 μ €ν•˜λœλ‹€.

  • νŠΈλžœμž­μ…˜μ€ 항상 μŠˆνΌοΌ‹μ„œλΈŒνƒ€μž…μ„ κ³΅ν†΅μœΌλ‘œ μ²˜λ¦¬ν•˜λŠ”λ° κ°œλ³„λ‘œ μœ μ§€λ˜μ–΄ μžˆκ±°λ‚˜ ν•˜λ‚˜μ˜ ν…Œμ΄λΈ”λ‘œ μ§‘μ•½λ˜μ–΄ μžˆμ–΄ μ„± λŠ₯이 μ €ν•˜λœλ‹€.



λΆ„μ‚° λ°μ΄ν„°λ² μ΄μŠ€



인덱슀 (Index)


인덱슀 μ‚¬μš©μ΄ λΆˆκ°€λŠ₯ν•œ 경우

상황 μ„€λͺ…
λΆ€μ •ν˜• μ—°μ‚°μž 인덱슀의 κ°’κ³Ό μΌμΉ˜ν•˜μ§€ μ•ŠλŠ” 경우 κ²€μƒ‰ν•˜λŠ” μ—°μ‚°μž (예: !=, <> λ“±)
LIKE LIKE μ‚¬μš© μ‹œ, μ™€μΌλ“œμΉ΄λ“œκ°€ μ•žμ— μœ„μΉ˜ν•˜λ©΄ μΈλ±μŠ€κ°€ μ‚¬μš©λ˜μ§€ μ•ŠμŒ (예: %something)
λ¬΅μ‹œμ  ν˜• λ³€ν™˜ λ‹€λ₯Έ 데이터 νƒ€μž…μœΌλ‘œ μ•”λ¬΅μ μœΌλ‘œ ν˜• λ³€ν™˜μ΄ λ°œμƒν•˜λŠ” 경우

인덱슀의 λΆ€μž‘μš©

문제 μ„€λͺ…
DML μ„±λŠ₯ μ €ν•˜ μΈλ±μŠ€κ°€ μžˆμ„ 경우, INSERT, UPDATE, DELETE 연산이 느렀질 수 있음