[PostgreSQL] Visibility Map(κ°€μ‹œμ„± 맡)의 κ°œλ…, 원리, 생λͺ…μ£ΌκΈ° 및 정보 확인 방법

[PostgreSQL] Visibility Map(κ°€μ‹œμ„± 맡)의 κ°œλ…, 원리, 생λͺ…μ£ΌκΈ° 및 정보 확인 방법

1. Visibility Map(κ°€μ‹œμ„± 맡)λž€? Visibility Map은 νŠΈλžœμž­μ…˜μ—μ„œ 데이터에 μ ‘κ·Όν•  λ•Œ μ–΄λ–€ 데이터가 κ°€μ‹œμ μΈμ§€(λͺ¨λ“  νŠΈλžœμž­μ…˜μ—μ„œ 읽을 수 μžˆλŠ”μ§€), μ•ˆμ •μ μΈμ§€ (λ™κ²°λœ νŠœν”ŒμΈμ§€) νŒλ³„ν•˜λŠ”λ° 도움을 μ€€λ‹€. 데이터 μ ‘κ·Ό μ‹œ λΆˆν•„μš”ν•œ I/Oμž‘μ—…μ„ 쀄여주고, λ°μ΄ν„°λ² μ΄μŠ€κ°€ μ–΄λ–€ νŽ˜μ΄μ§€λ₯Ό 직접 μ ‘κ·Όν•  수 μžˆλŠ”μ§€λ₯Ό λΉ λ₯΄κ²Œ νŒλ‹¨ν•¨μœΌλ‘œμ¨ μ‹œμŠ€ν…œμ˜ νš¨μœ¨μ μ„ μ˜¬λ €μ£ΌλŠ” 역할을 ν•œλ‹€. 2. Visibility Map(κ°€μ‹œμ„± 맡)의 데이터 관리 Visibility Map은 데이터λ₯Ό μ£Όμš” λ°μ΄ν„°μ™€λŠ” λ³„λ„μ˜ 파일(fork)에 _vm 접미사λ₯Ό λΆ™μ—¬ κ΄€λ¦¬ν•œλ‹€. 예λ₯Ό λ“€μ–΄ 예λ₯Ό λ“€μ–΄ employees ν…Œμ΄λΈ”μ΄ μžˆλ‹€κ³  ν•˜λ©΄ ν…Œμ΄λΈ”μ˜ Visibility Map은 λ³„λ„μ˜ 포크에 μ €μž₯λœλ‹€. 이 포크의 이름은 파일 λ…Έλ“œ λ²ˆν˜Έμ— _vm 접미사λ₯Ό λΆ™μ—¬ κ΅¬μ„±λ˜λ©°, 예λ₯Ό λ“€μ–΄ 파일 λ…Έλ“œλ²ˆν˜Έκ°€ 12345인 경우 VM νŒŒμΌμ€ 12345_vm으둜 μ €μž₯λœλ‹€. λ°μ΄ν„°μ—λŠ” ν•΄λ‹Ή ν…Œμ΄λΈ”μ˜ pageκ°€ λͺ¨λ“  νŠΈλžœμž­μ…˜μ— λ³΄μ΄λŠ”μ§€, λ™κ²°λœ νŠœν”Œλ§Œμ„ ν¬ν•¨ν•˜λŠ”μ§€ λ“±μ˜ 정보λ₯Ό μ €μž₯ν•œλ‹€. λ°μ΄ν„°λ² μ΄μŠ€κ°€ employees ν…Œμ΄λΈ”μ„ μ‘°νšŒν•  λ•Œ, κ°€μ‹œμ„± 맡을 λ¨Όμ € ν™•μΈν•œλ‹€. λ§Œμ•½ 쿼리가 μ ‘κ·Όν•˜λ €λŠ” pagesκ°€ λͺ¨λ“  νŠΈλžœμž­μ…˜μ—κ²Œ λ³΄μ΄λŠ” μƒνƒœλΌκ³  ν™•μΈλ˜λ©΄, μ‹œμŠ€ν…œμ€ 데이터에 더 λΉ λ₯΄κ²Œ μ ‘κ·Όν•œλ‹€. λΆˆν•„μš”ν•œ λ²„μ „κ²€μ‚¬λ‚˜ 락을 μ•ˆ 해도 λ˜κΈ°μ— μ„±λŠ₯이 ν–₯μƒλœλ‹€. ...

[μ΄νŽ™ν‹°λΈŒ μžλ°”] 7. λ‹€ μ“΄ 객체 μ°Έμ‘°λ₯Ό ν•΄μ œν•˜λΌ

[μ΄νŽ™ν‹°λΈŒ μžλ°”] 7. λ‹€ μ“΄ 객체 μ°Έμ‘°λ₯Ό ν•΄μ œν•˜λΌ

