_λŒ€λ¬Έ | λ°©λͺ…둝 | μ΅œκ·ΌκΈ€ | ν™ˆν”Όμ†Œκ°œ | μ£ΌμΈλ†ˆ | RSS
λ‚΄μš©ν¬ν•¨ λŒ€/μ†Œλ¬Έμžκ΅¬λΆ„μ•ˆν•¨
_
Database System
Data Warehouse
Data Analysis
Master Data Management
Data Governance
Data Quality

Hive
SQL Server
Oracle Server
DBMSs
Performance Tuning

Open Source
Operating System
Enterprise Architecture
Software Engineering
Programming
Process
Working Smart
Trade-Off

Link
News
Philosophy
Blog
Booklog
Tools
Misc
UserPreferences
_
_
Edit SideBar

Contents

1 νŠœλ‹μ˜ ν•„μš”μ„±
2 μ μ ˆν•œ κΆŒν•œμ˜ νšλ“κ³Ό ν˜‘λ ₯의 약속
3 κΈ°μ—…μ˜ μ‹œμŠ€ν…œ ν™˜κ²½ νŒŒμ•… 및 자료 μˆ˜μ§‘
4 μˆ˜μ§‘λœ 자료의 κ°œκ΄„μ μΈ 뢄석
5 CPU, Memory, Disk 기본적인 고렀사항
6 DBMS Wait Event λͺ¨λ‹ˆν„°λ§
7 DBMS Wait Event λͺ¨λ‹ˆν„°λ§-DMV
8 Index 뢄석
9 λ°μ΄ν„°λ² μ΄μŠ€ λ””μžμΈ νŠœλ‹
10 SQL νŠœλ‹ λŒ€μƒ μˆ˜μ§‘
11 Query 및 SP μ΅œμ ν™”
12 νŠΈλžœμž­μ…˜ 정보 μˆ˜μ§‘
13 ν•˜λ“œμ›¨μ–΄ νŠœλ‹
14 처리의 μš°μ„ μˆœμœ„ κ²°μ •
15 μΌκ΄„μ μš©


1 νŠœλ‹μ˜ ν•„μš”μ„± #

이번 μž₯μ—μ„œλŠ” νŠœλ‹μ˜ μ ˆμ°¨μ— λŒ€ν•œ 절차λ₯Ό κ°„λž΅ν•˜κ²Œ μ•Œμ•„λ³Ό 것이닀. νŠœλ‹μ˜ μ ˆμ°¨κ°€ ν•„μš”ν•œ 것은 λ‹Ήμ—°νžˆ 성곡리에 νŠœλ‹μ„ 마치기 μœ„ν•¨μ΄λ‹€. 각각의 ν•­λͺ©μ„ μ‚΄νŽ΄λ³΄λ©΄μ„œ μ™œ 각각의 단계가 ν•„μš”ν•œμ§€ μ•Œμ•„λ³Ό 것이닀. λ§Žμ€ μ»¨μ„€ν„΄νŠΈλ“€μ΄ ν•„μžμ™€ λΉ„μŠ·ν•œ ν”„λ‘œμ„ΈμŠ€λ₯Ό λ°Ÿμ•„κ°€λ©°, νŠœλ‹μž‘μ—…μ„ ν•œλ‹€. 상황에 따라 적절히 μ‘μš©ν•˜λ©΄ λœλ‹€. ν˜ΉμžλŠ” 이와 같은 과정은 ν•„μš” μ—†κ³  β€œλ‹Ήμž₯ 이 SQL을 3초 μ•ˆμ— λλ‚˜κ²Œ 해놔!” 라고 ν•  수 μžˆλ‹€. 이 μ‚¬λžŒμ€ μ€‘μš”ν•œ 것을 잊고 있음이 λΆ„λͺ…ν•˜λ‹€. νŠΉμ • 뢀뢄을 νŠœλ‹ν•œλ‹€κ³  ν•΄μ„œ 무쑰건 빨라지고, μ΅œμ ν™”λ˜λŠ” 것은 μ•„λ‹ˆλ‹€. λ˜ν•œ νŠΉμ •ν•œ 뢀뢄을 νŠœλ‹ν•˜λ©΄ λ‹€λ₯Έ 곳이 느렀질 μˆ˜λ„ μžˆλ‹€. ν‹°λŒλ“€κ³Ό λ°”μœ„ 덩어리듀이 λͺ¨μ—¬ νƒœμ‚°μ΄ 된 κ²ƒμ΄λ―€λ‘œ ν•˜λ‚˜μ”© μž‘μ•„κ°€λŠ” 것이 μ’‹λ‹€. 미리 μ–ΈκΈ‰ν•˜μ§€λ§Œ ν‹°λŒλ“€μ€ 인덱슀 생성 및 μ‘°μ •μœΌλ‘œ 거의 ν•΄κ²°λ˜κ³ , λ°”μœ„ 덩어리듀은 μ–΄λ£¨λ§Œμ Έ 쀄 손이 ν•„μš”ν•˜λ‹€. λ‹€μŒμ˜ 그림을 보자.

tuning_process1.jpg

이 λͺ¨λ“  것이 만쑱되렀면 μ‹œμŠ€ν…œ 전체λ₯Ό 보아야 ν•˜κΈ° λ•Œλ¬Έμ— 큰 그림을 κ·Έλ €κ°€λ©΄μ„œ μ„ΈλΆ€μ μœΌλ‘œ λ“€μ–΄κ°€μ•Ό ν•œλ‹€. 일련의 과정듀은 처음 μ ‘ν•˜λŠ” μ‹œμŠ€ν…œμ„ μ•Œκ³  λ˜ν•œ 효율적인 νŠœλ‹μ„ μœ„ν•¨μ΄κΈ°λ„ ν•˜λ‹€.

2 μ μ ˆν•œ κΆŒν•œμ˜ νšλ“κ³Ό ν˜‘λ ₯의 약속 #

νŠœλ‹μ„ ν•  λ•ŒλŠ” λ§Žμ€ 인λ ₯이 νˆ¬μž…λ˜μ§€ μ•ŠλŠ” 것이 μΌλ°˜μ μ΄λ‹€. κ·ΈλŸ¬λ―€λ‘œ κ°œλ°œμžλ“€κ³Όμ˜ ν˜‘λ ₯κ³Ό μ μ ˆν•œ κΆŒν•œμ΄ μ£Όμ–΄μ Έμ•Όλ§Œ νŠœλ‹μž‘μ—…μ„ 성곡리에 마칠 수 μžˆλ‹€. λŒ€λΆ€λΆ„μ˜ νŠœλ‹μž‘μ—…μ€ μ†ŒμŠ€μ˜ μˆ˜μ •μ΄ λΆˆκ°€ν”Όν•œ κ²½μš°κ°€ 많이 있으며, μ†ŒμŠ€ μˆ˜μ •μ„ μœ„ν•΄ κ°œλ°œμžλ“€μ„ ν†΅μ œν•  수 μžˆλŠ” κΆŒν•œμ΄ μ£Όμ–΄μ§μœΌλ‘œ ν•΄μ„œ λΉ„μš©κ³Ό 효과λ₯Ό μ ˆκ°ν•  수 μžˆλ‹€. λ˜ν•œ νŠœλ‹μΈλ ₯이 λͺ¨λ‘ μˆ˜μ •μ„ ν•  수 μ—†μœΌλ―€λ‘œ κ΅μœ‘μ„ ν†΅ν•œ 개발자 슀슀둜 μˆ˜μ •μ„ ν•˜λ„λ‘ μœ λ„ν•˜λŠ” 것도 ν•˜λ‚˜μ˜ 방법이닀.

μ‹€μ œλ‘œ μžμ‹ μ˜ μ§κΈ‰μ΄λ‚˜ 개발자의 μžμ‘΄μ‹¬ λ•Œλ¬Έμ— νŠœλ‹μž‘μ—…μ΄ μ œλŒ€λ‘œ 이루지지 μ•Šμ„ μˆ˜λ„ μžˆλ‹€. κ·ΈλŸ¬λ―€λ‘œ νŠœλ‹μž‘μ—…μ„ μ›λ§Œν•˜κ²Œ μ§„ν–‰ν•˜κΈ° μœ„ν•΄μ„œ μžμ‹ μ΄ μ–΄λ–€ μž‘μ—…μ„ ν•  κ²ƒμ΄λ‹ˆ 따라쀄 것을 미리 약속 λ°›λŠ” 것은 맀우 μ€‘μš”ν•˜λ‹€. 우슀운 것은 κ°œλ°œν™˜κ²½μ— λ”°λΌμ„œ DBA의 κΆŒν•œμ΄ 차이가 λ‚œλ‹€λŠ” 것이닀. κΆŒν•œμ΄ μœ λ‹‰μŠ€κ³„μ—΄μ€ 맀우 λ§‰κ°„ν•œλ° λΉ„ν•΄ MS계열은 DBA의 κΆŒν•œμ΄ κ·Έμ € κ·Έλ ‡λ‹€. λ¬Όλ‘  λͺ¨λ‘κ°€ κ·Έλ ‡μ§€λŠ” μ•Šμ§€λ§Œ λŒ€λž΅ κ·Έλ ‡λ‹€. κ°œλ°œν™˜κ²½μ΄ λ¬Έμ œλŠ” 아닐 것이닀. DBAκ°€ ν”„λ‘œμ νŠΈμ˜ μ‹€νŒ¨κ°€ λˆˆμ— 보이지 μ•Šμ•„μ„œ 즉, μ‹€λ ₯이 λΆ€μ‘±μ˜€κ±°λ‚˜ DBA보닀 더 λ§‰κ°•ν•œ κΆŒν•œμ„ μ§€λ‹Œμžκ°€ ν”„λ‘œμ νŠΈλ₯Ό 망쳐 λ†“μ•˜μ„μ§€λ„..

DBAλŠ” λ°μ΄ν„°λ² μ΄μŠ€μ˜ λͺ¨λ“  업무λ₯Ό κ΄€μž₯ν•˜λŠ” μ‚¬λžŒμ΄λ‹€. λ°μ΄ν„°λ² μ΄μŠ€ μ‹œμŠ€ν…œμ˜ μ„€μ •μ—μ„œλΆ€ν„° 섀계/κ΅¬ν˜„ λ“±μ˜ κ°œλ°œμ— 이λ₯΄κΈ°κΉŒμ§€ 맀우 κ΄‘λ²”μœ„ν•œ 역할을 κ°€μ§€κ³  μžˆλ‹€. μš°λ¦¬λ‚˜λΌμ˜ DBA라고 ν•˜λ©΄ μžκ²©μ¦μ„ μ·¨λ“ν•˜κ³ , μ „μ‚°μ‹€μ—μ„œ λ°±μ—…κ³Ό 볡원/볡ꡬλ₯Ό μœ„ν•΄ ν…Œμ΄ν”„λ₯Ό κ°ˆμ•„ λΌμš°λŠ” μ‚¬λžŒ μ •λ„λ‘œλ§Œ μƒκ°ν•˜λŠ” κ²½μš°κ°€ 많이 μžˆλ‹€. μ‹€μ œλ‘œ 그런 κ²½μš°κ°€ 많이 있고, λ°±μ—…/볡원을 ν•˜μ§€ λͺ»ν•˜λŠ” DBA도 μžˆλ‹€. μ‹¬μ§€μ–΄λŠ” β€˜SELECT * FROM TABLE_NAME’ 의 SQL만 μ•Œκ³  μžˆλŠ” κ²½μš°λ„ μžˆλ‹€. DBAλΌλŠ” 타이틀을 κ°€μ§€κ³  μžˆμœΌλ©΄μ„œ 직접 κ΄€λ¦¬ν•˜μ§€ μ•Šκ³ , λ‹€λ₯Έ 업체에 μœ μ§€/보수 계약을 ν•˜λŠ” κ²½μš°λ„ 많이 μžˆλ‹€. κΈ°μ—…μ˜ μ˜μ‚¬κ²°μ •κΆŒμžμ˜ κ΄€μ μ—μ„œ 보면 μ΄μ€‘μœΌλ‘œ 돈 λ‚­λΉ„λ₯Ό ν•˜κ³  μžˆλŠ” μ…ˆμ΄λ‹€.

