select top 10 * from orders where orderid not in (select top 10 orderid from orders order by orderid asc) select top 10 * from dbo.orders o where not exists (select * from (select top 10 orderid from dbo.orders order by orderid asc) dv where dv.orderid = o.orderid ) select * from dbo.orders o join (select top 10 orderid from (select top 840 orderid from dbo.orders order by orderid asc) dv order by orderid desc) dv on o.orderid = dv.orderid select top 10 * from dbo.orders where orderid > (select max(orderid) from (select top 10 orderid from dbo.orders SQL Server 2000 SQL Server 2000 실실 실실 실실 실실 실실 실실 김김김 김김김 Microsoft SQL Server MVP Microsoft SQL Server MVP [email protected][email protected]SQL Server SQL Server 김김 김김 김김 김김 김김 김김 SDS MultiCampus SDS MultiCampus 김김김김 김김김김 www.sdscampus.co.kr www.sdscampus.co.kr
SQL Server 2000 실행 계획 읽기 김정선 Microsoft SQL Server MVP [email protected] SQL Server 기술 지원 삼성 SDS MultiCampus 전임강사 www.sdscampus.co.kr. select top 10 * from orders where orderid not in (select top 10 orderid from ordersorder by orderid asc) select top 10 * from dbo.orders o - PowerPoint PPT Presentation
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
select top 10 *from orderswhere orderid not in (select top 10 orderid from orders
order by orderid asc)
select top 10 *from dbo.orders owhere not exists (select * from (select top 10 orderid from dbo.orders order by orderid asc) dv where dv.orderid = o.orderid )
select * from dbo.orders o join (select top 10 orderid from (select top 840 orderid from dbo.orders order by orderid asc) dv order by orderid desc) dvon o.orderid = dv.orderid
select top 10 *from dbo.orderswhere orderid > (select max(orderid)
from (select top 10 orderid from dbo.orders
order by orderid asc) dv)
SQL Server 2000SQL Server 2000실행 계획 읽기실행 계획 읽기
김정선김정선Microsoft SQL Server MVPMicrosoft SQL Server [email protected]@unitel.co.kr
SQL Server SQL Server 기술 지원기술 지원삼성삼성 SDS MultiCampus SDS MultiCampus 전임강사전임강사www.sdscampus.co.krwww.sdscampus.co.kr
2
목표목표
SQL Server 2000SQL Server 2000 의 의 Query Query 실행 계획 이해실행 계획 이해 SQL Server SQL Server 집합 및 관계 연산에 대한 이해집합 및 관계 연산에 대한 이해 쿼리 분석 및 최적화 기본 접근 방법으로 활용쿼리 분석 및 최적화 기본 접근 방법으로 활용 비용 기반 최적화 기본 개념 이해비용 기반 최적화 기본 개념 이해
3
목차목차
실행 계획 소개실행 계획 소개 실행 계획 읽기실행 계획 읽기 Non-SARG (Non-SARG ( 비 검색인수비 검색인수 ) ) 사례 분석사례 분석
4
다루지 않는 내용들다루지 않는 내용들
기본적인 연산자들만 다룸기본적인 연산자들만 다룸 병렬 계획병렬 계획 , , 커서커서 , , 등은 제외등은 제외
튜닝이 목적은 아님튜닝이 목적은 아님 접근 방법에 대한 소개가 목적접근 방법에 대한 소개가 목적
예제 예제 DBDB NorthwindNorthwind
Clustered Index Clustered Index 기반 기반 PKPK 와 기타 인덱스를 보유와 기타 인덱스를 보유 EPlanEPlan
Clustered Index Clustered Index 기반 기반 PKPK 만 보유만 보유 EPlanHeapEPlanHeap
Nonclustered Index Nonclustered Index 기반 기반 PKPK 만 보유만 보유 TempTemp
INSERT, UPDATE, DELETE INSERT, UPDATE, DELETE 예제용으로 예제용으로 Demo Demo 에서 직접 생성에서 직접 생성
5
대상 및 선수 지식대상 및 선수 지식
MOC 2073 MOC 2073 과정 이수자과정 이수자 , , “Programming(Implementing)“Programming(Implementing) a Microsoft SQL a Microsoft SQL Server 2000 Database”Server 2000 Database”
현업 개발자 및 관리자현업 개발자 및 관리자 실행 계획 읽기에 관심 있는 개발자실행 계획 읽기에 관심 있는 개발자 쿼리 분석 및 최적화에 관심 있는 개발자쿼리 분석 및 최적화에 관심 있는 개발자
확인확인 . . 실행 계획 읽기에 대한 학습 경험이 없다실행 계획 읽기에 대한 학습 경험이 없다 ?? 없다면없다면 , , 인덱스에 대한 학습 경험이 없다인덱스에 대한 학습 경험이 없다 ??
6
Module 1. Module 1. 실행 계획 소개실행 계획 소개
현실 세계 실행 계획현실 세계 실행 계획 통계 정보통계 정보 비용 기반 비용 기반 Query OptimizerQuery Optimizer 실행 계획 소개실행 계획 소개 인덱스 복습인덱스 복습 PAGE I/O PAGE I/O 읽기읽기
교통편교통편 Index Seek, Index Scan, Table ScanIndex Seek, Index Scan, Table Scan
시간시간 쿼리 실행 시간 쿼리 실행 시간 (( 구문 분석구문 분석 , , 컴파일컴파일 , , 실행실행 )) 응답 시간응답 시간
비용비용 시스템 자원 사용량시스템 자원 사용량 CPU, IO, Memory(Cache), Network CPU, IO, Memory(Cache), Network 등등
9
우리가 할 일우리가 할 일
충분한 인프라와 교통편 제공충분한 인프라와 교통편 제공 자전거로 자전거로 11 시간 내에 도착하기를 바란다시간 내에 도착하기를 바란다 ??
충분한 비용 제공충분한 비용 제공 20,000 20,000 원 짜리 비행기원 짜리 비행기 ??
정확한 정보 제공 정확한 정보 제공 (( 통계 정보통계 정보 )) 거리가 얼마인가거리가 얼마인가 ?? 각 교통편의 비용은 얼마인가각 교통편의 비용은 얼마인가 ??
결과 확인 및 조정결과 확인 및 조정 Query Optimizer Query Optimizer 의 선택은 무엇인가의 선택은 무엇인가 ?? 그 선택은 적절한가그 선택은 적절한가 ??
10
통계 정보통계 정보
통계정보 통계정보 (Statistics)(Statistics) 칼럼 값에 대한 분포 단계칼럼 값에 대한 분포 단계 및 기타 정보 등으로 구성및 기타 정보 등으로 구성 컬럼 값 전체나 또는 샘플링으로 처리컬럼 값 전체나 또는 샘플링으로 처리 sysindexes.statblob sysindexes.statblob (image (image 타입타입 )) 에 저장 에 저장
쿼리 최적화에 사용되는 가장 중요한 기초 정보쿼리 최적화에 사용되는 가장 중요한 기초 정보 배포 통계 표시배포 통계 표시
인덱스 칼럼인덱스 칼럼 SARG SARG 대상 칼럼 대상 칼럼 (WHERE (WHERE 절절 , JOIN , JOIN 절절 ))
수동 생성 가능수동 생성 가능
11
Query OptimizerQuery Optimizer
목적목적 최적 실행 계획을 생성최적 실행 계획을 생성 통계 정보의 자동 생성 및 업데이트통계 정보의 자동 생성 및 업데이트
내용내용 각 테이블에서 어떤 인덱스를 사용할 것인가각 테이블에서 어떤 인덱스를 사용할 것인가 ?? 어떤 조인 전략과 조인 순서를 사용할 것인가어떤 조인 전략과 조인 순서를 사용할 것인가 ?? 내부 정렬을 수행할 것인가내부 정렬을 수행할 것인가 ?? 중간 결과 집합을 저장하기 위해서 내부 작업테이블중간 결과 집합을 저장하기 위해서 내부 작업테이블 (worktable)(worktable)
를 생성할 것인가를 생성할 것인가 ?? 다중 프로세스상에서 쿼리를 실행할 것인가다중 프로세스상에서 쿼리를 실행할 것인가 ??
12
비용 기반 최적화비용 기반 최적화
비용 비용 = I/O = I/O 와 와 CPU CPU 비용비용 최적화 방법최적화 방법
가능한 실행 계획들의 예측 비용을 평가가능한 실행 계획들의 예측 비용을 평가 가장 적은 예측 비용을 선택가장 적은 예측 비용을 선택
비용 예측 정확도 비용 예측 정확도 = = 통계정보 정확도통계정보 정확도 I/O I/O 와 와 CPU CPU 자원 사용을 최소화자원 사용을 최소화
반환되는 행 수의 최소화반환되는 행 수의 최소화 페이지 읽기 수의 최소화페이지 읽기 수의 최소화 물리적 연산자 종류물리적 연산자 종류 연산 순서연산 순서
13
실행 계획 소개실행 계획 소개
실행 계획 소개실행 계획 소개 실행 계획 종류실행 계획 종류 실행 계획 출력 방법실행 계획 출력 방법 그래픽 실행 계획 읽기그래픽 실행 계획 읽기 Connection Option Connection Option 보기보기 Profiler Profiler 보기보기
14
실행 계획을 보세요실행 계획을 보세요……
일반적인 질문들일반적인 질문들
subquery subquery 가 빠른지가 빠른지… … join join 이 빠른지이 빠른지… … 어떤 경우에 그런가요어떤 경우에 그런가요 ??무슨 차이 때문에 그런가요무슨 차이 때문에 그런가요 ? ? 그럼그럼 , , 수고하세요수고하세요subquery subquery 가 빠른지가 빠른지… … join join 이 빠른지이 빠른지… … 어떤 경우에 그런가요어떤 경우에 그런가요 ??무슨 차이 때문에 그런가요무슨 차이 때문에 그런가요 ? ? 그럼그럼 , , 수고하세요수고하세요
조건 식에서 조건 식에서 between between 과 과 in in 절 중 어느 쪽이 더 나은가요절 중 어느 쪽이 더 나은가요 ??조건 식에서 조건 식에서 between between 과 과 in in 절 중 어느 쪽이 더 나은가요절 중 어느 쪽이 더 나은가요 ??
왜 왜 FROM FROM 절에 조인과 절에 조인과 WHERE WHERE 절 조인의 결과가 다른가요절 조인의 결과가 다른가요 ??왜 왜 FROM FROM 절에 조인과 절에 조인과 WHERE WHERE 절 조인의 결과가 다른가요절 조인의 결과가 다른가요 ??
파생 테이블파생 테이블 (derive table, inline view) (derive table, inline view) 를 사용하면 성능이 향상되나요를 사용하면 성능이 향상되나요 ??파생 테이블파생 테이블 (derive table, inline view) (derive table, inline view) 를 사용하면 성능이 향상되나요를 사용하면 성능이 향상되나요 ??
2 2 개의 쿼리 중에 어느 것이 더 빠르고 자원을 적게 먹으면서 수행되는지 개의 쿼리 중에 어느 것이 더 빠르고 자원을 적게 먹으면서 수행되는지 비교하고 싶습니다비교하고 싶습니다 . . 어떤 방법이 좋을까요어떤 방법이 좋을까요 ??2 2 개의 쿼리 중에 어느 것이 더 빠르고 자원을 적게 먹으면서 수행되는지 개의 쿼리 중에 어느 것이 더 빠르고 자원을 적게 먹으면서 수행되는지 비교하고 싶습니다비교하고 싶습니다 . . 어떤 방법이 좋을까요어떤 방법이 좋을까요 ??
FROM FROM 절에 작성한 테이블의 위치가 성능에 영향을 주나요절에 작성한 테이블의 위치가 성능에 영향을 주나요 ??FROM FROM 절에 작성한 테이블의 위치가 성능에 영향을 주나요절에 작성한 테이블의 위치가 성능에 영향을 주나요 ??
조건 식에 상수를 사용한 경우와 변수를 사용한 경우에 왜 성능에 차이가 있나요조건 식에 상수를 사용한 경우와 변수를 사용한 경우에 왜 성능에 차이가 있나요 ??조건 식에 상수를 사용한 경우와 변수를 사용한 경우에 왜 성능에 차이가 있나요조건 식에 상수를 사용한 경우와 변수를 사용한 경우에 왜 성능에 차이가 있나요 ??
ORDER BY ORDER BY 절을 사용하지 않아도 정렬이 되게 할 수 없나요절을 사용하지 않아도 정렬이 되게 할 수 없나요 ??ORDER BY ORDER BY 절을 사용하지 않아도 정렬이 되게 할 수 없나요절을 사용하지 않아도 정렬이 되게 할 수 없나요 ??
COUNT(*) COUNT(*) 를 사용하는데 인덱스를 만들면 성능 향상이 되나요를 사용하는데 인덱스를 만들면 성능 향상이 되나요 ??COUNT(*) COUNT(*) 를 사용하는데 인덱스를 만들면 성능 향상이 되나요를 사용하는데 인덱스를 만들면 성능 향상이 되나요 ??
15
실행 계획 소개실행 계획 소개
실행 계획실행 계획 (Execution Plan) (Execution Plan) 또는 또는 쿼리 계획쿼리 계획 (Query Plan) (Query Plan) 이라고 언급이라고 언급
SQL Server SQL Server 쿼리 처리 방법에 대한 출력쿼리 처리 방법에 대한 출력 각각의 각각의 논리적 연산자논리적 연산자 및 및 물리적 연산자물리적 연산자 연산 순서연산 순서 예측 및 실제 예측 및 실제 비용비용 ((CPU, I/O, CPU, I/O, 메모리메모리 , , 등등 ))
Query OptimizerQuery Optimizer 의 최종 산출물의 최종 산출물 Hint Hint 를 통한 강제 지정이 가능를 통한 강제 지정이 가능
16
실행 계획 읽기의 목적실행 계획 읽기의 목적
쿼리 처리 방법 확인 쿼리 처리 방법 확인 쿼리 분석쿼리 분석 , , 최적화 그리고 튜닝 기초 자료최적화 그리고 튜닝 기초 자료
연산자연산자 , , 연산 순서 및 비용 확인연산 순서 및 비용 확인 Query Optimizer Query Optimizer 실행 계획의 타당성 검증실행 계획의 타당성 검증 DB, Table, Index, StatisticsDB, Table, Index, Statistics 등의 튜닝등의 튜닝 보다 나은 실행 계획을 위한 쿼리 최적화보다 나은 실행 계획을 위한 쿼리 최적화 필요할 경우 실행 계획 조정필요할 경우 실행 계획 조정
R-DBMS, Query Optimizer R-DBMS, Query Optimizer 에 대한 이해에 도움에 대한 이해에 도움 ““Reading showplan output Reading showplan output is as muchis as much an art an art as it isas it is a science a science””, ,
by Kalen Delaneyby Kalen Delaney
17
실행 계획의 종류실행 계획의 종류
예상 실행 계획예상 실행 계획 쿼리를 실행하지 않고쿼리를 실행하지 않고 , , 예상 실행 계획 표시예상 실행 계획 표시 통계 정보에 기반통계 정보에 기반 , , 예상 값만을 출력예상 값만을 출력
실제 실행 계획과 차이실제 실행 계획과 차이 DemoDemo, , ““ 변수를 사용한 경우 왜 달라지나요변수를 사용한 경우 왜 달라지나요 ?”?”
쿼리 실행에 따른 부하가 없다쿼리 실행에 따른 부하가 없다 실행 계획실행 계획
쿼리 실행과 함께쿼리 실행과 함께 , , 실행 시점의 실행 계획 표시실행 시점의 실행 계획 표시 보다 정확한 실행 계획 출력보다 정확한 실행 계획 출력 쿼리 실행에 따른 부하가 있다쿼리 실행에 따른 부하가 있다
비교비교 예상 실행 계획에서 볼 수 있는 내용예상 실행 계획에서 볼 수 있는 내용
FASTFIRSTROW, (FAST n) FASTFIRSTROW, (FAST n) 힌트힌트 , SET , SET 문문 , etc…, etc… 실행 계획에서 볼 수 있는 내용실행 계획에서 볼 수 있는 내용
임시 테이블을 포함한 저장 프로시저임시 테이블을 포함한 저장 프로시저 , etc…, etc…
18
실행 계획의 출력 방법실행 계획의 출력 방법
쿼리 분석기의 그래픽 실행 계획쿼리 분석기의 그래픽 실행 계획 Connection(Session) OptionConnection(Session) Option 프로필러프로필러 (Profiler)(Profiler)
19
그래픽 실행 계획 보기그래픽 실행 계획 보기
쿼리 메뉴쿼리 메뉴 예상 실행 계획표시 예상 실행 계획표시 (Ctrl-L)(Ctrl-L)
SET SHOWPLAN_TEXT OFFSET SHOWPLAN_TEXT OFF SET SHOWPLAN_ALL ON/OFFSET SHOWPLAN_ALL ON/OFF 메뉴 실행 시 출력메뉴 실행 시 출력
실행 계획 표시 실행 계획 표시 (Ctrl-K)(Ctrl-K) SET STATISTICS PROFILE ON/OFFSET STATISTICS PROFILE ON/OFF 메뉴 실행 시 활성화메뉴 실행 시 활성화 , , 쿼리 실행 시 출력쿼리 실행 시 출력
20
그래픽 실행계획 출력 요소그래픽 실행계획 출력 요소
쿼리 비용쿼리 비용
쿼리 텍스트쿼리 텍스트
노드노드 (( 부모부모 //자식자식 ))
물리적물리적 // 논리적 논리적 연산자연산자
연산 비용연산 비용
Sequence of Steps
21
물리적물리적 // 논리적 연산자논리적 연산자
쿼리 및 업데이트 실행 방식을 설명쿼리 및 업데이트 실행 방식을 설명 물리적 연산자물리적 연산자
물리적 구현 알고리즘물리적 구현 알고리즘Clustered Index SeekClustered Index SeekNested LoopNested Loop JoinJoinStream Aggregate, etcStream Aggregate, etc
논리적 연산자논리적 연산자 관계형 대수 연산관계형 대수 연산 쿼리 자체에 포함된 구문과 연관쿼리 자체에 포함된 구문과 연관
Inner JoinInner JoinAggregate, etcAggregate, etc
참고참고 . . 온라인 설명서온라인 설명서 , , 색인색인 , , 키워드 키워드 - - ““ 실행 계획 표시실행 계획 표시””
22
그래픽 실행계획 출력 읽기그래픽 실행계획 출력 읽기
읽는 순서읽는 순서 위에서 아래로위에서 아래로 , , 오른쪽에서 왼쪽으로오른쪽에서 왼쪽으로
일괄 처리 총 비용 대비 각 쿼리 비용일괄 처리 총 비용 대비 각 쿼리 비용 각 노드는 각 노드는
논리 및 물리 연산자 아이콘을 표시논리 및 물리 연산자 아이콘을 표시 부모 노드와 관련부모 노드와 관련 형제 노드들은 동일한 열에서 생성형제 노드들은 동일한 열에서 생성 , , 화살표를 통한 표시화살표를 통한 표시
트리 구조는 실행되는 명령문의 유형에 의해 결정트리 구조는 실행되는 명령문의 유형에 의해 결정 Transact-SQL Transact-SQL 및 저장 프로시저및 저장 프로시저 DML, DML, 트리거트리거 관계 연산자관계 연산자 DECLARE CURSORDECLARE CURSOR
23
그래픽 실행 계획 도구 설명 정보그래픽 실행 계획 도구 설명 정보
물리적 연산자 물리적 연산자 ** 물리 연산자물리 연산자 , Stream Aggregate, Nested Loop Join, etc, Stream Aggregate, Nested Loop Join, etc
논리적 연산자논리적 연산자 물리 연산자에 해당하는 논리 연산자물리 연산자에 해당하는 논리 연산자 , , 서로 다를 경우 서로 다를 경우 (( / / ) ) 로 구분로 구분
행 개수행 개수 연산자에 의해 출력된 행 수연산자에 의해 출력된 행 수
예상 행 크기예상 행 크기 연산자에 의해 출력된 예상 행 크기연산자에 의해 출력된 예상 행 크기
I/O I/O 비용비용 연산자에 대한 모든 연산자에 대한 모든 I/O I/O 작업의 예상 비용작업의 예상 비용
CPU CPU 비용비용 연산자에 대한 연산자에 대한 CPU CPU 작업의 예상 비용작업의 예상 비용
실행 횟수실행 횟수 쿼리 중 연산이 실행되는 횟수쿼리 중 연산이 실행되는 횟수
연산 실행에 대한 연산 실행에 대한 Query OptimizerQuery Optimizer 의 비용 의 비용 (( 쿼리 총 비용에 대한 쿼리 총 비용에 대한 비율비율 ))
하위 트리 비용하위 트리 비용 이 연산 및 모든 자식 연산들에 대한 누적 비용이 연산 및 모든 자식 연산들에 대한 누적 비용
인수인수 쿼리 에서 사용하는 조건자와 매개변수 쿼리 에서 사용하는 조건자와 매개변수 (Argument)(Argument)
비용비용
* * 빨간색빨간색으로 표시된으로 표시된 물리적 연산자 물리적 연산자는는 Query OptimizerQuery Optimizer 에 의해서 에 의해서 손실된 열 통계손실된 열 통계 또는 또는 손실된 조인 조건자 손실된 조인 조건자 와 같은 경고를 발생했음을 나타냄와 같은 경고를 발생했음을 나타냄 . (. ( 개별 주제로 소개됨개별 주제로 소개됨 ))
24
실행 계획 비용실행 계획 비용
‘‘ 문서화되지 않은문서화되지 않은 정보정보’’ 실제 실제 I/O I/O 양이나 양이나 CPU CPU 사이클은 아님사이클은 아님
별도의 도구를 사용별도의 도구를 사용 내부 비용 알고리즘에 의해 책정된 값 내부 비용 알고리즘에 의해 책정된 값 예측 쿼리 비용이며예측 쿼리 비용이며 , , 실제 실행 시간으로 변환되지 실제 실행 시간으로 변환되지
않는다않는다 OptimizerOptimizer 의 판단 근거를 알 수 있는 기초 자료의 판단 근거를 알 수 있는 기초 자료
쿼리 비용의 크기를 체감하기 위한 방법으로 유용쿼리 비용의 크기를 체감하기 위한 방법으로 유용SQL Server MagazineSQL Server Magazine, , by Brian Moranby Brian Moran
추가 자료추가 자료 참조참조 SQL Server Quantitative Performance AnalysisSQL Server Quantitative Performance Analysis
Joe Chang, Joe Chang, www.sql-server-performance.comwww.sql-server-performance.com
연산자가 사용하는 값에 대해 쉼표로 구분된 목록연산자가 사용하는 값에 대해 쉼표로 구분된 목록 . . 계산된 식계산된 식 (( 예예 , , SELECT SELECT 목록이나 목록이나 WHERE WHERE 절에 있는절에 있는 )) 이나 이 쿼리를 처리하기 이나 이 쿼리를 처리하기 위해 쿼리 프로세스에서 사용한 내부 값 등위해 쿼리 프로세스에서 사용한 내부 값 등
OutputListOutputList 현재 작업에서 예상하고 있는 열에 대한 쉼표로 구분된 목록현재 작업에서 예상하고 있는 열에 대한 쉼표로 구분된 목록
WarningsWarnings 현재 작업과 관련된 경고 메시지에 대한 쉼표로 구분된 목록현재 작업과 관련된 경고 메시지에 대한 쉼표로 구분된 목록
TypeType 노드 유형노드 유형 . . 쿼리의 부모 노드는 유형이 쿼리의 부모 노드는 유형이 T-SQL T-SQL 문 유형문 유형 (( 예예 : SELECT, : SELECT, INSERT, EXECUTE) INSERT, EXECUTE) 등이며등이며 , , 실행 계획을 나타내는 하위 노드에 실행 계획을 나타내는 하위 노드에 대해서는 대해서는 PLAN_ROW PLAN_ROW 유형유형 . . 노드 유형에 따라서 위 출력 내용이 노드 유형에 따라서 위 출력 내용이 달라짐달라짐
ParallelParallel 1 = 1 = 연산자가 병렬로 실행연산자가 병렬로 실행 , 0 = , 0 = 직렬 실행직렬 실행
EstimateExecutionsEstimateExecutions 쿼리를 실행하는 동안 연산자가 실행될 횟수쿼리를 실행하는 동안 연산자가 실행될 횟수
27
프로필러프로필러 (Profiler) (Profiler) 보기보기
이벤트 클래스이벤트 클래스 성능성능
Execution PlanExecution Plan Show Plan AllShow Plan All Show Plan StatisticsShow Plan Statistics Show Plan TextShow Plan Text
데이터 열데이터 열 BinaryDataBinaryData EventClassEventClass IntegerDataIntegerData ObjectIDObjectID TextDataTextData
28
손실된 통계 정보손실된 통계 정보
빨간색으로 표시된빨간색으로 표시된물리적 연산자물리적 연산자
통계 정보가 없는 경우통계 정보가 없는 경우
데이터베이스 옵션데이터베이스 옵션ALTER DATABASE NorthwindALTER DATABASE Northwind
SET AUTO_CREATE_STATISTICS OFFSET AUTO_CREATE_STATISTICS OFF
29
인덱스 복습인덱스 복습
Page Page 구조구조 HeapHeap B-Tree IndexB-Tree Index
Nonclustered IndexNonclustered Index Clustered IndexClustered Index NC Index with CL IndexNC Index with CL Index
Leaf Level = Data Page = Index PageLeaf Level = Data Page = Index Page Data Row Data Row 가 논리적으로 정렬된 구조를 가진다가 논리적으로 정렬된 구조를 가진다 Leaf Level Page Leaf Level Page 에 에 Bookmark Bookmark 값을 포함하지 않는다값을 포함하지 않는다
쿼리 별 쿼리 별 Page I/O Page I/O 읽기읽기SET STATISTICS IO ONSET STATISTICS IO ON
……‘‘Emp' Emp' 테이블테이블 . . 스캔 수스캔 수 1, 1, 논리적 읽기 수논리적 읽기 수 1, 1, 물리적 읽기 수 물리적 읽기 수 0, 0, 미리 읽기 수 미리 읽기 수 0.0.
테이블테이블 // 인덱스 페이지 사용량인덱스 페이지 사용량 검색검색
SELECTSELECT id, indid, id, indid, dpagesdpages, , usedused, root, firstIAM, *, root, firstIAM, * FROM sysindexes FROM sysindexes
idid : object id : object idindidindid : index id (0: Heap, 1: CL Index, 2~250: NC Index or : index id (0: Heap, 1: CL Index, 2~250: NC Index or 통계정보통계정보 , 255: (B)Lob, 255: (B)Lob
데이터 검색 방법데이터 검색 방법 SELECT select_listSELECT select_list WHERE search_conditionWHERE search_condition ORDER BYORDER BY 집계 함수와 집계 함수와 GROUP BY GROUP BY JOINJOIN UNIONUNION DERIVED TABLEDERIVED TABLE SUBQUERYSUBQUERY
38
Table InsertTable Insert
도구 설명도구 설명 입력 행을 지정된 테이블에 삽입입력 행을 지정된 테이블에 삽입
인수인수 적용 개체적용 개체 , OBJECT:(), OBJECT:() 각 열의 설정 값각 열의 설정 값 , SET:(), SET:()
비용 소비자비용 소비자 I/O I/O 집중적집중적
Data PagesData Pages NC Index PagesNC Index Pages PK, UNIQUE PK, UNIQUE 제약조건제약조건 FK FK 제약조건 제약조건
CHECK CHECK 제약조건제약조건
39
도구 설명도구 설명 클러스터된 인덱스에 행을 삽입클러스터된 인덱스에 행을 삽입
인수 인수 적용 개체적용 개체 , OBJECT:(), OBJECT:() 각 열의 설정 값각 열의 설정 값 . SET:(). SET:()
비용 소비자비용 소비자 I/O I/O 집중적집중적
CL Index PagesCL Index Pages NC Index PagesNC Index Pages PK, UNIQUE PK, UNIQUE 제약조건제약조건 FK FK 제약조건제약조건
CHECK CHECK 제약조건제약조건
Clustered Index InsertClustered Index Insert
40
Table UpdateTable Update
도구 설명도구 설명 지정한 테이블의 입력 행을 업데이트지정한 테이블의 입력 행을 업데이트
인수인수 적용 개체적용 개체 , OBJECT:(), OBJECT:() 업데이트 열의 설정 값업데이트 열의 설정 값 . SET:(). SET:()
비용 소비자비용 소비자 I/O I/O 집중적집중적
NC Index PagesNC Index Pages PK, UNIQUE PK, UNIQUE 제약조건제약조건 FK FK 제약조건제약조건
인수인수 적용 개체적용 개체 , OBJECT:(), OBJECT:() 업데이트 열의 설정 값업데이트 열의 설정 값 . SET:(). SET:() 연산자가 정의하는 값연산자가 정의하는 값 , DEFINE:() , DEFINE:() 검색 조건 식검색 조건 식 , WHERE:(), WHERE:()
비용 소비자비용 소비자 I/O I/O 집중적집중적
CL Index PagesCL Index Pages NC Index PagesNC Index Pages PK, UNIQUE PK, UNIQUE 제약조건제약조건 FK FK 제약조건제약조건
CHECK CHECK 제약조건제약조건
42
Table DeleteTable Delete
도구 설명도구 설명 지정한 테이블의 입력 행을 업데이트지정한 테이블의 입력 행을 업데이트
인수인수 적용 개체적용 개체 , OBJECT:(), OBJECT:()
비용 소비자비용 소비자 I/O I/O 집중적집중적
NC Index PagesNC Index Pages PK, UNIQUE PK, UNIQUE 제약조건제약조건 FK FK 제약조건제약조건
WHERE:() WHERE:() 조건자를 별도 처리조건자를 별도 처리 Index SeekIndex Seek Table ScanTable Scan
43
Clustered Index DeleteClustered Index Delete
도구 설명도구 설명 클러스터된 인덱스에서 행 삭제클러스터된 인덱스에서 행 삭제
인수인수 적용 개체적용 개체 , OBJECT:(), OBJECT:() 검색 조건 식검색 조건 식 , WHERE:(), WHERE:()
비용 소비자비용 소비자 I/O I/O 집중적집중적
CL Index PagesCL Index Pages NC Index PagesNC Index Pages PK, UNIQUE PK, UNIQUE 제약조건제약조건 FK FK 제약조건제약조건
44
데이터 검색 방법데이터 검색 방법
Table ScanTable Scan Index Seek/ScanIndex Seek/Scan Bookmark LookupBookmark Lookup Clustered Index Seek/ScanClustered Index Seek/Scan Covering IndexCovering Index
45
Table Scan (Heap)Table Scan (Heap)
도구 설명도구 설명 테이블에서 행을 스캔테이블에서 행을 스캔
인수인수 적용 개체적용 개체 , OBJECT:(), OBJECT:() 검색 조건 식검색 조건 식 , WHERE:(), WHERE:()
비용 소비자비용 소비자 I/O I/O 집중적집중적
논리적 읽기 수 논리적 읽기 수 = Data = Data 페이지 총 수페이지 총 수 CPU CPU 집중적집중적
모든 행모든 행
46
Index Seek (Heap)Index Seek (Heap)
도구 설명도구 설명 클러스터되지 않은 인덱스에서 특정 범위의 클러스터되지 않은 인덱스에서 특정 범위의
행을 행을 검색검색 인수인수
적용 개체적용 개체 , OBJECT:(), OBJECT:() 인덱스 사용 검색 조건 식인덱스 사용 검색 조건 식 , SEEK:(), SEEK:() 검색 조건 식검색 조건 식 , WHERE:(), WHERE:() 출력 순서 유지출력 순서 유지 , ORDERED , ORDERED 절절
비용 소비자비용 소비자 I/O I/O 집중적집중적
논리적 읽기 수 논리적 읽기 수 = Non-Leaf Level = Non-Leaf Level 수 수 + Leaf + Leaf 페이지 수페이지 수 * * **Leaf Leaf 페이지 수 페이지 수 = = 검색 행 수 검색 행 수 / Leaf / Leaf 페이지 당 행 수페이지 당 행 수
CPUCPU 검색 행 수검색 행 수
47
도구 설명도구 설명 클러스터되지 않은 인덱스를 전체 또는 클러스터되지 않은 인덱스를 전체 또는
한 범위만한 범위만 스캔스캔 인수인수
적용 개체적용 개체 , OBJECT:(), OBJECT:() 검색 조건 식검색 조건 식 , WHERE:(), WHERE:() 출력 순서 유지출력 순서 유지 , ORDERED , ORDERED 절절
비용 소비자비용 소비자 I/O I/O 집중적집중적
논리적 읽기 수 논리적 읽기 수 = Non-Leaf Level = Non-Leaf Level 수 수 + Leaf + Leaf 페이지 총 수페이지 총 수 CPU CPU 집중적집중적
검색 행 수검색 행 수
Index ScanIndex Scan
48
Bookmark Lookup (Heap)Bookmark Lookup (Heap)
도구 설명도구 설명 책갈피책갈피 ((RIDRID 또는 클러스터링 키또는 클러스터링 키 )) 를 사용를 사용 , ,
테이블 또는 클러스터된 인덱스의테이블 또는 클러스터된 인덱스의 해당해당행 조회행 조회
인수인수 책갈피책갈피 , BOOKMARK:(), BOOKMARK:() 적용 개체적용 개체 , OBJECT:(), OBJECT:() 미리 읽기 사용미리 읽기 사용 , WITH PREFETCH, WITH PREFETCH
비용 소비자비용 소비자 I/O I/O 집중적집중적
논리적 읽기 수 논리적 읽기 수 = = 행 개수행 개수
49
도구 설명도구 설명 클러스터된 인덱스에서 특정 범위의 클러스터된 인덱스에서 특정 범위의
행을 행을 검색검색 인수인수
적용 개체적용 개체 , OBJECT:(), OBJECT:() 인덱스 사용 검색 조건 식인덱스 사용 검색 조건 식 , SEEK:(), SEEK:() 검색 조건 식검색 조건 식 , WHERE:(), WHERE:() 출력 순서 유지출력 순서 유지 , ORDERED , ORDERED 절절
비용 소비자비용 소비자 I/O I/O 집중적집중적
논리적 읽기 수 논리적 읽기 수 = Non-Leaf Level = Non-Leaf Level 수 수 + Data + Data 페이지 수페이지 수 * * **Data Data 페이지 수 페이지 수 = = 검색 행 수 검색 행 수 / Data / Data 페이지 당 행 수페이지 당 행 수
CPUCPU 검색 행 수검색 행 수
Clustered Index SeekClustered Index Seek
50
도구 설명도구 설명 클러스터된 인덱스를 전체 또는 클러스터된 인덱스를 전체 또는
한 범위를한 범위를 스캔스캔 인수인수
적용 개체적용 개체 , OBJECT:(), OBJECT:() 검색 조건 식검색 조건 식 , WHERE:(), WHERE:() 출력 순서 유지출력 순서 유지 , ORDERED , ORDERED 절절
비용 소비자비용 소비자 I/O I/O 집중적집중적
논리적 읽기 수 논리적 읽기 수 = Non-Leaf Level = Non-Leaf Level 수 수 + Data + Data 페이지 총 수페이지 총 수 CPU CPU 집중적집중적
검색 행 수검색 행 수
Clustered Index Scan Clustered Index Scan
51
도구 설명도구 설명 책갈피책갈피 (RID (RID 또는 또는 클러스터링 키클러스터링 키 )) 를 사용를 사용 , ,
테이블 또는 클러스터된 인덱스의테이블 또는 클러스터된 인덱스의 해당해당행 조회행 조회
인수인수 책갈피책갈피 , BOOKMARK:(), BOOKMARK:() 적용 개체적용 개체 , OBJECT:(), OBJECT:() 미리 읽기 사용미리 읽기 사용 , WITH PREFETCH, WITH PREFETCH
비용 소비자비용 소비자 I/O I/O 집중적집중적
논리적 읽기 수 논리적 읽기 수 = SUM(= SUM( 개별 행 별 개별 행 별 Lookup I/O)Lookup I/O)
Bookmark LookupBookmark Lookup QueryQuery 에서 요구하는 칼럼 들을 반환하는데 에서 요구하는 칼럼 들을 반환하는데 NC IndexNC Index
Leaf Leaf 페이지에 저장된 페이지에 저장된 Data(Key + Bookmark) Data(Key + Bookmark) 만으로 만으로 불충분한 경우에 추가되는 연산자불충분한 경우에 추가되는 연산자
검색 행 수만큼 반복 수행되는 연산검색 행 수만큼 반복 수행되는 연산 가장 가장 IO IO 집중적인 연산 중의 하나집중적인 연산 중의 하나 ↑↑검색 행 수 검색 행 수 = ↑= ↑ 연산 횟수 연산 횟수 = ↓Lookup = ↓Lookup 성능 성능 = ↓NC Index = ↓NC Index 성능성능
53
Bookmark Lookup Bookmark Lookup 정리 정리 - 2- 2
NC Index Seek → Bookmark Lookup I/O NC Index Seek → Bookmark Lookup I/O 계산계산 Heap Heap 기반기반
Covering Index (CL Index)Covering Index (CL Index)
Clustered Index (PK, OrderID), Index (OrderDate)Clustered Index (PK, OrderID), Index (OrderDate)Clustered Index (PK, OrderID), Index (OrderDate)Clustered Index (PK, OrderID), Index (OrderDate)
도구 설명도구 설명 정렬 순서를 기준으로 처음 몇 행 또는 행 비율 정렬 순서를 기준으로 처음 몇 행 또는 행 비율
반환반환 업데이트 계획에서도 행 개수 제한을 위해 사용업데이트 계획에서도 행 개수 제한을 위해 사용
인수인수 TIE TIE 검사 열 목록검사 열 목록 , TIE COLUMNS: (), TIE COLUMNS: ()
비용 소비자비용 소비자 적은 적은 CPU CPU 비용비용
행 개수행 개수
TopTop
61
도구 설명도구 설명 입력을 정렬입력을 정렬 TopN TopN 작업을 위한 특수 연산작업을 위한 특수 연산
인수인수 TOP TOP 개수개수 졍렬될 열 목록졍렬될 열 목록 , ORDER BY: (), ORDER BY: () 졍렬 기준졍렬 기준 , {ASC | DESC}, {ASC | DESC}
비용 소비자비용 소비자 I/O I/O 집중적집중적
페이지 수페이지 수 CPU CPU 집중적집중적
행 개수행 개수
참조참조 . . 독립적인 독립적인 Sort Sort →→ Top Top 연산도 가능연산도 가능
Sort /TopN SortSort /TopN Sort
62
Top vs. SET ROWCOUNTTop vs. SET ROWCOUNT
SELECT TOP 10 OrderDate, OrderIDSELECT TOP 10 OrderDate, OrderIDFROM OrdersFROM OrdersWHERE OrderID > 10248WHERE OrderID > 10248ORDER BY ORDER BY OrderIDOrderID DESC DESC
SELECT TOP 10 OrderDate, OrderIDSELECT TOP 10 OrderDate, OrderIDFROM OrdersFROM OrdersWHERE OrderID > 10248WHERE OrderID > 10248ORDER BY ORDER BY OrderIDOrderID DESC DESC
SET ROWCOUNT 10SET ROWCOUNT 10 SELECT OrderDate, OrderIDSELECT OrderDate, OrderID FROM OrdersFROM Orders WHERE OrderID > 10248WHERE OrderID > 10248 ORDER BY ORDER BY OrderIDOrderID DESC DESCSET ROWCOUNT 0SET ROWCOUNT 0
SET ROWCOUNT 10SET ROWCOUNT 10 SELECT OrderDate, OrderIDSELECT OrderDate, OrderID FROM OrdersFROM Orders WHERE OrderID > 10248WHERE OrderID > 10248 ORDER BY ORDER BY OrderIDOrderID DESC DESCSET ROWCOUNT 0SET ROWCOUNT 0
SET ROWCOUNT 500SET ROWCOUNT 500 SELECT Orderid, Productid, QuantitySELECT Orderid, Productid, Quantity FROM OrderDetailsFROM OrderDetails ORDER BY ORDER BY QuantityQuantity DESC DESCSET ROWCOUNT 0SET ROWCOUNT 0
SELECT TOP 500 Orderid, Productid, QuantitySELECT TOP 500 Orderid, Productid, QuantityFROM OrderDetailsFROM OrderDetailsORDER BY ORDER BY QuantityQuantity DESC DESC
63
WHERE <search_condition>WHERE <search_condition>
WHERE <search_condition>WHERE <search_condition> FilterFilter Auto-ParameterizationAuto-Parameterization BETWEENBETWEEN LIKELIKE EXISTS vs. COUNT(*)EXISTS vs. COUNT(*) NOTNOT AND vs. ORAND vs. OR Index InterchangeIndex Interchange Union IndexUnion Index IN IN 사례사례
64
WHERE <search_condition>WHERE <search_condition>
<search_condition><search_condition> 논리 연산자 논리 연산자 AND, OR AND, OR 및 및 NOTNOT 을 사용을 사용 , , 하나 이상의 조건자를 결합하나 이상의 조건자를 결합 조건자 조건자 (Predicate)(Predicate)
WHERE WHERE 절절 , HAVING , HAVING 절의 검색 조건절의 검색 조건 , FROM , FROM 절의 조인 조건에 절의 조인 조건에 사용사용
TRUE, FALSE TRUE, FALSE 또는 또는 UNKNOWNUNKNOWN 으로 평가되는 식으로 평가되는 식 비교 연산자비교 연산자 , , 논리 연산자논리 연산자 BETWEEN, LIKE, EXISTS, IN, ALL, ANY, BETWEEN, LIKE, EXISTS, IN, ALL, ANY, 등등
관련 실행 계획 연산자관련 실행 계획 연산자 [Clustered] Index Seek/Scan, Table Scan [Clustered] Index Seek/Scan, Table Scan 연산자의 인수 부분연산자의 인수 부분
Pure Ad Hoc Pure Ad Hoc 쿼리에 대한 자동화된 쿼리에 대한 자동화된 Caching Caching 전략 중의 하나전략 중의 하나 Ad Hoc cachingAd Hoc caching Auto parameterizationAuto parameterization
동일한 쿼리 구조동일한 쿼리 구조 , Parameter, Parameter 만 변경되는 경우에 해당만 변경되는 경우에 해당 ParameterParameter 가 될 수 있는 가 될 수 있는 Constants Constants 결정결정 Safe ParameterSafe Parameter 에 대한 에 대한 Parameterized Template Parameterized Template 생성생성 Prepared Plan Prepared Plan 에 해당에 해당
(@1 smallint)(@1 smallint)SELECT[OrderDate]=[OrderDate],[OrderID]=[OrderID] SELECT[OrderDate]=[OrderDate],[OrderID]=[OrderID] FROM [Orders] WHERE [OrderID] = @1FROM [Orders] WHERE [OrderID] = @1
master..syscacheobjectsmaster..syscacheobjects
(@1 smallint)(@1 smallint)SELECT[OrderDate]=[OrderDate],[OrderID]=[OrderID] SELECT[OrderDate]=[OrderDate],[OrderID]=[OrderID] FROM [Orders] WHERE [OrderID] = @1FROM [Orders] WHERE [OrderID] = @1
68
- INDEX (OrderID - INDEX (OrderID ASCASC))- INDEX (OrderID - INDEX (OrderID ASCASC))
BETWEEN BETWEEN
Col1 Col1 BETWEENBETWEEN @1 @1 ANDAND @2 @2
동일동일Col1 Col1 >=>= @1 AND Col1 @1 AND Col1 <=<= @2 @2
저장된 인덱스 키의 정렬 순서저장된 인덱스 키의 정렬 순서 (DESC, ASC)(DESC, ASC) 에 따라 에 따라 조건식 변형조건식 변형
datetime/smalldatetime datetime/smalldatetime 데이터 형 처리 시 주의데이터 형 처리 시 주의
SELECT *SELECT *FROM OrdersFROM OrdersWHERE OrderID BETWEEN 10248 AND 10250WHERE OrderID BETWEEN 10248 AND 10250
SELECT *SELECT *FROM OrdersFROM OrdersWHERE OrderID BETWEEN 10248 AND 10250WHERE OrderID BETWEEN 10248 AND 10250
- INDEX (OrderID - INDEX (OrderID DESCDESC))- INDEX (OrderID - INDEX (OrderID DESCDESC))
69
LIKELIKE
검색 처리 과정검색 처리 과정 인덱스 사용하는 경우인덱스 사용하는 경우
SEEK: (SEEK: ( 검색 범위 제한검색 범위 제한 ) ) WHERE: (like (WHERE: (like (패턴 매칭패턴 매칭 ) )) )
인덱스 사용 않는 경우인덱스 사용 않는 경우 WHERE: (like (WHERE: (like (패턴 매칭패턴 매칭 ) )) )
주의주의 . . Non-SARGNon-SARG 조건식을 패턴 문자로 시작조건식을 패턴 문자로 시작
ex. LIKE ‘%ANAT%’ex. LIKE ‘%ANAT%’ 예외 패턴예외 패턴
ex. LIKE ‘[^QR]%’ex. LIKE ‘[^QR]%’
70
Index (CustomerID)Index (CustomerID)Index (CustomerID)Index (CustomerID)
LIKE LIKE 사례사례
SELECT * FROM OrdersSELECT * FROM OrdersWHERE CustomerID LIKE ‘ANAT%'WHERE CustomerID LIKE ‘ANAT%'
SELECT * FROM OrdersSELECT * FROM OrdersWHERE CustomerID LIKE ‘ANAT%'WHERE CustomerID LIKE ‘ANAT%'
SELECT * FROM Orders SELECT * FROM Orders WHERE CustomerID LIKE ‘ANAT_'WHERE CustomerID LIKE ‘ANAT_'
SELECT * FROM Orders SELECT * FROM Orders WHERE CustomerID LIKE ‘ANAT_'WHERE CustomerID LIKE ‘ANAT_'
SELECT * FROM OrdersSELECT * FROM OrdersWHERE CustomerID LIKE 'WHERE CustomerID LIKE '%%ANAT%'ANAT%'
SELECT * FROM OrdersSELECT * FROM OrdersWHERE CustomerID LIKE 'WHERE CustomerID LIKE '%%ANAT%'ANAT%'
SELECT * FROM Orders SELECT * FROM Orders WHERE CustomerID LIKE '[WHERE CustomerID LIKE '[^̂QR]%'QR]%'
SELECT * FROM Orders SELECT * FROM Orders WHERE CustomerID LIKE '[WHERE CustomerID LIKE '[^̂QR]%'QR]%'
71
Index (Quantity)Index (Quantity)Index (Quantity)Index (Quantity)
EXISTS vs. COUNT(*)EXISTS vs. COUNT(*)
IF IF EXISTS (EXISTS (SELECT * SELECT * FROM Eplan..[Order Details] FROM Eplan..[Order Details] WHERE Quantity > 50WHERE Quantity > 50))
IF IF EXISTS (EXISTS (SELECT * SELECT * FROM Eplan..[Order Details] FROM Eplan..[Order Details] WHERE Quantity > 50WHERE Quantity > 50))
IF (SELECT IF (SELECT COUNT(*)COUNT(*) FROM Eplan..[Order Details] FROM Eplan..[Order Details] WHERE Quantity > 50) WHERE Quantity > 50) > 0> 0
IF (SELECT IF (SELECT COUNT(*)COUNT(*) FROM Eplan..[Order Details] FROM Eplan..[Order Details] WHERE Quantity > 50) WHERE Quantity > 50) > 0> 0
72
NOTNOT
주의해야 할 연산자주의해야 할 연산자 Non-SARGNon-SARG 에서 다룸에서 다룸
73
AND vs. OR AND vs. OR 연산자연산자
동일 쿼리에서 같은 테이블의 다중 인덱스를 사용하기 위한 전략동일 쿼리에서 같은 테이블의 다중 인덱스를 사용하기 위한 전략 AND (Index Interchange)AND (Index Interchange)
검색 칼럼 각각에 대한 유용성을 평가검색 칼럼 각각에 대한 유용성을 평가
WHERE WHERE A = ?A = ? ANDAND B = ?B = ?
- A - A 인덱스 효율적인 경우 사용인덱스 효율적인 경우 사용- B - B 인덱스 효율적인 경우 사용인덱스 효율적인 경우 사용- - 사용된 인덱스 검색 결과를 사용된 인덱스 검색 결과를 JOIN JOIN 으로 교집합 산출으로 교집합 산출- - 비 효율적인 조건은 비 효율적인 조건은 Filter Filter 같은 부가 연산자 적용같은 부가 연산자 적용
OR OR 와 와 ININ 조건 조건 (Union Index, Merge Index)(Union Index, Merge Index)검색 칼럼 모두에 대한 유용성 평가검색 칼럼 모두에 대한 유용성 평가
WHERE WHERE A = ? A = ? OROR B = ? B = ?
- A, B - A, B 인덱스 모두 효율적인 경우에만 사용인덱스 모두 효율적인 경우에만 사용- - 인덱스 검색 결과를 인덱스 검색 결과를 UNIONUNION 으로 합집합 산출 으로 합집합 산출 - - 그렇지 않으면그렇지 않으면 , Scan, Scan
74
Index (CustomerID), Index (OrderDate)Index (CustomerID), Index (OrderDate)Index (CustomerID), Index (OrderDate)Index (CustomerID), Index (OrderDate)
Index InterchangeIndex Interchange
SELECT * FROM dbo.OrdersSELECT * FROM dbo.OrdersWHERE Customerid = 'greal' AND OrderDate = '19980430'WHERE Customerid = 'greal' AND OrderDate = '19980430'
SELECT * FROM dbo.OrdersSELECT * FROM dbo.OrdersWHERE Customerid = 'greal' AND OrderDate = '19980430'WHERE Customerid = 'greal' AND OrderDate = '19980430'
SELECT * FROM dbo.OrdersSELECT * FROM dbo.OrdersWHERE Customerid = 'QUEEN‘ AND OrderDate = '19970107'WHERE Customerid = 'QUEEN‘ AND OrderDate = '19970107'
SELECT * FROM dbo.OrdersSELECT * FROM dbo.OrdersWHERE Customerid = 'QUEEN‘ AND OrderDate = '19970107'WHERE Customerid = 'QUEEN‘ AND OrderDate = '19970107'
33
1111
22
75
Union Index (Merge Index)Union Index (Merge Index)
Index (CustomerID), Index (OrderDate)Index (CustomerID), Index (OrderDate)Index (CustomerID), Index (OrderDate)Index (CustomerID), Index (OrderDate)
SELECT * FROM dbo.OrdersSELECT * FROM dbo.OrdersWHERE Customerid = 'BOLID‘ OR OrderDate = '19970107'WHERE Customerid = 'BOLID‘ OR OrderDate = '19970107'
SELECT * FROM dbo.OrdersSELECT * FROM dbo.OrdersWHERE Customerid = 'BOLID‘ OR OrderDate = '19970107'WHERE Customerid = 'BOLID‘ OR OrderDate = '19970107'
SELECT * FROM dbo.OrdersSELECT * FROM dbo.OrdersWHERE Customerid = 'QUEEN‘ OR OrderDate = '19970107'WHERE Customerid = 'QUEEN‘ OR OrderDate = '19970107'
SELECT * FROM dbo.OrdersSELECT * FROM dbo.OrdersWHERE Customerid = 'QUEEN‘ OR OrderDate = '19970107'WHERE Customerid = 'QUEEN‘ OR OrderDate = '19970107'
33
22
1144
76
IN IN 사례사례
Index (PK, OrderID)Index (PK, OrderID)Index (PK, OrderID)Index (PK, OrderID)
SELECT * FROM EPlanHeap..Orders SELECT * FROM EPlanHeap..Orders WHERE OrderID IN ( 10248, 10249, 10250, WHERE OrderID IN ( 10248, 10249, 10250,
길이 별길이 별 , , 칼럼 개수 별칼럼 개수 별 , , 데이터 타입 별데이터 타입 별 관련 연산자관련 연산자
GROUP BY / DISTINCTGROUP BY / DISTINCT TOPTOP MERGEMERGE
Sort Sort 와 와 IndexIndex Index Index 생성 시 중간 작업생성 시 중간 작업 Leaf Level (or Data Page) Leaf Level (or Data Page) 역할역할 ORDERED {Forward | Backward}ORDERED {Forward | Backward} Composite IndexComposite Index
WHERE WHERE 절과 절과 ORDER BY ORDER BY 절 처리절 처리 두 번째 칼럼부터 정렬 순서 문제두 번째 칼럼부터 정렬 순서 문제
78
집계함수와 집계함수와 GROUP BYGROUP BY
집계 함수집계 함수 COUNT(*) vs. COUNT(expression)COUNT(*) vs. COUNT(expression) GROUP BY GROUP BY ROLLUP and CUBEROLLUP and CUBE
79
집계 함수집계 함수 (( 함수 별 차이함수 별 차이 ))
MIN(), MAX() MIN(), MAX() 함수와 다른 함수의 차이함수와 다른 함수의 차이
SELECT MIN(IndexKey), MAX(IndexKey) SELECT MIN(IndexKey), MAX(IndexKey) vs.vs. UNION UNION 공통 연산자 공통 연산자 TOPTOP Join vs. ConcatenationJoin vs. Concatenation 비용비용 , Compile Time, Auto Caching, Compile Time, Auto Caching 의 차이의 차이
COUNT(*) vs. COUNT(expression)COUNT(*) vs. COUNT(expression)
COUNT(*) COUNT(*) vs. COUNT( [ALL | DISTINCT] vs. COUNT( [ALL | DISTINCT] expressionexpression ) ) vs. with NULLvs. with NULL
81
GROUP BYGROUP BY
AggregateAggregate 성능 이슈성능 이슈
인덱스 사용 여부인덱스 사용 여부 , , 행 그룹 수행 그룹 수 기타기타 , , 기본적인 데이터 성능 고려 기본적인 데이터 성능 고려 (ORDER BY (ORDER BY 참조참조 ))
관련 연산자관련 연산자 Stream AggregateStream Aggregate
비교적 작은 집합이나 미리 정렬된 집합에 사용 권장비교적 작은 집합이나 미리 정렬된 집합에 사용 권장 정렬된 입력정렬된 입력 , , 정렬된 출력정렬된 출력
Hash MatchHash Match 큰 집합에 사용 권장큰 집합에 사용 권장 해시를 작성하면서 집계 계산해시를 작성하면서 집계 계산 , , 높은 높은 CPU CPU 사용률사용률 입력입력 // 출력은 임의 순서출력은 임의 순서
SortSort HAVINGHAVING
Filter Filter 연산자 사용연산자 사용 실행 계획은 실행 계획은 DemoDemo 로 참조 로 참조 (DISTINCT (DISTINCT 에서 다른 예제도 언급됨에서 다른 예제도 언급됨 ))
82
ROLLUP and CUBEROLLUP and CUBE
SELECT orderid, productid, SUM(quantity) AS total_quantitySELECT orderid, productid, SUM(quantity) AS total_quantityFROM [order details]FROM [order details]WHERE orderid < 10250 WHERE orderid < 10250 GROUP BY orderid, productid GROUP BY orderid, productid WITH ROLLUPWITH ROLLUP
SELECT orderid, productid, SUM(quantity) AS total_quantitySELECT orderid, productid, SUM(quantity) AS total_quantityFROM [order details]FROM [order details]WHERE orderid < 10250 WHERE orderid < 10250 GROUP BY orderid, productid GROUP BY orderid, productid WITH ROLLUPWITH ROLLUP
SELECT orderid, productid, SUM(quantity) AS total_quantitySELECT orderid, productid, SUM(quantity) AS total_quantityFROM [order details]FROM [order details]WHERE orderid < 10250WHERE orderid < 10250GROUP BY orderid, productid GROUP BY orderid, productid WITH CUBEWITH CUBE
SELECT orderid, productid, SUM(quantity) AS total_quantitySELECT orderid, productid, SUM(quantity) AS total_quantityFROM [order details]FROM [order details]WHERE orderid < 10250WHERE orderid < 10250GROUP BY orderid, productid GROUP BY orderid, productid WITH CUBEWITH CUBE
83
JOINJOIN
NESTED LOOP JOINNESTED LOOP JOIN HASH JOINHASH JOIN MERGE JOINMERGE JOIN SEMI JOIN and ANTI SEMI JOINSEMI JOIN and ANTI SEMI JOIN T-SQL JOIN vs. ANSI OUTER JOINT-SQL JOIN vs. ANSI OUTER JOIN UNION vs. UNION ALLUNION vs. UNION ALL
84
NESTED LOOP JOINNESTED LOOP JOIN
도구 설명도구 설명 최상위최상위 (( 외부외부 ) ) 입력의 각 행에 대해 입력의 각 행에 대해 최하위최하위 (( 내부내부 ) ) 입력을 스캔하고 일치하는 행을 입력을 스캔하고 일치하는 행을
출력출력 인수인수
조건자조건자 , OUTER REFERENCES() , OUTER REFERENCES() 절절 비용 소비자비용 소비자
I/O I/O 집중적집중적 외부 입력외부 입력
= = 외부 입력 스캔 외부 입력 스캔 I/OI/O 내부 입력 내부 입력
= = 내부 입력 스캔 내부 입력 스캔 I/O x I/O x 스캔 수스캔 수 (( 실행 실행 횟수횟수 ))
CPUCPU 행 개수행 개수
85
NESTED LOOP JOIN NESTED LOOP JOIN 사례 사례 - 1- 1
부모가 내부 입력이 되는 경우 부모가 내부 입력이 되는 경우 (*(* 조건조건 : : 테이블은 항상 고유 식별자를 가진다테이블은 항상 고유 식별자를 가진다 ))
자식이 내부 입력이 되는 경우자식이 내부 입력이 되는 경우 FKFK 가 가 PKPK 의 일부인 경우 의 일부인 경우 - PK- PK 의 선두 칼럼의 선두 칼럼 (( 들들 )) 이 상속된 칼럼인 이 상속된 칼럼인
SELECT *SELECT *FROM EPlan..Orders o FROM EPlan..Orders o INNER JOIN EPlan..Employees eINNER JOIN EPlan..Employees e ON o.EmployeeID = e.EmployeeIDON o.EmployeeID = e.EmployeeID
SELECT *SELECT *FROM EPlan..Orders o FROM EPlan..Orders o INNER JOIN EPlan..Employees eINNER JOIN EPlan..Employees e ON o.EmployeeID = e.EmployeeIDON o.EmployeeID = e.EmployeeID
SELECT *SELECT *FROM EPlan..Orders o FROM EPlan..Orders o INNER JOIN EPlan..Employees eINNER JOIN EPlan..Employees e ON o.EmployeeID = e.EmployeeIDON o.EmployeeID = e.EmployeeIDOPTION (HASH JOIN, FORCE ORDER)OPTION (HASH JOIN, FORCE ORDER)
SELECT *SELECT *FROM EPlan..Orders o FROM EPlan..Orders o INNER JOIN EPlan..Employees eINNER JOIN EPlan..Employees e ON o.EmployeeID = e.EmployeeIDON o.EmployeeID = e.EmployeeIDOPTION (HASH JOIN, FORCE ORDER)OPTION (HASH JOIN, FORCE ORDER)
CPU CPU 비용비용 : 0.0274: 0.0274
CPU CPU 비용비용 : 0.146: 0.146
90
MERGE JOINMERGE JOIN
도구 설명도구 설명 적절하게 정렬된 두 입력 테이블에서 정렬 적절하게 정렬된 두 입력 테이블에서 정렬
SELECT *SELECT *FROM Northwind..Orders o FROM Northwind..Orders o INNER JOIN Northwind..[Order Details] odINNER JOIN Northwind..[Order Details] od ON o.OrderID = od.OrderIDON o.OrderID = od.OrderID
SELECT *SELECT *FROM Northwind..Orders o FROM Northwind..Orders o INNER JOIN Northwind..[Order Details] odINNER JOIN Northwind..[Order Details] od ON o.OrderID = od.OrderIDON o.OrderID = od.OrderID
SELECT *SELECT *FROM Northwind..[Order Details] od FROM Northwind..[Order Details] od INNER MERGE JOIN Northwind..Orders o INNER MERGE JOIN Northwind..Orders o ON o.OrderID = od.OrderIDON o.OrderID = od.OrderID
SELECT *SELECT *FROM Northwind..[Order Details] od FROM Northwind..[Order Details] od INNER MERGE JOIN Northwind..Orders o INNER MERGE JOIN Northwind..Orders o ON o.OrderID = od.OrderIDON o.OrderID = od.OrderID
92
SEMI JOIN and ANTI SEMI JOINSEMI JOIN and ANTI SEMI JOIN
{LEFT | RIGHT} SEMI JOIN{LEFT | RIGHT} SEMI JOIN
{LEFT | RIGHT} ANTI SEMI JOIN{LEFT | RIGHT} ANTI SEMI JOIN
SELECT *SELECT *FROM Northwind..Customers AS c , FROM Northwind..Customers AS c , Northwind..Orders AS oNorthwind..Orders AS oWHERE c.Customerid *= o.CustomeridWHERE c.Customerid *= o.Customerid AND o.OrderDate < '19960706'AND o.OrderDate < '19960706'
SELECT *SELECT *FROM Northwind..Customers AS c , FROM Northwind..Customers AS c , Northwind..Orders AS oNorthwind..Orders AS oWHERE c.Customerid *= o.CustomeridWHERE c.Customerid *= o.Customerid AND o.OrderDate < '19960706'AND o.OrderDate < '19960706'
SELECT *SELECT *FROM Northwind..Customers AS c FROM Northwind..Customers AS c LEFT JOIN Northwind..Orders AS oLEFT JOIN Northwind..Orders AS o ON c.Customerid = o.CustomeridON c.Customerid = o.CustomeridWHEREWHERE o.OrderDate < '19960706'o.OrderDate < '19960706'
SELECT *SELECT *FROM Northwind..Customers AS c FROM Northwind..Customers AS c LEFT JOIN Northwind..Orders AS oLEFT JOIN Northwind..Orders AS o ON c.Customerid = o.CustomeridON c.Customerid = o.CustomeridWHEREWHERE o.OrderDate < '19960706'o.OrderDate < '19960706'
94
UNION UNION
ConcatenationConcatenation 도구 설명도구 설명
출력 테이블을 작성하기 위해 여러 입력 출력 테이블을 작성하기 위해 여러 입력 테이블을 추가테이블을 추가
성능 이슈성능 이슈 행 집합 크기행 집합 크기 DINTINCT DINTINCT 연산자 연산자 (UNION ALL (UNION ALL 로 제거로 제거 ))
관련 연산자관련 연산자 MergeMerge UnionUnion Hash UnionHash Union ConcatenationConcatenation
비용 소비자비용 소비자 물리적 연산자에 따른 비용 발생물리적 연산자에 따른 비용 발생
실행 계획은 실행 계획은 DemoDemo 로 참조로 참조
95
UNION vs. UNION ALLUNION vs. UNION ALL
UNIONUNION
UNION ALLUNION ALL
SELECT firstname, citySELECT firstname, city FROM Northwind..EmployeesFROM Northwind..EmployeesUNIONUNIONSELECT companyname, citySELECT companyname, city FROM Northwind..CustomersFROM Northwind..Customers
SELECT firstname, citySELECT firstname, city FROM Northwind..EmployeesFROM Northwind..EmployeesUNIONUNIONSELECT companyname, citySELECT companyname, city FROM Northwind..CustomersFROM Northwind..Customers
SELECT firstname, citySELECT firstname, city FROM Northwind..EmployeesFROM Northwind..EmployeesUNION ALLUNION ALLSELECT companyname, citySELECT companyname, city FROM Northwind..CustomersFROM Northwind..Customers
SELECT firstname, citySELECT firstname, city FROM Northwind..EmployeesFROM Northwind..EmployeesUNION ALLUNION ALLSELECT companyname, citySELECT companyname, city FROM Northwind..CustomersFROM Northwind..Customers
96
Subquery Subquery 사례사례
사례사례 : : 파생 테이블파생 테이블 (Derived Table)(Derived Table) Subquery Subquery 처리 방법처리 방법 사례사례 : Subqueries for Paging: Subqueries for Paging
97
사례사례 : : 파생 테이블파생 테이블 (Derived Table) – (Derived Table) – 1/21/2 집합 연산 순서의 조정집합 연산 순서의 조정
SELECT c.Companyname, c.Phone, COUNT(*)SELECT c.Companyname, c.Phone, COUNT(*)FROM Northwind..Orders o FROM Northwind..Orders o INNER JOIN Northwind..Customers cINNER JOIN Northwind..Customers c ON o.Customerid = c.CustomeridON o.Customerid = c.CustomeridGROUP BY c.Companyname, c.phoneGROUP BY c.Companyname, c.phone
SELECT c.Companyname, c.Phone, COUNT(*)SELECT c.Companyname, c.Phone, COUNT(*)FROM Northwind..Orders o FROM Northwind..Orders o INNER JOIN Northwind..Customers cINNER JOIN Northwind..Customers c ON o.Customerid = c.CustomeridON o.Customerid = c.CustomeridGROUP BY c.Companyname, c.phoneGROUP BY c.Companyname, c.phone
SELECT c.*SELECT c.*FROM Northwind..Customers AS cFROM Northwind..Customers AS cWHERE Exists ( WHERE Exists ( SELECT *SELECT * FROM Northwind..Orders AS oFROM Northwind..Orders AS o WHERE o.CustomerID = c.CustomerID )WHERE o.CustomerID = c.CustomerID )AND c.CustomerID LIKE 'Q%'AND c.CustomerID LIKE 'Q%'
SELECT c.*SELECT c.*FROM Northwind..Customers AS cFROM Northwind..Customers AS cWHERE Exists ( WHERE Exists ( SELECT *SELECT * FROM Northwind..Orders AS oFROM Northwind..Orders AS o WHERE o.CustomerID = c.CustomerID )WHERE o.CustomerID = c.CustomerID )AND c.CustomerID LIKE 'Q%'AND c.CustomerID LIKE 'Q%'
SELECT OrderID, CustomerIDSELECT OrderID, CustomerIDFROM Northwind..Orders AS oFROM Northwind..Orders AS oWHERE 20 < ( SELECT quantityWHERE 20 < ( SELECT quantity FROM Northwind..[Order Details] AS odFROM Northwind..[Order Details] AS od WHERE o.OrderID = od.OrderIDWHERE o.OrderID = od.OrderID AND od.ProductID = 23 )AND od.ProductID = 23 )
SELECT OrderID, CustomerIDSELECT OrderID, CustomerIDFROM Northwind..Orders AS oFROM Northwind..Orders AS oWHERE 20 < ( SELECT quantityWHERE 20 < ( SELECT quantity FROM Northwind..[Order Details] AS odFROM Northwind..[Order Details] AS od WHERE o.OrderID = od.OrderIDWHERE o.OrderID = od.OrderID AND od.ProductID = 23 )AND od.ProductID = 23 )
100
사례사례 : Subqueries for Paging: Subqueries for Paging
1111 ~ 20~ 20번째 주문 정보 가져오기번째 주문 정보 가져오기 20042004년 초까지 가장 많았던 질문 중의 하나년 초까지 가장 많았던 질문 중의 하나 초창기 가장 많이 사용된 초창기 가장 많이 사용된 Paging Paging 쿼리쿼리 최적화가 아닌 실행 계획 비교가 목적최적화가 아닌 실행 계획 비교가 목적
1.1. Top n & NOT IN Top n & NOT IN (( 질문의 질문의 95%)95%)
2.2. vs. Top n & JOIN vs. Top n & JOIN (2.5%)(2.5%)
3.3. vs. vs. 비교 연산자 비교 연산자 & MAX() & MAX() (2.5%)(2.5%)
4.4. vs. vs. 비교 연산자 비교 연산자 & all& all
101
Demo Demo 코드코드 : Subqueries for Paging: Subqueries for Paging
-- 1. Top n & NOT IN-- 1. Top n & NOT INSELECT TOP 10 *SELECT TOP 10 *FROM Northwind..OrdersFROM Northwind..OrdersWHERE Orderid NOT IN (SELECT TOP 10 Orderid WHERE Orderid NOT IN (SELECT TOP 10 Orderid
FROM Northwind..OrdersFROM Northwind..Orders ORDER BY Orderid ASC)ORDER BY Orderid ASC)
-- 2. Top n & JOIN-- 2. Top n & JOINSELECT * SELECT * FROM Northwind..Orders o FROM Northwind..Orders o INNER JOIN (SELECT TOP 10 Orderid INNER JOIN (SELECT TOP 10 Orderid FROM (SELECT TOP 20 Orderid FROM (SELECT TOP 20 Orderid
FROM Northwind..OrdersFROM Northwind..OrdersORDER BY Orderid ASC) dvORDER BY Orderid ASC) dv
ORDER BY Orderid DESC) dvORDER BY Orderid DESC) dvON o.Orderid = dv.OrderidON o.Orderid = dv.Orderid
ORDER BY o.OrderID ASCORDER BY o.OrderID ASC-- 3. -- 3. 비교 연산자 비교 연산자 & MAX()& MAX()SELECT TOP 10 *SELECT TOP 10 *FROM Northwind..OrdersFROM Northwind..OrdersWHERE Orderid > (SELECT MAX(ORDERID) WHERE Orderid > (SELECT MAX(ORDERID)
FROM (SELECT TOP 10 Orderid FROM (SELECT TOP 10 Orderid FROM Northwind..Orders FROM Northwind..Orders ORDER BY Orderid ASC) DV) ORDER BY Orderid ASC) DV)
-- 4. -- 4. 비교 연산자 비교 연산자 & all& allSELECT TOP 10 *SELECT TOP 10 *FROM Northwind..OrdersFROM Northwind..OrdersWHERE Orderid > all (SELECT TOP 10 Orderid WHERE Orderid > all (SELECT TOP 10 Orderid
FROM Northwind..Orders FROM Northwind..Orders ORDER BY Orderid ASC) ORDER BY Orderid ASC)
-- 1. Top n & NOT IN-- 1. Top n & NOT INSELECT TOP 10 *SELECT TOP 10 *FROM Northwind..OrdersFROM Northwind..OrdersWHERE Orderid NOT IN (SELECT TOP 10 Orderid WHERE Orderid NOT IN (SELECT TOP 10 Orderid
FROM Northwind..OrdersFROM Northwind..Orders ORDER BY Orderid ASC)ORDER BY Orderid ASC)
-- 2. Top n & JOIN-- 2. Top n & JOINSELECT * SELECT * FROM Northwind..Orders o FROM Northwind..Orders o INNER JOIN (SELECT TOP 10 Orderid INNER JOIN (SELECT TOP 10 Orderid FROM (SELECT TOP 20 Orderid FROM (SELECT TOP 20 Orderid
FROM Northwind..OrdersFROM Northwind..OrdersORDER BY Orderid ASC) dvORDER BY Orderid ASC) dv
ORDER BY Orderid DESC) dvORDER BY Orderid DESC) dvON o.Orderid = dv.OrderidON o.Orderid = dv.Orderid
ORDER BY o.OrderID ASCORDER BY o.OrderID ASC-- 3. -- 3. 비교 연산자 비교 연산자 & MAX()& MAX()SELECT TOP 10 *SELECT TOP 10 *FROM Northwind..OrdersFROM Northwind..OrdersWHERE Orderid > (SELECT MAX(ORDERID) WHERE Orderid > (SELECT MAX(ORDERID)
FROM (SELECT TOP 10 Orderid FROM (SELECT TOP 10 Orderid FROM Northwind..Orders FROM Northwind..Orders ORDER BY Orderid ASC) DV) ORDER BY Orderid ASC) DV)
-- 4. -- 4. 비교 연산자 비교 연산자 & all& allSELECT TOP 10 *SELECT TOP 10 *FROM Northwind..OrdersFROM Northwind..OrdersWHERE Orderid > all (SELECT TOP 10 Orderid WHERE Orderid > all (SELECT TOP 10 Orderid
FROM Northwind..Orders FROM Northwind..Orders ORDER BY Orderid ASC) ORDER BY Orderid ASC)
실행 계획은 실행 계획은 DemoDemo 로 확인로 확인실행 계획은 실행 계획은 DemoDemo 로 확인로 확인
102
Module 3. Non-SARG Module 3. Non-SARG 사례 분석사례 분석
이발사의 집합 이야기이발사의 집합 이야기 집합집합 , , 조건 그리고 조건 그리고 SQL SQL 검색 조건검색 조건 SARGabilitySARGability Non-SARG Non-SARG 사례 분석사례 분석 추가 고려 사항추가 고려 사항 SQL Server 2005 SQL Server 2005 에서는에서는……
‘‘ 스스로 면도하지 않는 사람들을 면도해 주는 이발사스스로 면도하지 않는 사람들을 면도해 주는 이발사’’ , , 간판 문구간판 문구
‘‘ 이발사는 스스로 면도한다이발사는 스스로 면도한다 ?’?’
‘‘ 이발사는 스스로 면도하지 않는 사람들의 집합에 원소가 아니다이발사는 스스로 면도하지 않는 사람들의 집합에 원소가 아니다’’
““ 따라서따라서 , , 이발사는 스스로 면도하면 안 된다이발사는 스스로 면도하면 안 된다 !”!”
이야기의 핵심이야기의 핵심““ 집합을 묘사하기 위해 신비로운 말들을 하는 것만으로는 되지 않고집합을 묘사하기 위해 신비로운 말들을 하는 것만으로는 되지 않고 , , 원소 원소 하나 하나에 이런 신비로운 말들이 적용되는 집합을 하나 구성하는 것이 하나 하나에 이런 신비로운 말들이 적용되는 집합을 하나 구성하는 것이 관건관건”” , , 수학자 수학자 Paul R. HalmosPaul R. Halmos
104
집합집합 , , 조건 그리고 조건 그리고 SQL SQL 검색 조건검색 조건
집합집합 어떤 조건에 의해 그 대상을 분명히 알 수 있는 모임어떤 조건에 의해 그 대상을 분명히 알 수 있는 모임
원소원소 집합을 이루는 대상 하나 하나집합을 이루는 대상 하나 하나
집합 조건집합 조건 집합은 원소가 무엇이냐가 아니라 어떤 성질을 갖느냐에 따라 정해진다집합은 원소가 무엇이냐가 아니라 어떤 성질을 갖느냐에 따라 정해진다 그 어떤 성질을 정하는 것이 그 어떤 성질을 정하는 것이 ‘‘조건조건’’
SQL SQL 검색 조건 검색 조건 (Search Condition), (Search Condition), 온라인 설명서 참조온라인 설명서 참조 WHERE, HAVING WHERE, HAVING 절 등에서 행 필터로서 절 등에서 행 필터로서 검색 조건검색 조건을 사용을 사용 조건을 만족시키는 행만 결과 집합조건을 만족시키는 행만 결과 집합 (Resultset)(Resultset) 을 구축을 구축 검색 조건검색 조건 (Search Condition)(Search Condition)
논리 연산자 논리 연산자 AND, OR AND, OR 및 및 NOTNOT 을 사용을 사용 , , 하나 이상의 하나 이상의 조건자조건자를 결합한 것를 결합한 것 조건자조건자 (Predicate)(Predicate)
TRUE, FALSE TRUE, FALSE 또는 또는 UNKNOWNUNKNOWN 으로 평가되는 식으로 평가되는 식
정확한 일치정확한 일치 값의 범위값의 범위 AND AND 연산자로 조인된 결합연산자로 조인된 결합
형식 형식 ((핵심핵심 : : 연산자의 한 쪽에 반드시 칼럼 혼자 나와야 한다 연산자의 한 쪽에 반드시 칼럼 혼자 나와야 한다 ))
Inclusive_OperatorInclusive_Operator =, >, <, =>, =<, BETWEEN, =, >, <, =>, =<, BETWEEN, 제한된 제한된 LIKE LIKE
SARG SARG 목적목적 ““Query OptimizerQuery Optimizer 가 쿼리 분석 단계를 간소화하고가 쿼리 분석 단계를 간소화하고 , , 최적의 실행 계획을 최적의 실행 계획을
산출하는데 기본적으로 필요한 검색 조건 식산출하는데 기본적으로 필요한 검색 조건 식”” , Microsoft, Microsoft ““OptimizerOptimizer 에게 필요한 더 많은 정보를 제공하도록 도와주는 것에게 필요한 더 많은 정보를 제공하도록 도와주는 것”” , Kalen Delaney, Kalen Delaney
Non-SARG (Non-SARG ( 비 검색 인수비 검색 인수 )) 검색을 제한하지 않는 식검색을 제한하지 않는 식
DB DB 스키마 변경스키마 변경 통계 정보 변경 작업의 수행통계 정보 변경 작업의 수행 DDL, DML DDL, DML 혼용혼용 임시 테이블 작업임시 테이블 작업 Connection/Session Connection/Session 옵션옵션
Parameter SniffingParameter Sniffing ParameterParameter 에 따른 실행 계획의 결정에 따른 실행 계획의 결정 ParameterParameter 와 변수의 혼용와 변수의 혼용 다중 조건 처리다중 조건 처리 프로시저 내 동적 쿼리프로시저 내 동적 쿼리 etcetc
116
SQL Server 2005 SQL Server 2005 에서는에서는……
Beta1~2 Beta1~2 기준기준 그래픽 실행 계획에 대한 그래픽 실행 계획에 대한 XML XML 포맷 지원포맷 지원
SET SHOWPLAN_XML ONSET SHOWPLAN_XML ON SET STATISTICS XML ONSET STATISTICS XML ON
Profiler Profiler 이벤트에서의 이벤트에서의 XML XML 포맷 지원포맷 지원 Cached Cached 쿼리에 대한 쿼리 계획 검색쿼리에 대한 쿼리 계획 검색
새로운 새로운 Dynamic Management Views (or Functions)Dynamic Management Views (or Functions) 새로운 실행 계획 연산자새로운 실행 계획 연산자 , , 기존 연산자의 변경기존 연산자의 변경
RID or Key LookupRID or Key Lookup UDX (User Defined Extensions)UDX (User Defined Extensions) Sequence [Project], etcSequence [Project], etc
MicrosoftMicrosoft 웹 캐스트웹 캐스트 , SQL Server 2000, SQL Server 2000 에서 실행 계획 읽기에서 실행 계획 읽기http://support.microsoft.com/default.aspx?scid=kb;KO;815337http://support.microsoft.com/default.aspx?scid=kb;KO;815337
SQL Server Quantitative Performance AnalysisSQL Server Quantitative Performance Analysis