1. λ©”λͺ¨λ¦¬ 관리 μžλ°”μ—μ„  가비지 컬렉터가 λ‹€ μ“΄ 객체λ₯Ό μ•Œμ•„μ„œ νšŒμˆ˜ν•΄ 가기에 νŽΈλ¦¬ν•˜κ³  효율적으둜 λ©”λͺ¨λ¦¬λ₯Ό 관리할 수 μžˆλ‹€. ν•˜μ§€λ§Œ λ©”λͺ¨λ¦¬ 관리에 μ‹ κ²½ 쓰지 μ•Šμ•„λ„ λœλ‹€λŠ” 말은 μ ˆλŒ€ μ•„λ‹ˆλ‹€. λ©”λͺ¨λ¦¬λ₯Ό μ μ ˆν•˜κ²Œ κ΄€λ¦¬ν•˜μ§€ λͺ»ν•˜λ©΄ λ©”λͺ¨λ¦¬ λˆ„μˆ˜κ°€ λ°œμƒν•˜κ³  μ‹¬ν•˜λ©΄ ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ  수 μžˆλ‹€. λ©”λͺ¨λ¦¬λ₯Ό μ μ ˆν•˜κ²Œ κ΄€λ¦¬ν•˜μ§€ λͺ»ν•˜λŠ” 경우의 예제λ₯Ό μ‚΄νŽ΄λ³΄μž. λ‹€μŒμ€ μŠ€νƒμ„ κ°„λ‹¨ν•˜κ²Œ κ΅¬ν˜„ν•œ μžλ°” μ½”λ“œμ΄λ‹€. public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public void push(Object e) { ensureCapacity(); elements[size++] = e; } public Object pop() { if (size == 0) throw new EmptyStackException(); return elements[--size]; } private void ensureCapacity() { if (elements.length == size) elements = Arrays.copyOf(elements, 2 * size + 1); } μ΄λŒ€λ‘œ μ‚¬μš©ν•˜μ—¬λ„ κΈ°λŠ₯μƒμœΌλ‘œλŠ” μ „ν˜€ λ¬Έμ œκ°€ 없을 것이고, μ–΄λ–€ ν…ŒμŠ€νŠΈλ„ ν›Œλ₯­ν•˜κ²Œ ν†΅κ³Όν•˜κ² μ§€λ§Œ, 이 μŠ€νƒμ„ μ‚¬μš©ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ 였래 μ‹€ν–‰μ‹œν‚¬ 경우 가비지 μ»¬λ ‰μ…˜κ³Ό λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ΄ λŠ˜μ–΄λ‚˜ κ²°κ΅­ μ„±λŠ₯이 μ €ν•˜λ  것이닀. ...

[μ΄νŽ™ν‹°λΈŒ μžλ°”] 6. λΆˆν•„μš”ν•œ 객체 생성을 ν”Όν•˜λΌ

[μ΄νŽ™ν‹°λΈŒ μžλ°”] 6. λΆˆν•„μš”ν•œ 객체 생성을 ν”Όν•˜λΌ

1. 객체의 μž¬μ‚¬μš© λ˜‘κ°™μ€ 객체λ₯Ό 맀번 μƒˆλ‘œ μƒμ„±ν•˜λŠ” 것보닀 ν•˜λ‚˜λ₯Ό 생성 ν›„ μž¬μ‚¬μš©ν•˜λŠ” 것이 훨씬 νš¨μœ¨μ μ΄λ‹€. 특히 λΆˆλ³€ κ°μ²΄λŠ” μ–Έμ œλ“  μž¬μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€. λ‹€μŒμ€ 객체 생성 μ‹œ μ‚¬μš©ν•˜λ©΄ μ•ˆ λ˜λŠ” 극단적인 μ˜ˆμ΄λ‹€. String s = new String("bikini"); 보기만 ν•΄λ„Β λΆˆνŽΈν•œ 이 생성방식은 싀행될 λ•Œλ§ˆλ‹€ String 객체λ₯Ό μƒˆλ‘œ μƒμ„±ν•œλ‹€. 이후에 κΈ°λŠ₯μ μœΌλ‘œλŠ” λ™μΌν•˜κ²Œ μ‚¬μš©λ˜μ§€λ§Œ 큰 λ°˜λ³΅λ¬Έμ΄λ‚˜ 자주 ν˜ΈμΆœλ˜λŠ” λ©”μ„œλ“œ μ•ˆμ— μžˆλ‹€λ©΄ μ“Έλͺ¨μ—†λŠ” μΈμŠ€ν„΄μŠ€κ°€Β μ—¬λŸ¬ κ°œΒ μƒμ„±λ Β κ²ƒμ΄λ‹€. κ°œμ„ λœΒ κ°μ²΄ 생성 방식을 확인해 보자. ...

[μ΄νŽ™ν‹°λΈŒ μžλ°”] 5. μžμ›μ„ 직접 λͺ…μ‹œν•˜μ§€ 말고 의쑴 객체 μ£Όμž…μ„ μ‚¬μš©ν•˜λΌ

[μ΄νŽ™ν‹°λΈŒ μžλ°”] 5. μžμ›μ„ 직접 λͺ…μ‹œν•˜μ§€ 말고 의쑴 객체 μ£Όμž…μ„ μ‚¬μš©ν•˜λΌ