κ·Έλ ‡λ‹€λ©΄ 백업을 잘 λ°›λŠ” μ‚¬λžŒμ΄ DBA일까? μ„œμ  μ€‘μ—λŠ” κ΄€λ¦¬μžμš©, 개발자용이라고 ν•΄μ„œ 책을 2ꢌ으둜 λ‚˜λˆ„μ–΄ 놓은 κ²½μš°λ„ 있고, β€˜κ΄€λ¦¬μžμ˜ μž…μž₯μ—μ„œβ€¦β€™ λ˜λŠ” β€˜κ°œλ°œμžμ˜ μž…μž₯μ—μ„œβ€¦β€™λΌλŠ” 말을 쓰기도 ν•œλ‹€. (λ¬Όλ‘  ν•„μžμ˜ 또 λ‹€λ₯Έ μ±…μ—μ„œ β€˜κ΄€λ¦¬μžλ₯Ό μœ„ν•œβ€™ μ΄λΌλŠ” 단어가 λΆ™μ–΄ μžˆλ‹€. ν•„μžλŠ” μƒλ‹Ήνžˆ λ§˜μ— λ“€μ§€ μ•Šμ•˜μ§€λ§Œ λŒ€μ„Έμ˜€κΈ°μ— λ”°λ₯΄λŠ” 것이 λ‚«κ² λ‹€λŠ” 생각을 κ·Έ λ‹Ήμ‹œμ—λŠ” κ·Έλ ‡κ²Œ ν–ˆλ‹€.) κ³Όμ—° 개발자, κ΄€λ¦¬μžλ‘œ λ‚˜λˆŒ ν•„μš”κ°€ μžˆμ„κΉŒ? κ·Έλ ‡λ‹€λ©΄ DBAλŠ” λ¬΄μ—‡μΌκΉŒ? 말 κ·ΈλŒ€λ‘œ DBAλŠ” λ°μ΄ν„°λ² μ΄μŠ€μ— κ΄€λ ¨λœ λͺ¨λ“  업무λ₯Ό λŠ₯μˆ™ν•˜κ²Œ ν•  수 μžˆλŠ” μ‚¬λžŒμ΄λΌκ³  ν•  수 μžˆλ‹€. ν”„λ‘œκ·Έλž¨ μ†ŒμŠ€λ„ μ–΄λŠ 정도 λ³Ό 쀄 μ•Œμ•„μ•Ό ν•˜κ³ , 쿼리 μž‘μ„± λŠ₯λ ₯κ³Ό μ„±λŠ₯ νŠœλ‹μ— λŒ€ν•œ λŠ₯λ ₯도 κ°–μΆ”μ–΄μ•Ό ν•œλ‹€. λ˜ν•œ λ°μ΄ν„°λ² μ΄μŠ€ μ„œλ²„μ˜ 운영과 λ°μ΄ν„°λ² μ΄μŠ€ λͺ¨λΈλ§κ³Ό 섀계에 λŒ€ν•œ λŠ₯λ ₯도 κ°–μΆ”μ–΄μ•Ό ν•œλ‹€. κ²°κ΅­ λ°μ΄ν„°λ² μ΄μŠ€ 관리와 λ°μ΄ν„°λ² μ΄μŠ€ κ°œλ°œμ€ λ™μ˜μ–΄λ‘œ 봐야 ν•  것은 λ‹Ήμ—°ν•˜λ‹€.

또 ν•œκ°€μ§€ κ³ λ €ν•΄μ•Ό ν•  것은 μžμ²΄κ°œλ°œμΈμ§€ μ•„λ‹ˆλ©΄ μ•„μ›ƒμ†Œμ‹±μΈμ§€λ₯Ό μ•Œμ•„μ•Ό ν•œλ‹€. μ™ΈλΆ€μ—…μ²΄μ—μ„œ κ°œλ°œν•œ ν™˜κ²½μ΄λΌλ©΄ μ†ŒμŠ€ μˆ˜μ •μ΄ κ°€λŠ₯ν•œμ§€μ— λŒ€ν•œ μš°μ„ μ μΈ 확인이 ν•„μš”ν•˜λ‹€. μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ νŠœλ‹μ€ λŒ€λΆ€λΆ„ μ†ŒμŠ€ μˆ˜μ •μ„ μœ λ°œν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

3 κΈ°μ—…μ˜ μ‹œμŠ€ν…œ ν™˜κ²½ νŒŒμ•… 및 자료 μˆ˜μ§‘ #

κΈ°μ—…μ˜ μ‹œμŠ€ν…œ ν™˜κ²½μ„ νŒŒμ•…ν•˜λŠ” 것이 νŠœλ‹μ˜ 첫 번째 단계라고 ν•  수 μžˆλ‹€. μ–΄λ–€ OSλ₯Ό μ‚¬μš©ν•˜κ³  있으며, νŒ¨μΉ˜λŠ” μ–΄λ””κΉŒμ§€ μ μš©λ˜μ—ˆλŠ”μ§€ λ˜λŠ” Storage RAID 레벨 λ“±μ˜ ν•˜λ“œμ›¨μ–΄ μŠ€νŽ™μ„ νŒŒμ•…ν•˜λŠ” 단계이닀. Windows μ‹œμŠ€ν…œμ—μ„œλŠ” β€œμ„±λŠ₯” 도ꡬλ₯Ό μ΄μš©ν•œλ‹€. λ‹€μŒμ€ λͺ¨λ‹ˆν„°λ§μ— ν•„μš”ν•œ 정보듀이닀. β€œProcessor Time <= 80%” 의 μ˜λ―ΈλŠ” 평균 80% μ΄ν•˜μ—¬μ•Όλ§Œ 정상이라고 νŒλ‹¨ν•  수 μžˆλ‹€λŠ” 것이닀. λ¬Όλ‘  ν”Όν¬νƒ€μž„μ΄ 업무에 맀우 μ€‘μš”ν•œ 상황이라면 νŠΉμ • μ‹œκ°„μ— 기쀀을 λ§žμΆ”μ–΄μ•Ό ν•  것이닀. μ„±λŠ₯κ°œμ²΄λŠ” ν•„μš”μ— λ”°λΌμ„œ 더 μΆ”κ°€ν•œλ‹€. (μ°Έκ³ : 기본적으둜 μˆ˜μ§‘ν•΄μ•Ό ν•  λ°μ΄ν„°μ˜ 예)

  1. CPU μ„±λŠ₯(Processor 개체)
    1. Processor Time <= 80%
    2. Privileged Time <= 80%
    3. User Time <= 80%
  2. Application μ„±λŠ₯(Process 개체)
    1. Processor Time <= 200%
  3. Memory μ„±λŠ₯(Memory 개체)
    1. Available Bytes >= 5MB
    2. Pages/sec ---- Between 0 and 20
    3. Page Reads/sec <= 5
    4. Page Writes/sec <= 5
  4. System μ„±λŠ₯(System 개체)
    1. Processor Queue Length <= 2
  5. Disk I/O μ„±λŠ₯(PhysicalDisk 개체)
    1. Disk Read Time <= 40%
    2. Disk Write Time < 40%
    3. Disk Time <= 80%

μ΄λŸ¬ν•œ 자료 이외에 ERD, μ½”λ“œκ·œμΉ™μ§‘, 총 μ‚¬μš©μžμˆ˜, λ™μ‹œ μ‚¬μš©μžμˆ˜ λ“±κ³Ό 같은 μ΄μ œκΉŒμ§€μ˜ λͺ¨λ“  μ‹œμŠ€ν…œ 개발 κ²°κ³Ό λ¬Έμ„œλ₯Ό μˆ˜μ§‘ν•΄μ•Ό ν•œλ‹€. 일반적으둜 μžμ‹ μ˜ νšŒμ‚¬κ°€ μ•„λ‹Œ 이상에 μ„±λŠ₯νŠœλ‹μ„ 외뢀업체에 λ§‘κΈ΄λ‹€λŠ” 것 μžμ²΄κ°€ λ¬Έμ œλ‹€. μ•„λ§ˆλ„ λ¬Έμ„œλ₯Ό μ°ΎκΈ°κ°€ 쉽지 μ•Šμ„ 것이닀. λ¬Έμ„œκ°€ μ‘΄μž¬ν•΄λ„ 맀우 μ˜›λ‚  것이라 큰 도움이 λ˜μ§€λŠ” μ•Šμ„ 것이닀. (κ·Έλž˜λ„ μ—†λŠ” κ²ƒλ³΄λ‹€λŠ” λ‚«λ‹€.) μ–΄μ¨Œλ“  μ΅œλŒ€ν•œ μ‹œμŠ€ν…œκ³Ό κ΄€λ ¨λœ λͺ¨λ“  λ¬Έμ„œλ₯Ό μˆ˜μ§‘ν•˜λŠ” 것은 도움이 λœλ‹€. μ„±λŠ₯λͺ¨λ‹ˆν„°λ§μ— ν•„μš”ν•œ 기쀀값은 각 S/W λ°΄λ”λ‚˜ 인터넷에 널렀 μžˆμœΌλ―€λ‘œ μ‰½κ²Œ 얻을 수 μžˆλ‹€.

4 μˆ˜μ§‘λœ 자료의 κ°œκ΄„μ μΈ 뢄석 #

