Transcript sql_tunning
SQL Server 7.0 세미나
(Performance Tuning)
주최: Microsoft
강사: 하성희
차례
Performance tuning 원칙
Configuration Parameter
Index
Query Optimization
Performance Tuning Tool
기타 Performance 관련 Topic
차례
Performance tuning 원칙
Configuration Parameter
Index
Query Optimization
Performance Tuning Tool
기타 Performance 관련 Topic
기본 원칙
Auto-configuring, self-tuning
Buffer cache의 활용 극대화
효율적인 Index 생성 및 관리
Application과 Query Tuning
Query Plan 확인
Tuning Tool의 적절한 활용
Focus : 최소의 I/O
SQL Server Profiler, Index Tuning Wizard
모니터링
Bottleneck 발생 여부 확인
차례
Performance tuning 원칙
Configuration Parameter
Index
Query Optimization
Performance Tuning Tool
기타 Performance 관련 Topic
주요 Parameter들
Max Async I/O
디폴트 : 32, 최대:255
Advanced Option
sp_configure “show advanced options”, 1
go
Affinity Mask
Max Server Memory
Min Server Memory
차례
Performance tuning 원칙
Configuration Parameter
Index
Query Optimization
Performance Tuning Tool
기타 Performance 관련 Topic
데이터 액세스 방식
Table Scan : 모든 Page를 순차적으로 액세스하는 방식
Data
DataPages
Pages
…
Index에 근거한 검색 : Index Page들을 검색하여 조건에 맞는
Key를 찾아 내는 방식 Index Pages
Data Pages
…
Index 분류
SQL Server Index Type
Clustered Index
Non-clustered Index
Uniqueness
Unique Index
Non-unique Index
Column 개수
Single-Column Index
Composite Index
Index 구조
Nonclustered Index
Clustered Index
Index Pages
Non-Leaf
Level
Index Pages
Non-Leaf
Level
Leaf Level
(Key Value)
Data Pages
Leaf
Level
Data Pages
Covering Indexes
Nonclustered Index에 해당함.
Index에 Query검색에 필요한 모든 Column들이
포함되는 경우
Covering index의 예:
select col1, col3 from table1
where col2 = ‘value’
go
create index indexname1 on table1
(col2, col1, col3)
go
Automatic Covering index
Indexing 기본 원칙
데이터에 대한 이해
검색 제한
Selectivity (선택성) 확인
Table에 대한 Query 형태 분석
Query들의 우선 순위 확인
Composite Index-최적의 Column 순서 결정
데이터에 대한 이해
Logical Design과 Physical Design
데이터 특성
어떻게 데이터가 저장되는지
수행되는 query들의 형태
전형적으로 수행되는 query들의 수행주기
검색 제한
Search Arguments 사용
최적의 Search Arguments 작성
Query에서 WHERE 절을 지정
WHERE절이 row의 개수를 제한하는지 확인
Query에서 참조되는 모든 Table에 대한
구문을 검증
Leading wildcard의 사용을 자제
SARG (Search Arguments)
검색을 제한할 수 있으며 INDEX를 사용할 수
있는 경우
SARG
Non-SARG
WHERE name=‘Smith’
WHERE salary=commission
WHERE salary < 3000
WHERE Salary!= 3000
WHERE price = 100/12
WHERE price*12=100
WHERE au_lname like ‘S%’
WHERE
substring(au_lname,1,1)=‘S’
WHERE price between 9 and 20 WHERE price < 2 and price > 4
WHERE au_lname like ‘Sm%’
WHERE au_lname like ‘%Sm’
Selectivity (선택성) 확인
High selectivity
member_no last_name first_name
1
Randall
Joshua
2
Flood
Kathie
.
Anderson
Bill
Low selectivity
member_no last_name first_name
1
Randall
Joshua
2
Flood
Kathie
Number of rows meeting criteria
Total number of rows in table
SELECT *
FROM member
WHERE member_no < 9001
.
.
.
10000
1000
= 10000 = 10%
SELECT *
FROM member
WHERE member_no > 8999
.
.
10000
Number of rows meeting criteria
Total number of rows in table
Anderson
Bill
9000
= 10000 = 90%
Composite Index최적의 Column 순서 결정
CREATE INDEX문에 기술된 Key Column들의
순서가 중요
예: CREATE INDEX t1_ix ON t1 (A, B)
WHERE A=‘Value’ : efficient
WHERE A=‘Value’ and B=‘Value’: efficient
WHERE B=‘Value’ : less efficient
Query 형태 분석
Selectivity 고려
Index를 생성하면 효과적인
경우
특정 값과 일치하는 소수의 Row를
검색하는데 사용되는 Column들
범위에 해당하는 소수의 Row를
검색하는데 사용되는 Column들
자주 Join Key로 사용되는 Column들
특정 순서로 조회되는 Column들 (C.I)
*** Good Selectivity ***
Good Selectivity
Selectivity 와 Density
Index의 Selectivity 확인
DBCC SHOW_STATISTICS (table_name,
index_name)
Statistics 갱신
디폴트 : auto update statistics
수작업 : UPDATE STATISTICS table_name
FILLFACTOR & PAD_INDEX
FILLFACTOR 옵션
PAD_INDEX 옵션
권장 사항
- Selectivity가 높은 Column에 Index를 생성한다.
- Query에서 자주 사용되는 Column들에 nonclustered index를 만들어
줌으로써 Index covering의 가능성을 높인다.
- Clustered Index는 integer key, unique, non-null 또는 IDENTITY column에
생성하면 좀 더 효과적이다.
- OR 연산에서 참조되는 모든 Column들에 대하여, 유용한 Index가
존재하는지 확인하고 Index를 생성한다.
제목
Performance tuning 원칙
Configuration Parameter
Index
Query Optimization
Performance Tuning Tool
기타 Performance 관련 Topic
Query Optimizer의 기능
가장 효율적인 Query Plan을 결정
Index들이 존재하는지 그리고 유용한지를
확인
어떤 index나 column이 사용될 수 있는지
확인
어떻게 Join을 수행할지를 결정
Cost에 근거한 평가방식을 사용
Column statistics를 생성
Query Plan을 작성
유용한 정보를 사용
Cost-Based Optimization
사용 방식
Optimization Plan의 개수를 제한
Cost는 I/O 와 CPU cost 측면에서 평가
Query Processing Time 을 결정
Physical operator들과 operation의 순서
Parallel processing과 serial processing
Query Optimization 단계
Query 분석
검색과 Join 확인
Index 선택
Index(들) 존재 여부 확인
유용한 Index(들) 수집
Join 선택
Join 전략 평가
Cost 한도 설정
Cost 상한 제한치를 지정
query governor를 사용하여 장시간 수행될 query가
수행되지 못하게 함으로써 시스템 자원이 낭비되는
것을 방지
Connection 제약 지정
sp_configure stored procedure 를 사용
sp_configure 'query governor cost limit', 7200
SET QUERY_GOVERNOR_COST_LIMIT 문을 수행
예: SET QUERY_GOVERNOR_COST_LIMIT 60
Query governor가 동작하지 않도록 하려면 값을 0
으로 설정
Query Plan 정보
sysindexes Table 을 참조
STATISTIC Statements Output 확인
Query Plan 확인
- SET SHOWPLAN_TEXT ON
- SET SHOWPLAN_ALL ON
- Graphical Showplan 확인
sysindexes 테이블
Table & Index 정보를 저장
Index의 타입 (indid)
사용된 Space (dpages, reserved, used)
Fill factor (OrigFillFactor)
각각의 Index에 대하여 Statistics를 저장
Statistics 생성
자동으로 Statistics를 생성해 주는 경우
데이터가 있고 Index가 걸려 있는 Column들
Join 문이나 WHERE절에서 사용되면서
Index가 없는 Column들
직접 Statistics를 생성하는 경우
Index가 없는 Column들
Composite Index의 첫번째 Column이 아닌
모든 Column들
Statistics 갱신
Statistics 갱신 주기
자동 Statistics 갱신
수동 Statistics 갱신
데이터가 Table에 저장되기 전에 Index를
생성한 경우
Table의 데이터를 truncate한 경우
데이터가 아주 조금 있거나 없었던 Table에
많은 수의 row들을 추가하고, 즉시 그 Table에
대하여 query를 수행하고자 하는 경우
권장 사항
- Query Governor를 사용하여 장시간 수행되는 query가
수행되어 시스템 자원을 낭비하지 않도록 한다.
- 데이터와 사용자들이 데이터를 액세스하는 방식을 완전히
이해한다.
- SQL Server가 자동으로 Statistics를 생성하고 수정하도록
한다
- Query Optimizer에 도움이 될 만한 Column들에 직접
Statistics를 생성해 준다.
- Query Plan을 확인하고, Index를 효율적으로 사용하도록
Index와 query tuning 작업을 지속적으로 수행한다.
차례
Performance tuning 원칙
Configuration Parameter
Index
Query Optimization
Performance Tuning Tool
기타 Performance 관련 Topic
Tuning Tool 활용
SQL Profiler 와 Index Tuning Wizard를 주기적으로
연동 활용
SQL Server Performance Monitor 활용
Bottleneck 감지
주요 counter들
· (Physical or Logical) Disk Queue > 2
·
·
·
·
System: Processor Queue Length > 2 (per CPU)
Memory:Pages/sec > 0, Memory:Page Reads/sec > 5
Memory: Pages Faults/sec > 0
Processor:%Processor Time > 95
Query Analyzer
Statistics I/O
Graphical showplan
차례
Performance tuning 원칙
Configuration Parameter
Index
Query Optimization
Performance Tuning Tool
기타 Performance 관련 Topic
기타 Issue
Deadlocking
Blocking
Normalization
Subquery
Cursor
View
Trigger