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 #

http://msdn.microsoft.com/ko-kr/library/ms179984.aspx

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 μΌκ΄„μ μš© #

이 뢀뢄은 μ „λž΅μ μΈ 것이닀. λ¬Όλ‘  νŠœλ‹ μ „/ν›„ λΉ„κ΅μžλ£Œλ₯Ό λ§Œλ“€λ©΄ λ˜μ§€λ§Œ μ‚¬μš©μžμ—κ²Œ μ„±λŠ₯ ν–₯상 μž‘μ—…μœΌλ‘œ μ •λ³΄μ˜ 질이 ν–₯μƒλ˜μ—ˆλ‹€λŠ” 보여주기 μœ„ν•΄μ„œλŠ” μ΄μ œκΉŒμ§€μ˜ μž‘μ—…μ„ μ’…ν•©ν•˜μ—¬ 일괄 μ μš©ν•˜λŠ” 것이 μ€‘μš”ν•˜λ‹€. μ‘°κΈˆμ”© μ„±λŠ₯을 ν–₯μƒμ‹œν‚€λŠ” 것은 μ‚¬μš©μžκ°€ μΈμ‹ν•˜κΈ° νž˜λ“€κΈ° λ•Œλ¬Έμ— β€˜μ–΄? κ°‘μžκΈ° λΉ¨λΌμ‘Œλ„€β€™ ν•˜κ²Œ λ§Œλ“€μ–΄μ•Ό ν•œλ‹€.