μ‹œμŠ€ν…œ ν™˜κ²½ νŒŒμ•… λ‹¨κ³„μ—μ„œλŠ” μ‹œμŠ€ν…œμ— λŒ€ν•œ 감을 작기 μœ„ν•œ 자료 μˆ˜μ§‘λ‹¨κ³„λΌκ³  ν•  수 μžˆλ‹€. μ„±λŠ₯ λͺ¨λ‹ˆν„°λ§ 도ꡬλ₯Ό μ΄μš©ν•˜μ—¬ λΆ„μ„λœ κ²°κ³Όλ₯Ό κ°€μ§€κ³  λͺ¨λ“  것을 νŒλ‹¨ν•˜λŠ” 것은 μ ˆλŒ€ ν•΄μ„œλŠ” μ•ˆ λ˜λŠ” 짓이닀. λ‹€μŒμ˜ μ‹€λ‘€λ₯Ό 보자. μ—¬λŸ¬ κ°€μ§€ μš”μ†Œλ₯Ό λͺ¨λ‘ κ³ λ €ν•΄μ•Ό 함을 λ‚˜νƒ€λ‚΄κΈ° μœ„ν•œ μ˜ˆμ œμ΄λ―€λ‘œ λͺ¨λ“  μ„±λŠ₯κ°œμ²΄μ— λŒ€ν•œ 언급은 없을 것이닀. 사둀λ₯Ό 보고 μ€‘μš” μžμ›μΈ CPU, Memory, Disk에 λŒ€ν•΄μ„œ μ•Œμ•„λ³΄λ„λ‘ ν•˜κ² λ‹€. ν•΄μ„μ˜ κ²°κ³ΌλŠ” μ˜ˆμƒμΌ 뿐이지 κ·Έλ ‡λ‹€λŠ” 결둠이 μ•„λ‹ˆλ‹€. 결둠을 정해놓고 닡을 μ°ΎλŠ” 것은 잘λͺ»λœ κ²°κ³Όλ₯Ό κ°€μ Έμ˜¬ 수 μžˆλ‹€.

μ„±λŠ₯ λͺ¨λ‹ˆν„°λ§ 도ꡬλ₯Ό μ΄μš©ν•œ 데이터 μˆ˜μ§‘
κ·Έλ¦Ό1: Page reads/sectuning_process2.jpg
κ·Έλ¦Ό2:Page writes/sectuning_process3.jpg
κ·Έλ¦Ό3:Free pagestuning_process4.jpg

해석
Page reads/secλŠ” DBMS μ „μš© μ‹œμŠ€ν…œμ΄λΌ κ°€μ •ν•  λ•Œμ— SQL Serverμ—μ„œ μš”μ²­μ— λŒ€ν•΄ ν•„μš”ν•œ λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•œ κ²ƒμœΌλ‘œ μ΄ˆλ‹Ή νŽ˜μ΄μ§€μ˜ 읽기 μš”μ²­ 수λ₯Ό μ˜λ―Έν•œλ‹€. μˆœκ°„ 높이 μ˜¬λΌκ°€λŠ” μˆ˜μΉ˜κ°€ λ§Žμ€ 것을 λ³Ό 수 μžˆλŠ”λ°, 이것은 μ‹œμŠ€ν…œμ˜ λ©”λͺ¨λ¦¬λ₯Ό μΆ”κ°€μ‹œν‚€κ±°λ‚˜ Query νŠœλ‹μ˜ ν•„μš”μ„±μ΄ μžˆμ„ μˆ˜λ„ μžˆμŒμ„ λ‚˜νƒ€λ‚Έλ‹€. 즉, νŠΉμ • μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ λ§Žμ€ λ©”λͺ¨λ¦¬λ₯Ό μš”κ΅¬ν•  수 μžˆλ‹€λŠ” 것이닀. μ‹€μ œλ‘œ λ§Žμ€ λ©”λͺ¨λ¦¬λ₯Ό μš”κ΅¬ν•˜λŠ”μ§€, μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ„ 잘λͺ» μž‘μ„±ν•œ κ²ƒμΈμ§€λŠ” 확인을 해보아야 ν•œλ‹€. λ©”λͺ¨λ¦¬κ°€ λΆ€μ‘±ν•˜κ±°λ‚˜ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ νŠœλ‹μ΄ ν•„μš”ν•œκ°€λŠ” λ©”λͺ¨λ¦¬μ— λŒ€ν•œ λͺ¨λ‹ˆν„°λ§μ˜ κ²°κ³Όκ°€ ν•„μš”ν•˜λ‹€. κ·ΈλŸ¬λ‚˜ μˆ˜μ§‘λœ 자료둜 λ³΄μ•„μ„œλŠ” MemoryλŠ” μΆ©λΆ„ν•œ κ²ƒμœΌλ‘œ 보이며, Query νŠœλ‹μ΄ ν•„μš”ν•œ κ²ƒμœΌλ‘œ νŒλ‹¨λœλ‹€. Free PagesλŠ” λ‚¨μ•„μžˆλŠ” λ©”λͺ¨λ¦¬μ˜ 버퍼 수λ₯Ό λ‚˜νƒ€λ‚Έλ‹€. 이 값이 μ§€μ†μ μœΌλ‘œ μž‘μ•„μ§€κ±°λ‚˜ 0이면 μ„œλ²„μ— λ©”λͺ¨λ¦¬κ°€ μž‘μŒμ„ λ‚˜νƒ€λ‚΄λŠ”λ° 평균 2561을 λ‚˜νƒ€λ‚΄κ³  μ΅œμ†Œκ°€ 129둜 0 μ΄μƒμ΄λ―€λ‘œ MemoryλŠ” μΆ©λΆ„(2561 * 8KB > 5MB)ν•œ κ²ƒμœΌλ‘œ νŒλ‹¨λœλ‹€. Page writes/secλŠ” SQL Server에 μ˜ν•΄ λ°œκΈ‰λœ μ΄ˆλ‹Ή 물리적인 λ°μ΄ν„°λ² μ΄μŠ€ νŽ˜μ΄μ§€μ˜ μ“°κΈ° 수λ₯Ό λ§ν•œλ‹€. ν‰κ· μ˜ 수치둜 봀을 λ•Œ 읽기 수(124 / (124 + 87) * 100)λŠ” μ•½ 58.77%이며 μ“°κΈ°(87 / (124 + 87) * 100)의 경우 μ•½ 41% 이닀.

이 사둀λ₯Ό 톡해 μ€‘μš”ν•œ λͺ‡ κ°€μ§€ λ‹¨μ„œλ₯Ό μž‘μ„ 수 μžˆλ‹€. λ¬Όλ‘  더 λ§Žμ€ μ„±λŠ₯ λͺ¨λ‹ˆν„°λ§ 개체λ₯Ό μ‚΄νŽ΄λ³΄μ•„μ•Ό ν•˜κ² μ§€λ§Œ 이 3κ°€μ§€λ§ŒμœΌλ‘œλ„ λ§Žμ€ 것을 μ•Œ 수 μžˆλ‹€. 이미 μ–ΈκΈ‰ ν•œλ°λ‘œ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ νŠœλ‹μ΄ ν•„μš”ν•˜λ‹€λŠ” 감을 μž‘μ•˜λ‹€. λ˜ν•œ Read율과 Writeμœ¨λ„ 얻을 수 μžˆμ—ˆλ‹€. 이 μ‹œμŠ€ν…œμ€ 일반적인 OLTP μ‹œμŠ€ν…œμΈλ° μ“°κΈ°κ°€ μ•½ 40%라면 μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ“°κΈ° 연산이 많이 λ°œμƒν•œ 것을 μ•Œ 수 μžˆλ‹€. λ§Œμ•½ νŠΉμ •μΌμ— μ“°κΈ° μž‘μ—…μ΄ λ§Žμ€ λ°°μΉ˜μž‘μ—…μ„ ν•œλ‹€λ©΄ λ¬Έμ œκ°€ λ˜μ§€ μ•Šμ§€λ§Œ ν‰μƒμ‹œμ—λ„ μ΄λŸ¬ν•œ κ²°κ³Όλ₯Ό μ–»μ—ˆλ‹€λ©΄ λ¬Έμ œλŠ” μžˆλ‹€κ³  보아도 λœλ‹€. (이런 κ²½μš°λŠ” ν•„μžμ˜ κ²½ν—˜μ— μ˜ν•˜λ©΄ MSSQL Server의 Tempdbλ₯Ό κ³Όλ„ν•œ μ‚¬μš©λ„ ν•œ λͺ« λ‹¨λ‹¨νžˆ ν•˜κ³  μžˆλŠ” 것이 λŒ€λΆ€λΆ„μ΄μ—ˆλ‹€.) λ˜ν•œ ν˜„ μ‹œμŠ€ν…œμ—μ„œ RAID Level이 μ ν•©ν•œμ§€λ₯Ό νŒλ‹¨ν•  μˆ˜λ„ μžˆλ‹€. λ§Œμ•½ 이 μ‹œμŠ€ν…œμ΄ RAID5μ˜€λ‹€λ©΄ 뢀적합이닀. RAID5λŠ” μ“°κΈ°κ°€ 10% 이상이라면 μ„±λŠ₯μ €ν•˜λ₯Ό κ°€μ Έμ˜¨λ‹€. RAID 레벨이 κΆκΈˆν•˜λ‹€λ©΄ Webμ—μ„œ 정보λ₯Ό μ–»κ±°λ‚˜ RAID λ ˆλ²¨μ— λŒ€ν•΄μ„œλŠ” λ”°λ‘œ λ‹€λ£¨λŠ” μž₯을 μ°Έκ³ ν•˜λΌ.

μ€‘μš”ν•œ 것은 "ν˜„ 상황" μ—μ„œμ΄λ‹€. 즉, μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ΅œμ ν™”λ˜μ—ˆλŠ”λ°λ„ λΆˆκ΅¬ν•˜κ³  μ“°κΈ°κ°€ 40%라면 이 쑰직의 업무가 μ“°λŠ” 연산을 많이 ν•˜λŠ” μ—…λ¬΄μ΄κ±°λ‚˜, μ„€κ³„μ˜ λΆ€μ‹€λ‘œ μΈν•œ μ–΄μ©” 수 μ—†λŠ” μƒν™©μ΄κ±°λ‚˜ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ λΆ€μ‹€ν•œ κ²½μš°μ΄λ‹€. 결ꡭ은 λͺ¨λ“  경우의 μˆ˜μ΄μ§€λ§Œ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ νŠœλ‹ 후에 μ“°κΈ°μœ¨μ΄ 10% μ΄ν•˜λ‘œ λ–¨μ–΄μ§€κ±°λ‚˜ λΉ„μŠ·ν•΄μ§„λ‹€λ©΄ RAID λ ˆλ²¨μ€ 잘λͺ»λœ 것이 μ•„λ‹ˆλΌκ³  νŒλ‹¨λ  수 μžˆλ‹€. λ‹€μ‹œ ν•œλ²ˆ μ–ΈκΈ‰ν•˜μ§€λ§Œ ν•˜λ“œμ›¨μ–΄λŠ” μƒμˆ˜μ΄λ‹€. μƒμˆ˜λ₯Ό κ±΄λ“œλ¦¬λŠ” 것은 μ΅œν›„μ—λ‚˜ ν•˜λŠ” 일이닀.