1. κ°œλ… ν•œ 클래슀 λ‚΄μ—μ„œ μ—¬λŸ¬ 개의 μžμ›μ— μ˜μ‘΄ν•˜μ—¬ μ‚¬μš©λ˜λŠ” κ²½μš°μ— 의쑴 객체 μ£Όμž…μ„ 톡해 μœ μ—°μ„±κ³Ό ν…ŒμŠ€νŠΈ μš©μ΄μ„±μ„ κ°œμ„ ν•˜λŠ” λ‚΄μš©μ΄λ‹€. μŠ€ν”„λ§μ˜ μ˜μ‘΄μ„± μ£Όμž… κ°œλ…μ„ 생각해 λ³Έλ‹€λ©΄ 이미 λ‹Ήμ—°ν•˜κ²Œ μ‚¬μš©ν•˜κ³  μžˆλŠ” κ²½μš°κ°€ λ§Žμ„ κ²ƒμ΄μ§€λ§Œ, 의쑴 객체 μ£Όμž…μ˜ μž₯점을 λ‹€μ‹œ ν•œλ²ˆ 생각해 λ³Ό 수 μžˆλŠ” λ‚΄μš©μ΄λ‹€. IoC(μ œμ–΄μ˜ μ—­μ „) & DI(μ˜μ‘΄μ„± μ£Όμž…)의 κ°œλ… μ΄νŽ™ν‹°λΈŒ μžλ°” μ±…μ—μ„œλŠ” "λ§žμΆ€λ²• 검사기 (SpellChecker)" ν΄λ ˆμŠ€μ—μ„œ "사전 (Dictionary)" μžμ›μ„ μ‚¬μš©ν•˜λŠ” 예제λ₯Ό λ“€κ³  μžˆλ‹€. λ§žμΆ€λ²• 검사기 (SpellChecker)λŠ” 사전(dictionary) μžμ›μ— μ˜μ‘΄ν•˜λŠ” 상황을 정적 μœ ν‹Έλ¦¬ν‹°, μ‹±κΈ€ν„΄, 의쑴객체 μ£Όμž…μ˜ 차이λ₯Ό λΉ„κ΅ν•˜κ³  μžˆλ‹€. ...

[PostgreSQL] TOAST (The Oversized-Attribute Storage Technique)의 κ°œλ…, PostgreSQL의 λŒ€μš©λŸ‰ 속성 μ €μž₯ 기법

[PostgreSQL] TOAST (The Oversized-Attribute Storage Technique)의 κ°œλ…, PostgreSQL의 λŒ€μš©λŸ‰ 속성 μ €μž₯ 기법

1. TOAST (The Oversized-Attribute Storage Technique)λž€? λ°μ΄ν„°λ² μ΄μŠ€μ˜ λŒ€μš©λŸ‰ 속성을 효율적으둜 μ €μž₯ν•˜κ³  κ΄€λ¦¬ν•˜κΈ° μœ„ν•œ κΈ°λ²•μœΌλ‘œ, 데이터λ₯Ό 효율적으둜 μ²˜λ¦¬ν•˜κ³ , μ €μž₯곡간을 μ΅œμ ν™”ν•˜λ©° 데이터 μ ‘κ·Όμ‹œκ°„μ„ κ°œμ„ ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λœλ‹€. PostgreSQL의 각 pageμ˜μ—­μ€ 일반적으둜 8kb의 κ³ μ •λœ 크기둜 λ˜μ–΄μžˆκ³  각 tuple이 μ—¬λŸ¬ νŽ˜μ΄μ§€μ— λ‚˜λ‰˜μ–΄ μ‘΄μž¬ν•  수 μ—†λ‹€. (맀우 큰 값을 λ°”λ‘œ μ €μž₯ν•  수 μ—†λ‹€.) 이 ν•œκ³„λ₯Ό κ·Ήλ³΅ν•˜κΈ° μœ„ν•΄μ„œ, 큰 ν•„λ“œ 값은 μ••μΆ•λ˜μ–΄ μ €μž₯λ˜κ±°λ‚˜ μ—¬λŸ¬ 개의 물리적 ROWS둜 λΆ„ν• λ˜μ–΄ μ €μž₯λœλ‹€. 이 과정은 보톡 κ°œλ°œμžκ°€ λ³„λ„μ˜ μ²˜λ¦¬λ‘œμ§μ„ κ΅¬ν˜„ν•  ν•„μš” 없이 λ°μ΄ν„°λ² μ΄μŠ€ λ°±μ•€λ“œμ—μ„œ μžλ™μœΌλ‘œ 이루어진닀. 이 기법을 TOAST (The Oversized-Attribute Storage Technique)라고 ν•˜λ©° PostgreSQLμ—μ„œ 큰 데이터 값을 λ©”λͺ¨λ¦¬ λ‚΄μ—μ„œ 효율적으둜 μ²˜λ¦¬ν•˜λŠ” 데에 μ‚¬μš©λœλ‹€. ...