λ§Œμ•½ μ„±λŠ₯λͺ¨λ‹ˆν„°λ§μ„ μ „κ°œν•  수 μ—†λŠ” 개발초기 단계라면 μ—…λ¬΄λΆ„μ„μ„œλ₯Ό κ°€μ§€κ³  νŒλ‹¨ν•΄μ•Ό ν•œλ‹€. 일반적으둜 μ„œλ²„ ꡬ좕은 H/W λ°΄λ”μ˜ μ—”μ§€λ‹ˆμ–΄κ°€ μ™€μ„œ ν•˜κ²Œ λ˜λŠ”λ°, 개발 μ΄ˆκΈ°λ‹¨κ³„λΌλ©΄ 이에 λŒ€ν•œ μ μ ˆν•œ 쑰정도 ν•„μš”ν•  것이닀. H/W μŠ€νŽ™μ΄ μ„œλ²„ μš©λŸ‰ 산정에 μ˜ν•œ 것인지도 νŒλ‹¨ν•΄μ•Ό ν•œλ‹€. μš©λŸ‰ μ‚°μ •μ˜ 방법은 λ‹€μŒμ˜ 자료λ₯Ό μ°Έκ³ ν•˜λΌ.

5 CPU, Memory, Disk 기본적인 고렀사항 #

CPU
  • μ»€μ„œκ°€ 자주 μ‚¬μš©λ˜λŠ”μ§€ νŒŒμ•…ν•œλ‹€.
  • ν”„λ‘œμ‹œμ € λ‚΄μ—μ„œ 루프λ₯Ό μ‚¬μš©ν•˜λ©°, 루프 내에 쿼리가 μžˆλŠ”μ§€ νŒŒμ•…ν•œλ‹€.
  • μ μ ˆν•œ μΈλ±μŠ€κ°€ μžˆλŠ”μ§€ νŒŒμ•…ν•œλ‹€. (λ³‘λ ¬μ²˜λ¦¬ν™•μΈ)
  • κ³Όλ„ν•œ Hash Join이 λ°œμƒν•˜λŠ”μ§€ νŒŒμ•…ν•œλ‹€.
  • κ³Όλ„ν•œ 정렬이 λ°œμƒν•˜λŠ”μ§€ νŒŒμ•…ν•œλ‹€.
  • ν•˜λ“œ νŒŒμ‹±μ΄ 계속 λ°œμƒν•˜λŠ”μ§€ νŒŒμ•…ν•œλ‹€.
  • Blocking 및 Dead Lock이 λ°œμƒν•˜λŠ”μ§€ νŒŒμ•…ν•œλ‹€.

Memory
  • μ μ ˆν•œ μΈλ±μŠ€κ°€ μžˆλŠ”μ§€ νŒŒμ•…ν•œλ‹€.
  • Buffer Cache Hit율이 90% 이상인지 νŒŒμ•…ν•œλ‹€.
  • λŒ€λŸ‰μ˜ 데이터λ₯Ό λ‘œλ“œν•˜λŠ” μž‘μ—…μ΄ μžˆλŠ”μ§€ νŒŒμ•…ν•œλ‹€. (잘λͺ»λœ SQL κ°€λŠ₯μ„± 큼)

Disk
  • Disk I/O 병λͺ©μ΄ μžˆλŠ”μ§€ νŒŒμ•…ν•œλ‹€.
  • κ³Όλ„ν•œ 정렬이 λ°œμƒν•˜λŠ”μ§€ νŒŒμ•…ν•œλ‹€.
  • Merge Join이 자주 λ°œμƒν•˜λŠ”μ§€ νŒŒμ•…ν•œλ‹€.
  • Tempdbλ₯Ό 자주 μ‚¬μš©ν•˜λŠ”μ§€ νŒŒμ•…ν•œλ‹€. (μž„μ‹œν…Œμ΄λΈ”)
  • νŠΈλžœμž­μ…˜(Insert, Update, Delete)μž‘μ—…μ΄ 자주 λ°œμƒν•˜λŠ”μ§€ νŒŒμ•…ν•œλ‹€.
  • μ μ ˆν•œ μΈλ±μŠ€κ°€ μžˆλŠ”μ§€ νŒŒμ•…ν•œλ‹€.
  • 둜그 및 데이터 λ“±μ˜ 객체에 λŒ€ν•œ μ μ ˆν•œ 뢄산이 μ΄λ£¨μ–΄μ‘ŒλŠ”μ§€ νŒŒμ•…ν•œλ‹€.
  • Blocking 및 Dead Lock이 λ°œμƒν•˜λŠ”μ§€ νŒŒμ•…ν•œλ‹€.

6 DBMS Wait Event λͺ¨λ‹ˆν„°λ§ #

이 정도 μ§„ν–‰λ˜μ—ˆλ‹€λ©΄ μ‚¬μš©μžμ˜ λͺ©μ†Œλ¦¬, 개발자의 λͺ©μ†Œλ¦¬λŠ” μ–΄λŠ 정도 λ“€μ—ˆμ„ 것이닀. 이제 μ–΄λ–€ λΆ€λΆ„μ—μ„œ 병λͺ©μ΄ μžˆλŠ”μ§€ νŒŒμ•…ν•  ν•„μš”κ°€ μžˆλ‹€. Microsoft κΈ°μˆ μ§€μ›λΆ€μ—μ„œλŠ” 병λͺ©μ§€μ  νŒŒμ•…μ„ μœ„ν•œ 2개의 μ €μž₯ ν”„λ‘œμ‹œμ €λ₯Ό μ œκ³΅ν•œλ‹€. 이 ν”„λ‘œμ‹œμ €λŠ” MSSQL Server의 Wait Type을 μˆ˜μ§‘ν•˜λŠ” 것이닀. μˆ˜μ§‘λœ 정보λ₯Ό κ°€μ§€κ³  λΆ„μ„ν•œλ‹€.

SQL Server 2000 λŒ€κΈ°μœ ν˜• 뢄석 사둀
  1. 슀크립트1, 슀크립트2λ₯Ό μˆ˜ν–‰μ‹œμΌœ 2개의 μ €μž₯ ν”„λ‘œμ‹œμ €λ₯Ό 생성
  2. 쿼리뢄석기λ₯Ό 2개 λ„μš°κ±°λ‚˜ μΏΌλ¦¬λΆ„μ„κΈ°μ—μ„œ 각각 λ‹€λ₯Έ μ„Έμ…˜μ„ κ°€μ§„ 창을 μ€€λΉ„
  3. μ„Έμ…˜1μ—μ„œ exec track_waitstats λ₯Ό μˆ˜ν–‰(κΈ°λ³Έκ°’ : 10λΆ„ μˆ˜ν–‰)
  4. track_waitstats의 μˆ˜ν–‰μ΄ λλ‚˜λ©΄ μ„Έμ…˜2μ—μ„œ exec get_waitstats을 μˆ˜ν–‰ν•˜μ—¬ 정보λ₯Ό μˆ˜μ§‘

tuning_process5.jpg

λ§Œμ•½ 정보 μˆ˜μ§‘μ‹œκ°„μ˜ 기본값인 10뢄이 λΆ€μ‘±ν•˜μ‹œλ‹€λ©΄ track_waitstats ν”„λ‘œμ‹œμ €μ˜ νŒŒλΌλ―Έν„°μΈ
@num_samples int=10의 값을 10μ—μ„œ 더 늘렀주면 λœλ‹€. κ²°κ³ΌλŠ” λ‹€μŒκ³Ό κ°™λ‹€.

tuning_process6.jpg

λŒ€κΈ°μœ ν˜• 뢄석'

CXPACKET
CXPACKETλŠ” Parallel Process λŒ€κΈ°μœ ν˜•μ΄λ‹€. 이것은 Parallel Query에 μ‹€ν–‰ μ‹œ 각 Processκ°€ μ‹€ν–‰λ˜λŠ” ꡬ간에 Lock Issueκ°€ μžˆμ„ μˆ˜λ„ μžˆμŒμ„ μ˜λ―Έν•˜κ±°λ‚˜ νŠΉμ • ν•˜λ“œμ›¨μ–΄μ˜ 병λͺ©μœΌλ‘œ 인해 λ‹€λ₯Έ Processκ°€ λŒ€κΈ°ν•˜κ³  μžˆλŠ” Processκ°€ 끝날 λ•ŒκΉŒμ§€ λŒ€κΈ°ν•˜κ³  μžˆμ„ μˆ˜λ„ μžˆμŒμ„ μ˜λ―Έν•œλ‹€. DBMSκ°€ μ˜¬λ°”λ₯Έ νŒλ‹¨μ„ ν•˜μ—¬ λ³‘λ ¬μ²˜λ¦¬λ₯Ό ν–ˆλŠ”μ§€ μ•„λ‹ˆλ©΄ ν™˜κ²½μ„ λ§Œλ“€μ–΄μ£Όμ§€ μ•Šμ•„μ„œ ν•  수 없이 λ³‘λ ¬μ²˜λ¦¬λ₯Ό ν•˜λŠ” 것인지 잘 νŒλ‹¨ν•΄μ•Ό ν•œλ‹€.

PAGEIOLATCH_SH
PAGEIOLATCH_SHλŠ” SELECT 쿼리 μ‹œ Shared Latchλ₯Ό μ–»κΈ° μœ„ν•΄ λŒ€κΈ°ν•˜κ³  μžˆμŒμ„ μ˜λ―Έν•œλ‹€. Latch의 κ°œλ…μ€ λ‹€μŒκ³Ό κ°™λ‹€. (Disk-to-Memory transfers)

tuning_process7.jpg

ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ— 따라 κ΄€κ³„ν˜• 엔진은 OLEDB APIλ₯Ό μ΄μš©ν•˜μ—¬ λ°μ΄ν„°μ˜ μš”μ²­μ„ ν•˜κ²Œ λœλ‹€. 이 μš”μ²­μ— 따라 μ €μž₯μ†Œμ—”μ§„μ€ Latchλ₯Ό μ–»κ³ , κ΄€κ³„ν˜• μ—”μ§„μœΌλ‘œ μ „μ†‘ν•œ λ‹€μŒ Latchλ₯Ό ν•΄μ œν•œλ‹€. (λ©”λͺ¨λ¦¬ 보호 λͺ©μ , λ©”λͺ¨λ¦¬μ— μΊμ‹œλœ Pageλ₯Ό κ³ μΉ˜λŠ” μ“°λ ˆλ“œ(?)λŠ” 1κ°œμ΄μ–΄μ•Ό ν•œλ‹€. λ””μŠ€ν¬μ—μ„œ λ©”λͺ¨λ¦¬λ‘œ 데이터λ₯Ό μ˜¬λ¦¬λŠ” 도쀑에 λ©”λͺ¨λ¦¬μ˜ pageλ₯Ό 읽으면 μ•ˆλ˜κΈ° λ•Œλ¬Έμ— μ™„μ „νžˆ λ””μŠ€ν¬μ—μ„œ λ©”λͺ¨λ¦¬λ‘œ 데이터λ₯Ό μ μž¬ν•˜κΈ° μ „κΉŒμ§€λŠ” λ‹€λ₯Έ μš”μ²­μ€ λŒ€κΈ°ν•΄μ•Ό ν•œλ‹€. 이게 latch wait 이닀)

WRITELOG
둜그λ₯Ό μ“°κΈ° μœ„ν•΄ λŒ€κΈ°ν•˜κ³  μžˆλŠ” μ‹œκ°„. Disk의 μ“°κΈ° μ„±λŠ₯에 μ§μ ‘μ˜ν–₯을 λ―ΈμΉ¨. Temp Table을 μƒμ„±ν•˜μ—¬ Temp Table에 Insert, Delete, Update μž‘μ—…μ„ ν•˜κ±°λ‚˜ Table에 μ΄λŸ¬ν•œ μž‘μ—…μ΄ 많이 μΌμ–΄λ‚œλ‹€λ©΄ 병λͺ©μ§€μ μ΄ 될 수 μžˆλ‹€.

LATCH_EX
LATCH_EXλŠ” 배타적인 LATCHλ₯Ό μ–»κΈ° μœ„ν•΄ λŒ€κΈ°ν•˜λŠ” μ‹œκ°„

NETWORKIO
NETWORKIOλŠ” Network Input/Output에 λŒ€κΈ°ν•˜λŠ” μ‹œκ°„. NIC의 Bandwidthλ₯Ό 체크해야 ν•œλ‹€.

LCK_M_S
Latchλ₯Ό 얻은 λ™μ•ˆμ—λŠ” λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€κ°€ νŽ˜μ΄μ§€μ˜ λ³€κ²½ 등을 ν•˜μ§€ λͺ»ν•˜λ„둝 Lock을 걸게 λ˜λŠ” 것이닀. κ·ΈλŸ¬λ―€λ‘œ Latchλ₯Ό μ–»κ³  Latchλ₯Ό ν•΄μ œν•  λ•ŒκΉŒμ§€μ˜ μ‹œκ°„μ΄ λΉ λ₯΄λ©΄ λΉ λ₯Όμˆ˜λ‘ μ„±λŠ₯은 μ¦κ°€λœλ‹€. 즉, Memory와 Disk간에 데이터 전솑이 λΉ λ₯΄λ‹€λ©΄ LCK_M_S, PAGEIOLATCH_SH의 λŒ€κΈ° μ‹œκ°„μ€ 쀄어듀 것이닀.

IO_COMPLETION
IO_COMPLETIONλŠ” I/O μš”μ²­μ„ μ™„λ£Œν•˜λŠ”λ° λŒ€κΈ°ν•˜λŠ” μœ ν˜•μ„ λ§ν•œλ‹€. Query Plan이 λ‚˜μœ 경우 λ°œμƒν•˜λŠ” λŒ€κΈ° μœ ν˜•μœΌλ‘œ Full Scan, Index Scan이 μΌμ–΄λ‚˜λŠ” 쿼리에 λŒ€ν•œ Query Plan 쑰정이 ν•„μš”ν•˜λ‹€.

PAGEIOLATCH_EX
PAGEIOLATCH_EXλŠ” LATCH_EX λŒ€κΈ° μœ ν˜•κ³Ό ν•¨κ»˜ μΌμ–΄λ‚˜λŠ” λŒ€κΈ° μœ ν˜•μ΄λ‹€.

λΆ„μ„μš”μ•½
μˆ˜μ§‘λœ λ°μ΄ν„°λ‘œ 보아 CXPACKET, PAGEIOLATCH_SH λŒ€κΈ°μœ ν˜•μ΄ 70% 이상을 μ°¨μ§€ ν•˜κ³  μžˆλ‹€. μ‚΄νŽ΄λ³΄μ•„μ•Ό ν•  것은 이 μ‹œκ°„λŒ€μ— 큰 μž‘μ—…μ΄ μΌμ–΄λ‚¬λŠ”μ§€μ— λŒ€ν•œ 것과 블둝킹에 λŒ€ν•œ μ΄μŠˆμ΄λ‹€. λ§Œμ•½ μ‹€ν–‰κ³„νšμ΄ 잘λͺ»λ˜μ–΄μ„œ 쿼리λ₯Ό μˆ˜ν–‰ν•˜λŠ” 총 λΉ„μš©μ΄ MSSQL Serverμ—μ„œ μ„€μ •ν•œ κ°’(κΈ°λ³Έκ°’:5)보닀 더 크닀면 병렬쿼리λ₯Ό μˆ˜ν–‰ν•  것이닀. μ€‘μš”ν•œ 것은 κ³Όμ—° 병렬쿼리가 ν•„μš”ν•œκ°€μ— λŒ€ν•œ 평가이닀. λ˜ν•œ Latch에 λŒ€ν•œ λŒ€κΈ°μœ ν˜•λ„ 만만치 μ•Šλ‹€. 이 μ˜λ―ΈλŠ” 두 κ°€μ§€λ‘œ 해석해 λ³Ό 수 μžˆλ‹€. 즉, Memory λΆ€μ‘±μ΄κ±°λ‚˜ Disk I/O μ„±λŠ₯에 κ΄€λ ¨λœ 것이닀. λ¬Όλ‘  H/W의 κ΄€μ μ—μ„œλ§Œ 보면 κ·Έλ ‡λ‹€. μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ œλŒ€λ‘œ μž‘μ„±λ˜μ—ˆλŠ”μ§€μ˜ μ—¬λΆ€λ₯Ό νŒλ‹¨ ν›„ Memory와 Disk I/O에 λŒ€ν•΄μ„œ μ‚΄νŽ΄λ³΄μ•„μ•Ό ν•  것이닀.

둜그λ₯Ό μ“°λŠ” 것도 μ•½ 9%의 λŒ€κΈ°μœ ν˜•μ„ λ³΄μ˜€λ‹€. νŠΈλžœμž­μ…˜μ— λŒ€ν•œ 둜그λ₯Ό κΈ°λ‘ν•˜κΈ° μœ„ν•΄μ„œ ν”„λ‘œμ„ΈμŠ€κ°€ λŒ€κΈ°ν•œ λΉ„μœ¨μ΄ μ•½ 9%λΌλŠ” 것이닀. μ΄κ²ƒμœΌλ‘œ 보아도 Disk에 λ­”κ°€ μ•ˆ 쒋은 ꡬ성이 μžˆμ„ 수 μžˆλ‹€λŠ” 감을 μž‘μ„ 수 μžˆλ‹€. λ˜ν•œ Disk에 병λͺ©μ΄ μžˆμŒλ„ μ•Œ 수 μžˆλ‹€. κ·ΈλŸ¬λ‚˜ μ€‘μš”ν•œ 것은 μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ΅œμ ν™”λ˜μ—ˆλŠ”μ§€μ˜ μ—¬λΆ€κ°€ λ¨Όμ € νŒλ‹¨λ˜μ–΄μ•Ό ν•˜λŠ” 것이닀.

7 DBMS Wait Event λͺ¨λ‹ˆν„°λ§-DMV #

8 Index 뢄석 #

νŠœλ‹μž‘μ—…μ— μ˜λ’°κ°€ λ“€μ–΄μ˜¨λ‹€λ©΄ Index에 λŒ€ν•œ μ΅œμ ν™”κ°€ μ΄λ£¨μ–΄μ‘Œλ‹€λŠ” 것은 κΈ°λŒ€ν•˜κΈ° μ–΄λ ΅λ‹€. κ·ΈλŸ¬λ―€λ‘œ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜λ“€μ΄ 잘 μˆ˜ν–‰λ˜κ²Œ ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ μ ˆν•œ ν™˜κ²½μ˜ 쑰성이 ν•„μš”ν•˜λ‹€. μ‚¬μš©μžλ“€μ˜ μ •λ³΄μš•κ΅¬λ₯Ό λ§Œμ‘±μ‹œν‚€κΈ° μœ„ν•œ μ μ ˆν•œ μ„œλ²„μ˜ μš©λŸ‰μ΄ κ°–μΆ”μ–΄μ Έ μžˆμ–΄μ•Ό ν•˜λ©°, μ μ ˆν•œ λ„€νŠΈμ›Œν¬ λŒ€μ—­ν­λ“±μ˜ ν•˜λ“œμ›¨μ–΄ ν™˜κ²½κ³Ό μ†Œν”„νŠΈμ›¨μ–΄μ μΈ μ μ ˆν•œ 섀정이 ν•„μš”ν•˜λ‹€. κ·ΈλŸ¬λ―€λ‘œ μž‘μ„±λœ λ§Žμ€ Query듀이 μ΅œμ†Œν•œμ˜ μžμ›μ„ μ΄μš©ν•˜μ—¬ 결과집합을 λ§Œλ“€κ²Œ ν•˜κΈ° μœ„ν•΄μ„œ μ μ ˆν•œ 인덱슀의 생성이 ν•„μš”ν•˜λ‹€.

인덱슀 μƒμ„±μ—λŠ” λ§Žμ€ κ³ λ €κ°€ ν•„μš”ν•˜λ‹€. νŠΉμ • ν•˜λ‚˜μ˜ Queryλ₯Ό μ΅œμ ν™” μ‹œν‚€κΈ°λŠ” 맀우 μ‰½μ§€λ§Œ μ—¬λŸ¬ 개의 Queryκ°€ λͺ¨λ‘ μ œλŒ€λ‘œ λ™μž‘ν•˜κ²Œ ν•˜κΈ° μœ„ν•΄μ„œλŠ” 쒅합적인 νŒλ‹¨μ΄ ν•„μš”ν•˜λ‹€. λ¬Όλ‘  이에 μš°μ„ ν•˜μ—¬ μΈλ±μŠ€μ— λŒ€ν•œ μ •ν™•ν•œ 이해가 ν•„μš”ν•˜λ‹€. λ¬Όλ‘  이전에 λ”μš± κ³ λ €λ˜μ–΄μ•Ό ν•˜λŠ” 사항은 λ‹Ήμ—°νžˆ μ„€κ³„μ΄μ „μ˜ 단계이닀. 인덱슀 μ„€κ³„λŠ” 논리 λͺ¨λΈμ— 직접적인 영ν–₯을 λ―ΈμΉœλ‹€. 이에 λŒ€ν•œ μ‚¬λ‘€λŠ” β€œμ„€κ³„μ˜ μ€‘μš”μ„±β€ λ‹¨κ³„μ—μ„œ μžμ„Ένžˆ λ‹€λ£¨κΈ°λ‘œ ν•˜κ² λ‹€.

μˆ˜μ§‘λœ 정보λ₯Ό μ΄μš©ν•˜μ—¬ Index μ„ μ •
각 DBMS 벀더듀은 점점 μ‚¬λžŒμ΄ ν•  일을 쀄이고 μžˆλ‹€. Microsoftμ‚¬λŠ” κ·Έ 쀑 더 μ‹¬ν•˜λ‹€. Oracle사도 λ§ˆμ°¬κ°€μ§€λ‘œ DBA의 ν•  일을 쀄이고 μžˆλ‹€. κ·ΈλŸ¬λ―€λ‘œ DBA의 μ—…λ¬΄λŠ” 창쑰적인 업무(Query, SPμž‘μ„±, Modeling & Design)둜 μ΄λ™λ˜κ³  μžˆλŠ” 좔세이닀. Index에 λŒ€ν•œ 것도 MS-SQL ServerλŠ” Index Tuning Wizard λΌλŠ” νˆ΄μ„ 두어 κ½€ 효과적으둜 Indexλ₯Ό μ„ μ •ν•œλ‹€. 이 νˆ΄λ§Œμ΄λΌλ„ μ λ‹Ήνžˆ 잘 μ΄μš©ν•˜λ©΄ κ·Έλ‚˜λ§ˆ μ„±λŠ₯에 λŒ€ν•œ 걱정은 μ•½κ°„ 덜 수 μžˆλ‹€. κ·ΈλŸ¬λ‚˜ 이 νˆ΄λ„ 성격이 μžˆμ–΄ λ‚˜μ˜¨ κ²°κ³Όλ₯Ό DBAκ°€ ν™•μΈν•˜μ—¬ 적절히 μ‘°μ • ν›„ μ„œλ²„μ— μ μš©ν•΄μ•Ό ν•œλ‹€. Index Tuning Wizardλ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” 자료의 μˆ˜μ§‘μ΄ 맀우 μ€‘μš”ν•˜λ‹€.

Index Tuning WizardλŠ” ProfilerλΌλŠ” 툴둜 μˆ˜μ§‘λœ 자료λ₯Ό μ΄μš©ν•˜κ±°λ‚˜ μΏΌλ¦¬λΆ„μ„κΈ°μ—μ„œ νŠΉμ • Queryλ₯Ό μž‘μ„±ν•˜μ—¬ 이λ₯Ό ν† λŒ€λ‘œ λΆ„μ„ν•œ λ‹€μŒ Index에 λŒ€ν•œ μ‘°μ–Έν•΄ μ€€λ‹€. μ‚¬μš©λ²•μ€ μ‰¬μš°λ‹ˆ λ§€λ‰΄μ–Όμ΄λ‚˜ λ‹€λ₯Έ μ°Έκ³  μ„œμ μ„ μ°Έκ³ ν•˜μž. Index Tuning WizardλŠ” 주둜 κ²°ν•©μΈλ±μŠ€λ₯Ό μƒμ„±ν•˜λ €κ³  λ§Žμ€ λ…Έλ ₯을 κΈ°μšΈμΈλ‹€. 쑰건 μ ˆμ„ ν•΄μ„ν•˜μ—¬ μ—΄μ‹¬νžˆ κ²°ν•©μΈλ±μŠ€λ₯Ό λ§Œλ“€λ €κ³  ν•œλ‹€. λ§Žμ€ 자료λ₯Ό μˆ˜μ§‘ν•˜μ—¬ Index Tuning Wizardλ₯Ό μˆ˜ν–‰ν•˜λ©΄ ν•„μš” μ—†λŠ” 인덱슀 λ§Œλ“€μ–΄μ§ˆ μˆ˜λ„ μžˆλ‹€λŠ” 것이닀. (λ…ΈνŒŒμ‹¬μ—μ„œ 이야기 ν•˜μ§€λ§Œ 이 말은 자료λ₯Ό 쑰금 μˆ˜μ§‘ν•˜λΌλŠ” 말이 μ•„λ‹ˆλ‹€. 툴의 ν•œκ³„λ₯Ό μ„€λͺ…ν•˜λŠ” 것이닀.) 예λ₯Ό λ“€μ–΄, λ³‘μ›μ˜ 경우 ChartNo(차트번호)λΌλŠ” 컬럼이 λŒ€λΆ€λΆ„μ˜ Query 쑰건에 μ†ν•˜κ²Œ λœλ‹€. κ²½μš°μ— 따라 ν‹€λ¦¬μ§€λ§Œ ν•˜λ‚˜μ˜ ν…Œμ΄λΈ”μ— 같은 ChartNoλŠ” 1~3건 정도일 것이닀. μ•„λ§ˆλ„ 자료λ₯Ό μˆ˜μ§‘ν•˜μ—¬ Index Tuning Wizardλ₯Ό μ‹€ν–‰ν•˜λ©΄ λ‹€μŒκ³Ό 같은 ν˜•νƒœμ˜ Index 생성을 μ‘°μ–Έν•  것이닀.

ChartNo + ColA + ColB
ChartNo + ColB + ColC + ColD
ChartNo + ColZ
Where에 λͺ…μ‹œν•œ 쑰건을 λͺ¨λ‘ κ²°ν•©μΈλ±μŠ€λ‘œ λ§Œλ“€μ–΄μ§„ 격이닀. (μ†ŒμŠ€λ₯Ό λ³΄μ§€λŠ” μ•Šμ•˜μ§€λ§Œ κ²½ν—˜μƒ Index Tuning WizardλŠ” 쑰건 μ ˆμ— λͺ…μ‹œν•œ 컬럼과 선택도λ₯Ό μ΄μš©ν•˜μ—¬ Indexλ₯Ό μƒμ„±ν•˜λŠ” κ²ƒμœΌλ‘œ νŒŒμ•…λœλ‹€.) μœ„μ˜ 경우 ChartNoλŠ” λ§Žμ•„μ•Ό 3κ±΄μž„μ—λ„ λΆˆκ΅¬ν•˜κ³  ChartNo둜 μ‹œμž‘ν•œ κ²°ν•©μΈλ±μŠ€κ°€ 많이 λ§Œλ“€μ–΄μ§„ 것을 λ³Ό 수 μžˆλ‹€. μ΄λŸ¬ν•œ 것은 Index Tuning Wizard 뿐만 μ•„λ‹ˆλΌ κ°œλ°œμžλ„ μ΄λŸ¬ν•œ κ²½ν–₯을 λ³΄μ΄λŠ” κ²½μš°κ°€ 많이 μžˆλ‹€. κ·Έλž˜μ„œ ν•„μžμ™€ 같은 경우 Tuning μž‘μ—…μ„ ν•  λ•Œ ν™˜κ²½νŒŒμ•… 이후 Index μ •λ¦¬μž‘μ—…λΆ€ν„° ν•œλ‹€. ν•„μš” μ—†λŠ” 인덱슀λ₯Ό μ§€μ›Œμ£Όκ±°λ‚˜ λ‹€μ‹œ μž‘μ„±ν•˜λŠ” 것이닀. μœ„μ™€ 같이 μΈλ±μŠ€κ°€ μƒμ„±λ˜μ–΄ μžˆμ„ κ²½μš°λŠ” μ‚­μ œλŒ€μƒμ΄λ‹€. 즉, ChartNo μ»¬λŸΌμ— 단일 인덱슀둜 κ΅¬μ„±ν•˜λŠ” 것이 κ°€μž₯ μ΅œμ μ΄λΌλŠ” 것이닀. μ§€κΈˆμ€ νŠœλ‹μ˜ 절차λ₯Ό 닀루데 쀑점을 두고 μžˆμœΌλ―€λ‘œ μ™œ 인덱슀λ₯Ό μƒμ„±ν•˜λ©°, 인덱슀λ₯Ό μ‘°μ •ν•˜κ³ , μΆ”κ°€ν•˜μ—¬ μ£Όμ–΄μ•Ό ν•˜λŠ”μ§€λŠ” 인덱슀 λΆ€λΆ„μ—μ„œ μžμ„Ένžˆ 닀루도둝 ν•˜κ² λ‹€.

9 λ°μ΄ν„°λ² μ΄μŠ€ λ””μžμΈ νŠœλ‹ #

λ°μ΄ν„°λ² μ΄μŠ€ λ””μžμΈ νŠœλ‹μ€ 맀우 λ―Όκ°ν•œ μ‚¬μ•ˆμ΄λ‹€. μ •μΉ˜μ (?)μœΌλ‘œλ„ ν”„λ‘œμ νŠΈ μ „λ°˜μ μΈ 영ν–₯도도 맀우 크닀. μ •μΉ˜μ μ΄λΌλŠ” ν‘œν˜„μ„ μ“΄ 것은 λ°μ΄ν„°λ² μ΄μŠ€ λ””μžμΈμ„ λ‚˜μ΄ λ§Žμ€ κ΄€λ¦¬μžκΈ‰μ˜ ν”„λ‘œμ νŠΈ μ°Έκ°€μžκ°€ μ§„ν–‰ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€. λ§Œμ•½ λ””μžμΈμ— λŒ€ν•΄μ„œ μ–΄λ–€ 지적을 ν•˜λ©΄ λŒ€λΆ€λΆ„μ˜ κ΄€λ¦¬μžλ“€μ€ λ‚œκ°ν•΄ν•˜κ³ , κΈ°λΆ„ λ‚˜λΉ ν•˜κΈ° λ•Œλ¬Έμ— 말에 κ·€λ₯Ό κΈ°μšΈμ΄μ§€ μ•ŠλŠ”λ‹€. μ˜μ‚¬μ†Œν†΅μ΄ μ—†λŠ” μž‘μ—…μ€ 맀우 νž˜λ“€κΈ° λ§ˆλ ¨μ΄λ‹€.

λ˜ν•œ λ°μ΄ν„°λ² μ΄μŠ€ λ””μžμΈ 변경은 ν”„λ‘œκ·Έλž¨ μ†ŒμŠ€μ˜ 변경을 μœ λ°œν•˜κΈ° λ•Œλ¬Έμ— 결합도가 κ°•ν•œ ν”„λ‘œκ·Έλž¨μ„ λ§Œλ“€μ—ˆλ‹€λ©΄ λ””μžμΈ 변경에 λŒ€ν•œ 영ν–₯은 맀우 크닀. κ·ΈλŸ¬λ―€λ‘œ λ””μžμΈμ˜ 변경은 신쀑에 신쀑을 κΈ°ν•΄μ•Ό ν•˜κ³ , λ³€κ²½μ˜ν–₯ 뢄석을 λ°˜λ“œμ‹œ ν•΄μ•Ό ν•œλ‹€.

λ§Œμ•½ 개발 초기 단계라면 ν”„λ‘œκ·Έλž¨ μ†ŒμŠ€μ— λŒ€ν•œ μˆ˜μ •μ€ 그리 λ§Žμ§€λŠ” μ•Šμ„ κ²ƒμ΄λ―€λ‘œ 변경에 λŒ€ν•œ 영ν–₯은 적닀. μ΄λŸ¬ν•œ ν˜„μƒμ€ 맀우 λ°”λžŒμ§ν•œ ν˜„μƒμ΄λ©°, ν”„λ‘œμ νŠΈ κ΄€λ¦¬μžλŠ” 맀우 ν˜„λͺ…ν•œ μ‚¬λžŒμž„μ—λŠ” λΆ„λͺ…ν•˜λ‹€. λ””μžμΈ νŠœλ‹μ„ ν•˜λ €λŠ” λ…Έλ ₯은 ν”„λ‘œμ νŠΈμ˜ κ°œλ°œκΈ°κ°„μ„ λ‹¨μΆ•ν•˜κ³ , 쒋은 질의 정보λ₯Ό μ‚¬μš©μžμ—κ²Œ μ œκ³΅ν•  수 μžˆλŠ” μ΄ˆμ„μ΄ 될 κ²ƒμž„μ—λŠ” λΆ„λͺ…ν•˜λ‹€.

10 SQL νŠœλ‹ λŒ€μƒ μˆ˜μ§‘ #

이 λ‹¨κ³„μ—μ„œ λ…μžλ“€μ΄ 약간은 ν˜Όλž€ ν•  μˆ˜λ„ μžˆμ„ 것이닀. Index 생성 및 쑰정을 μœ„ν•œ 데이터λ₯Ό μˆ˜μ§‘ν–ˆλŠ”λ° 또 무얼 μˆ˜μ§‘ν•œλ‹€λŠ” 말인가? λ§žλŠ” 말이닀. μš”λŠ” λͺ¨λ“  SQL을 λŒ€μƒμœΌλ‘œ ν•˜λ˜ μš°μ„ μ‹œλ˜λŠ” 것듀을 λ¨Όμ € λΆ„λ₯˜λ₯Ό ν•˜μžλŠ” 것이닀. 이 μžλ£ŒλŠ” νŠœλ‹μž‘μ—… μ™„λ£Œ μ‹œ μ–Όλ§ˆλ§ŒνΌμ˜ 효과λ₯Ό κ°€μ§„ μž‘μ—…μ΄μ˜€λŠ”μ§€ 평가할 λŒ€μƒμ˜ μžλ£Œκ°€ λ˜κΈ°λ„ ν•œλ‹€. λ”œλ ˆλ§ˆλŠ” μ‘λ‹΅μ‹œκ°„ λ˜λŠ” 전체 μ²˜λ¦¬μ‹œκ°„μ΄ λ§Žμ€ 것뢀터 ν•˜λŠλƒ μ•„λ‹ˆλ©΄ μžμ›μ˜ μ‚¬μš©λŸ‰μ΄ λ§Žμ€ 것을 λŒ€μƒμœΌλ‘œ ν•˜λŠ”κ°€μ— λŒ€ν•œ λ¬Έμ œμ΄λ‹€. λ‹€μŒμ€ ν•„μžκ°€ μ‚¬μš©ν•˜λŠ” ν˜•μ‹μ˜ λ¬Έμ„œμ΄λ‹€.

11 Query 및 SP μ΅œμ ν™” #

λͺ¨λ“  데이터가 μˆ˜μ§‘λ˜μ—ˆλ‹€λ©΄ μ΄μ œλΆ€ν„°λŠ” μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ νŠœλ‹μ„ ν•˜κ²Œ λœλ‹€. λ¬Όλ‘  이전에 λΉ„μ¦ˆλ‹ˆμŠ€ 둜직의 νŠœλ‹μ΄ 이루어진닀면 λ”μš± μ’‹λ‹€. μˆ˜μ§‘λœ 자료λ₯Ό ν† λŒ€λ‘œ ν•˜λ‚˜μ”© μ„±λŠ₯에 μ•…μ˜ν–₯을 λΌμΉ˜λŠ” 것듀을 μ œκ±°ν•΄ λ‚˜κ°μœΌλ‘œμ¨ 이 λ‹¨κ³„μ˜ μž‘μ—…μ€ μ§„ν–‰λœλ‹€. 이 λ‹¨κ³„μ—μ„œλŠ” νŠœλ‹ μž‘μ—…μžμ˜ SQL μž‘μ„± λŠ₯λ ₯κ³Ό κ΄€κ³„μžλ“€μ˜ ν˜‘μ‘°κ°€ νŠœλ‹ μž‘μ—…μ˜ μ„±κ³΅μš”μΈμœΌλ‘œ 맀우 μ€‘μš”ν•˜κ²Œ μž‘μš©ν•œλ‹€. SQL νŠœλ‹μ€ λ‹€μŒμ˜ 3κ°€μ§€ κ΄€μ μ—μ„œ νŒŒμ•…λœλ‹€.

SQL Tuning의 3κ°€μ§€ 관점
  • 쿼리 뢄석기λ₯Ό ν†΅ν•œ λΉ„μš© 쑰절
    • μ˜¬λ°”λ₯Έ 인덱슀 μ‚¬μš©
    • 쑰인 μˆœμ„œ μ‘°μ •
    • 힌트의 μ‚¬μš©
  • LOGIC νŠœλ‹
    • CASE WHEN λ¬Έ
    • OUTER JOIN
    • ν”„λ‘œμ‹œμ € 및 ν•¨μˆ˜
  • BATCH μž‘μ—… νŠœλ‹
    • μ΅œμ†Œ μž…/좜λ ₯이 κ°€λŠ₯ν•˜κ²Œ μ‘°μ •
    • LOOPλ‚΄ μΏΌλ¦¬λŠ” μ΅œλŒ€ν•œ νŠœλ‹
    • 이용 κ°€λŠ₯ν•œ μžμ›μ„ 적절히 μ‚¬μš©ν•˜λ„λ‘ μ‘°μ •

ORACLE의 μ˜΅ν‹°λ§ˆμ΄μ €μ˜ 경우 λΉ„μš© 기반의 μ˜΅ν‹°λ§ˆμ΄μ €μ™€ κ·œμΉ™ 기반의 μ˜΅ν‹°λ§ˆμ΄μ €λ₯Ό λͺ¨λ‘ κ°€μ§€κ³  μžˆλ‹€.(10gλŠ” κ·œμΉ™κΈ°λ°˜μ˜ μ˜΅ν‹°λ§ˆμ΄μ €λ₯Ό 버렸닀.) ORACLE의 λΉ„μš©κΈ°λ°˜ μ˜΅ν‹°λ§ˆμ΄μ €λŠ” 두 κ°€μ§€μ˜ μ˜΅ν‹°λ§ˆμ΄μ € λͺ¨λ“œλ₯Ό κ°€μ§€κ³  μžˆλŠ”λ°, 그것은 FIRST_ROW방식과 ALL_ROW방식이닀. MSSQL SERVERλŠ” λΉ„μš©κΈ°λ°˜μ˜ μ˜΅ν‹°λ§ˆμ΄μ €λ§Œ μ§€μ›ν•œλ‹€. 기본적으둜 MSSQL SERVERλŠ” 전체 κ²°κ³Όλ₯Ό λ¦¬ν„΄ν•˜κΈ° μœ„ν•œ ALL_ROW방식을 μ‚¬μš©ν•œλ‹€. FIREST_ROW 방식은 OPTION(FAST N) 의 힌트λ₯Ό μ£Όλ―€λ‘œ ν•΄μ„œ 흉내λ₯Ό λ‚Ό 수 μžˆλ‹€. MSSQL SERVERμ—μ„œ OPTION(FAST N)을 뢙이지 μ•ŠμœΌλ©΄ HASH JOIN, MERGER JOIN의 κ²½ν–₯을 κ°€μ§€λ©°, OPTION(FAST N)을 뢙이면 NESTED LOOP JOIN의 κ²½ν–₯을 κ°€μ§„λ‹€. (OPTION(FAST N)으둜 뢙이면 가끔씩 μ‹€ν–‰κ³„νšμ΄ λ°”λ€ŒλŠ” κ²½μš°κ°€ μžˆμŒμ„ 이야기 ν•œλ‹€.) μžμ„Έν•œ 것은 μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ νŠœλ‹λ‹¨κ³„μ—μ„œ μ•Œμ•„λ³Ό 것이닀.

12 νŠΈλžœμž­μ…˜ 정보 μˆ˜μ§‘ #

Query 및 SPλ₯Ό μ΅œμ ν™” ν–ˆμŒμ—λ„ λΆˆκ΅¬ν•˜κ³  느린 쿼리가 μžˆκ±°λ‚˜ μ‘λ‹΅μ‹œκ°„μ΄ μ‹€ν–‰μ‹œλ§ˆλ‹€ ν‹€λ¦° 것은 Blocking 및 Dead Lock을 μ˜μ‹¬ν•΄μ•Ό ν•œλ‹€. ν˜ΉμžλŠ” λ°μ΄ν„°λ² μ΄μŠ€ μ„œλ²„μ—μ„œ μ–΄λ–»κ²Œ ν•΄ 쀄 것을 κΈ°λŒ€ν•˜κ³  μžˆμœΌλ‚˜ 이것은 잘λͺ»λœ κΈ°λŒ€μ΄λ‹€. μ™œλƒν•˜λ©΄ νŠΈλžœμž­μ…˜μ˜ 주인은 μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ— 있기 λ•Œλ¬Έμ΄λ‹€. νŠΈλžœμž­μ…˜ λ¬Έμ œλŠ” 99%κ°€ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ λ˜λŠ” μ„€κ³„μ˜ 잘λͺ»μ΄λΌκ³  감히 말할 수 μžˆλ‹€. (λŒ€λΆ€λΆ„μ€ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜) μ„œλ²„μ—μ„œ μ œμ–΄ν•  수 μžˆλŠ” 것은 λ‹€λ§Œ 졜적의 Indexλ₯Ό λ§Œλ“€μ–΄ νŠΈλžœμž­μ…˜μ˜ 영ν–₯을 μ΅œμ†Œν™”μ‹œν‚€κ³ , ν”„λ‘œμ„ΈμŠ€λ₯Ό Killν•˜κ±°λ‚˜ 고립화 λ ˆλ²¨μ„ μ‘°μ •ν•  수 μžˆλŠ” 것뿐이닀.

13 ν•˜λ“œμ›¨μ–΄ νŠœλ‹ #

ν•˜λ“œμ›¨μ–΄ νŠœλ‹ μ „ μ„œλ²„ μΈ‘μ—μ„œ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ 잘 λŒμ•„κ°ˆ 수 μžˆλ„λ‘ ν™˜κ²½μ„ λ§Œλ“€μ–΄ μ€€λ‹€. 예λ₯Ό λ“€μ–΄ Index μž¬μƒμ„± 및 쑰각λͺ¨μŒ, Disk 쑰각λͺ¨μŒκ³Ό 같은 μž‘μ—…μ΄λ‹€. λ˜ν•œ μ μ ˆν•œ Disk λΆ„μ‚°μœΌλ‘œ λΆ€ν•˜λ₯Ό λΆ„μ‚°μ‹œμΌœμ£ΌλŠ” 것이 μ€‘μš”ν•˜λ‹€. λͺ¨λ“  단계가 λλ‚¬μŒμ—λ„ λΆˆκ΅¬ν•˜κ³  μ„±λŠ₯이 λ–¨μ–΄μ§„λ‹€λ©΄ ν•˜λ“œμ›¨μ–΄ μžμ›μ˜ λΆ€μ‘±μ΄κ±°λ‚˜ μ„€κ³„μƒμ˜ λ¬Έμ œμ΄λ―€λ‘œ ν•˜λ“œμ›¨μ–΄ 증섀을 κ³ λ €ν•œλ‹€. μ΄λ•ŒλŠ” μ„±λŠ₯λͺ¨λ‹ˆν„°λ§ 도ꡬ와 MSSQL Server 병λͺ©μ„ λͺ¨λ‹ˆν„°λ§ ν•œ 자료λ₯Ό κ°€μ§€κ³  μ–΄λ–€ λΆ€λΆ„μ˜ μžμ›μ΄ λΆ€μ‘±ν•œμ§€λ₯Ό νŒŒμ•…ν•œ λ’€ ν•˜λ“œμ›¨μ–΄ 증섀을 κ³ λ €ν•΄μ•Ό ν•œλ‹€. μ€‘μš”ν•œ 것은 κ²½ν—˜μ— μ˜ν•œ νŒλ‹¨μ„ ν•˜μ§€ λ§λΌλŠ” 것이닀. 이전에 λ©”λͺ¨λ¦¬λ₯Ό μ¦μ„€ν•˜μ˜€λ”λ‹ˆ μ„±λŠ₯이 ν–₯μƒλ˜μ—ˆλ‹€κ³  ν•˜μ—¬ μ„±λŠ₯ λ¬Έμ œκ°€ λ°œμƒν•˜μ—¬ 또 λ‹€μ‹œ λ©”λͺ¨λ¦¬λ₯Ό μ¦μ„€ν•˜λŠ” 것은 맀우 잘λͺ»λœ 것이닀. μ–΄λŠ ν•œ 곳이 병λͺ©μ΄λΌλ©΄ 유기적으둜 λ¬Άμ—¬μ Έ 움직이기 λ•Œλ¬Έμ— μ„±λŠ₯이 λ–¨μ–΄μ§ˆ 수 μžˆμŒμ„ μ•Œμ•„μ•Ό ν•œλ‹€.

14 처리의 μš°μ„ μˆœμœ„ κ²°μ • #

μ •λ³΄μ‹œμŠ€ν…œμ€ C/S[1]ν™˜κ²½μ΄κ°€ n-Tier ν™˜κ²½μ΄λ‹€. 예λ₯Ό λ“€μ–΄ ν΄λΌμ΄μ–ΈνŠΈ, 미듀웨어, λ°μ΄ν„°λ² μ΄μŠ€μ™€ 같은 3단계 ꡬ쑰λ₯Ό κ°€μ§€κ³  μžˆλ‹€κ³  κ°€μ •ν–ˆμ„ λ•Œμ— μ–΄λŠ Layerμ—μ„œ 처리λ₯Ό ν•˜λŠ” 것이 κ°€μž₯ 쒋은지λ₯Ό νŒλ‹¨ν•΄μ•Ό ν•œλ‹€. λ―Έλ“€μ›¨μ–΄λ‚˜ λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ κ΅¬ν˜„μ€ κ°€λŠ₯ν•˜μ§€λ§Œ ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ μ²˜λ¦¬ν•˜λŠ” 것이 더 λ°”λžŒμ§ ν•  μˆ˜λ„ μžˆλ‹€λŠ” μ†Œλ¦¬λ‹€. λ„ˆλ¬΄ DBλ§Œμ„ κ³ μ§‘ν•˜μ§€ 말고, 과감히 버릴 것은 버렀라. 예λ₯Ό λ“€μ–΄ λ‹€μŒκ³Ό 같은 ν˜•μ‹μœΌλ‘œ 데이터λ₯Ό 뿌렀주고 μ‹Άλ‹€λŠ” μš”κ΅¬μ‚¬ν•­μ΄ μžˆλ‹€κ³  κ°€μ •ν•˜μž. (λ°˜λ³΅λ˜λŠ” 값을 κ°€μ§„ 것을 첫 ν–‰λ§Œ λ³΄μ—¬μ£ΌλŠ” 것)

tuning_process8.jpg

SELECT 
	CASE WHEN FLAG = 2 THEN TYPE ELSE '' END TYPE 
,	TITLE 
FROM ( 
	SELECT 
		MIN(CASE WHEN FLAG = 1 THEN TYPE END) TYPE 
	,	MIN(CASE WHEN FLAG = 1 THEN TITLE END) TITLE 
	,	MIN(CASE WHEN FLAG = 2 THEN FLAG END) FLAG 
	FROM ( 
		SELECT 
			MIN(TYPE) TYPE 
		,	MIN(TITLE) TITLE 
		,	MIN(TITLE_ID) TITLE_ID 
		,	MIN(ID) FLAG 
		FROM TITLES A CROSS JOIN (SELECT 1 ID UNION ALL SELECT 2) B 
	GROUP BY 
		CASE WHEN ID = 1 THEN TITLE_ID ELSE TYPE END 
) T 
GROUP BY TITLE_ID 
) T 
λ¬Όλ‘  쿼리 κ²°κ³ΌλŠ” μœ„μ—μ„œ μ›ν•˜λŠ” ν˜•νƒœλ‘œ λ‚˜μ™”λ‹€. λ¬Όλ‘  λ‹€λ₯Έ 방식도 μžˆλ‹€. DBMSκ°€ 였라클이라면 λΆ„μ„μš© ν•¨μˆ˜λ₯Ό μ΄μš©ν•˜μ—¬ κ°„λ‹¨νžˆ ν•΄κ²°ν•  수 μžˆμ—ˆμ„ 것이닀. SQL Server 2005라면 ROW_NUMBER()λ₯Ό μ΄μš©ν•˜λ©΄ 맀우 쉽닀. λ‹€λ§Œ μ„œλ²„ μΈ‘μ—μ„œ μ²˜λ¦¬ν•˜κΈ°μ—λŠ” (κ²°κ³ΌλŠ” λ‚˜μ˜€μ§€λ§Œ) λΉ„νš¨μœ¨μ μΈ 처리인 경우 λ¬΄λ¦¬ν•˜κ²Œ μ„œλ²„ 처리λ₯Ό κ³ μ§‘ν•˜μ§€ 말고, μ€‘κ°„κ³„μΈ΅μ΄λ‚˜ ν΄λΌμ΄μ–ΈνŠΈ ν”„λ‘œκ·Έλž¨μ—μ„œ μ²˜λ¦¬ν•˜λ„λ‘ ν•˜λŠ” 것도 μžμ› μ‚¬μš©μ˜ λΆ„μ‚°μœΌλ‘œ μΈν•œ μ„±λŠ₯ ν–₯μƒνš¨κ³Όκ°€ μžˆλ‹€λŠ” 것을 μ•Œμ•„λ‹¬λΌλŠ” 것이닀. μœ„ 쿼리의 κ²½μš°λ„ μžμ›μ˜ μ‚¬μš©λŸ‰μœΌλ‘œ λ³Ό λ•Œ ν΄λΌμ΄μ–ΈνŠΈλ‚˜ μ€‘κ°„κ³„μΈ΅μ—μ„œ μ²˜λ¦¬ν•˜λŠ” 것이 더 λ‚«λ‹€κ³  λ³Ό 수 μžˆμœΌλ‚˜, κ°œλ°œμ‹œκ°„κ³Ό 같은 상황 μš”μ†Œλ„ κ³ λ €ν•΄μ•Ό ν•œλ‹€.

또 ν•œκ°€μ§€ 예λ₯Ό λ“€μ–΄λ³΄μž. ν•„μžκ°€ μ•„λŠ” μ œμ‘°μ—…μ²΄λŠ” λŒ€κΈ°μ—…μ—μ„œ νŒλ§€ν•˜κ³  μžˆλŠ” ERPνŒ¨ν‚€μ§€λ₯Ό λ„μž…ν•˜μ˜€λ‹€. μ‚¬μš©μžλ“€μ€ μ„±λŠ₯에 λŒ€ν•œ λΆˆλ§Œμ„ ν† ν•΄λƒˆλ‹€. κ·Έλž˜μ„œ ν•„μžλŠ” νŠœλ‹μ„ ν•˜κΈ° μœ„ν•΄ μ‚΄νŽ΄λ³΄μ•˜λ‹€. DBμ„œλ²„λŠ” RDBMSμ˜€λŠ”λ° μ „ν˜€ 관계가 λ§Ίμ–΄μ Έ μžˆμ§€ μ•Šμ•˜λ‹€. λ˜ν•œ 기본적으둜 μžλ™ μƒμ„±λ˜λŠ” Primary Key μΈλ±μŠ€λ§Œμ„ μ‚¬μš©ν•˜κ³  μžˆμ—ˆλ‹€. κ²Œλ‹€κ°€ λ³‘λ ¬μ²˜λ¦¬κ°€ ν•„μš” μ—†λŠ”λ° λΆˆκ΅¬ν•˜κ³  λ³‘λ ¬μ²˜λ¦¬λ₯Ό 마ꡬ ν•˜κ³ , μƒκ΄€μ„œλΈŒμΏΌλ¦¬λ₯Ό λͺ‡ λ²ˆμ”© ν•΄κ°€λ©΄μ„œ 1000건, 5000건 μ”© 마ꡬ κ°€μ Έκ°€λŠ” 것이닀. κ·Έλž˜μ„œ ν•„μžλŠ” λ¬Όμ—ˆλ‹€. β€œμ΄κ±° 5000건씩 κ°€μ Έλ‹€κ°€ 뭐에 μ“°μ‹œλ €κ΅¬μš”?” 라고 ν–ˆλ”λ‹ˆ λͺ¨λ₯΄κ² λ‹¨λ‹€. 어이가 μ—†λŠ” 노릇이닀. μ‚¬μš©μžλ“€μ€ μ–΄μ©Œλ©΄ 툴 μ‚¬μš©λ²•μ„ 읡히기 μœ„ν•œ 것, 컴퓨터에 λŒ€ν•œ λ§‰μ—°ν•œ 두렀움 등이 겹쳐 μ—…λ¬΄νš¨κ³Όκ°€ 더 λ–¨μ–΄μ§ˆ μˆ˜λ„ μžˆμ„ 것이닀.

15 μΌκ΄„μ μš© #

이 뢀뢄은 μ „λž΅μ μΈ 것이닀. λ¬Όλ‘  νŠœλ‹ μ „/ν›„ λΉ„κ΅μžλ£Œλ₯Ό λ§Œλ“€λ©΄ λ˜μ§€λ§Œ μ‚¬μš©μžμ—κ²Œ μ„±λŠ₯ ν–₯상 μž‘μ—…μœΌλ‘œ μ •λ³΄μ˜ 질이 ν–₯μƒλ˜μ—ˆλ‹€λŠ” 보여주기 μœ„ν•΄μ„œλŠ” μ΄μ œκΉŒμ§€μ˜ μž‘μ—…μ„ μ’…ν•©ν•˜μ—¬ 일괄 μ μš©ν•˜λŠ” 것이 μ€‘μš”ν•˜λ‹€. μ‘°κΈˆμ”© μ„±λŠ₯을 ν–₯μƒμ‹œν‚€λŠ” 것은 μ‚¬μš©μžκ°€ μΈμ‹ν•˜κΈ° νž˜λ“€κΈ° λ•Œλ¬Έμ— β€˜μ–΄? κ°‘μžκΈ° λΉ¨λΌμ‘Œλ„€β€™ ν•˜κ²Œ λ§Œλ“€μ–΄μ•Ό ν•œλ‹€.
----
   [1]  Client/Server
ο»Ώ
λŒ“κΈ€ 남기기..
이름: : 였λ₯Έμͺ½μ˜ μƒˆλ‘œκ³ μΉ¨μ„ 클릭해 μ£Όμ„Έμš”. μƒˆλ‘œκ³ μΉ¨
EditText : Print : FindPage : DeletePage : LikePages : Powered by MoniWiki : Last modified 2012-03-15 11:05:36

μ§„μ‹€μ˜ 빛은 자주 κ°€λ €μ§€κΈ°λŠ” ν•˜μ§€λ§Œ κ²°μ½” κΊΌμ§€μ§€λŠ” μ•ŠλŠ”λ‹€.