1.19k likes | 1.41k Views
SQL Server 2000 실행 계획 읽기 김정선 Microsoft SQL Server MVP visualdb@unitel.co.kr SQL Server 기술 지원 삼성 SDS MultiCampus 전임강사 www.sdscampus.co.kr. 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
E N D
SQL Server 2000실행 계획 읽기김정선Microsoft SQL Server MVPvisualdb@unitel.co.krSQL Server 기술 지원삼성SDS MultiCampus 전임강사www.sdscampus.co.kr 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 order by orderid asc) dv)
목표 • SQL Server 2000의 Query 실행 계획 이해 • SQL Server 집합 및 관계 연산에 대한 이해 • 쿼리 분석 및 최적화 기본 접근 방법으로 활용 • 비용 기반 최적화 기본 개념 이해
목차 • 실행 계획 소개 • 실행 계획 읽기 • Non-SARG (비 검색인수) 사례 분석
다루지 않는 내용들 • 기본적인 연산자들만 다룸 • 병렬 계획, 커서, 등은 제외 • 튜닝이 목적은 아님 • 접근 방법에 대한 소개가 목적 • 예제 DB • Northwind Clustered Index 기반 PK와 기타 인덱스를 보유 • EPlan Clustered Index 기반 PK만 보유 • EPlanHeap Nonclustered Index 기반 PK만 보유 • Temp • INSERT, UPDATE, DELETE 예제용으로 Demo 에서 직접 생성
대상 및 선수 지식 • MOC 2073 과정 이수자, “Programming(Implementing)a Microsoft SQL Server 2000 Database” • 현업 개발자 및 관리자 • 실행 계획 읽기에 관심 있는 개발자 • 쿼리 분석 및 최적화에 관심 있는 개발자 • 확인. • 실행 계획 읽기에 대한 학습 경험이 없다? • 없다면, 인덱스에 대한 학습 경험이 없다?
Module 1. 실행 계획 소개 • 현실 세계 실행 계획 • 통계 정보 • 비용 기반 Query Optimizer • 실행 계획 소개 • 인덱스 복습 • PAGE I/O 읽기
시간: 1시간 비용: 66,500원 시간: 4.5시간 비용: 37,000원 시간: 5+?시간 비용: 28,200원 시간: ? 시간 비용: ? + 병원비 현실 세계의 실행 계획-1 Query: 서울에서 부산까지 가세요! 실행 계획 Query Optimizer 의 기본 역할
현실 세계의 실행 계획-2 • 교통 인프라 • Clustered Index, Nonclustered Index, Heap • 교통편 • Index Seek, Index Scan, Table Scan • 시간 • 쿼리 실행 시간 (구문 분석, 컴파일, 실행) • 응답 시간 • 비용 • 시스템 자원 사용량 • CPU, IO, Memory(Cache), Network 등
우리가 할 일 • 충분한 인프라와 교통편 제공 • 자전거로 1시간 내에 도착하기를 바란다? • 충분한 비용 제공 • 20,000 원 짜리 비행기? • 정확한 정보 제공 (통계 정보) • 거리가 얼마인가? • 각 교통편의 비용은 얼마인가? • 결과 확인 및 조정 • Query Optimizer 의 선택은 무엇인가? • 그 선택은 적절한가?
통계 정보 • 통계정보 (Statistics) • 칼럼 값에 대한 분포 단계및 기타 정보 등으로 구성 • 컬럼 값 전체나 또는 샘플링으로 처리 • sysindexes.statblob (image 타입)에 저장 • 쿼리 최적화에 사용되는 가장 중요한 기초 정보 • 배포 통계 표시 • DBCC SHOW_STATISTICS(table, target) • 대상 • 자동 생성 • 인덱스 칼럼 • SARG 대상 칼럼 (WHERE 절, JOIN 절) • 수동 생성 가능
Query Optimizer • 목적 • 최적 실행 계획을 생성 • 통계 정보의 자동 생성 및 업데이트 • 내용 • 각 테이블에서 어떤 인덱스를 사용할 것인가? • 어떤 조인 전략과 조인 순서를 사용할 것인가? • 내부 정렬을 수행할 것인가? • 중간 결과 집합을 저장하기 위해서 내부 작업테이블(worktable)를 생성할 것인가? • 다중 프로세스상에서 쿼리를 실행할 것인가?
비용 기반 최적화 • 비용 = I/O 와 CPU 비용 • 최적화 방법 • 가능한 실행 계획들의 예측 비용을 평가 • 가장 적은 예측 비용을 선택 • 비용 예측 정확도 = 통계정보 정확도 • I/O 와 CPU 자원 사용을 최소화 • 반환되는 행 수의 최소화 • 페이지 읽기 수의 최소화 • 물리적 연산자 종류 • 연산 순서
실행 계획 소개 • 실행 계획 소개 • 실행 계획 종류 • 실행 계획 출력 방법 • 그래픽 실행 계획 읽기 • Connection Option 보기 • Profiler 보기
실행 계획을 보세요… • 일반적인 질문들 왜 FROM 절에 조인과 WHERE 절 조인의 결과가 다른가요? 조건 식에서 between 과 in 절 중 어느 쪽이 더 나은가요? 파생 테이블(derive table, inline view) 를 사용하면 성능이 향상되나요? 2 개의 쿼리 중에 어느 것이 더 빠르고 자원을 적게 먹으면서 수행되는지 비교하고 싶습니다. 어떤 방법이 좋을까요? subquery 가 빠른지… join 이 빠른지… 어떤 경우에 그런가요?무슨 차이 때문에 그런가요? 그럼, 수고하세요 FROM 절에 작성한 테이블의 위치가 성능에 영향을 주나요? 조건 식에 상수를 사용한 경우와 변수를 사용한 경우에 왜 성능에 차이가 있나요? ORDER BY 절을 사용하지 않아도 정렬이 되게 할 수 없나요? COUNT(*) 를 사용하는데 인덱스를 만들면 성능 향상이 되나요?
실행 계획 소개 • 실행 계획(Execution Plan) 또는 쿼리 계획(Query Plan) 이라고 언급 • SQL Server 쿼리 처리 방법에 대한 출력 • 각각의 논리적 연산자 및 물리적 연산자 • 연산 순서 • 예측 및 실제 비용(CPU, I/O, 메모리, 등) • Query Optimizer의 최종 산출물 • Hint 를 통한 강제 지정이 가능
실행 계획 읽기의 목적 • 쿼리 처리 방법 확인 • 쿼리 분석, 최적화 그리고 튜닝 기초 자료 • 연산자, 연산 순서 및 비용 확인 • Query Optimizer 실행 계획의 타당성 검증 • DB, Table, Index, Statistics 등의 튜닝 • 보다 나은 실행 계획을 위한 쿼리 최적화 • 필요할 경우 실행 계획 조정 • R-DBMS, Query Optimizer 에 대한 이해에 도움 • “Reading showplan output is as much an art as it is a science”, by Kalen Delaney
실행 계획의 종류 • 예상 실행 계획 • 쿼리를 실행하지 않고, 예상 실행 계획 표시 • 통계 정보에 기반, 예상 값만을 출력 • 실제 실행 계획과 차이 • Demo, “변수를 사용한 경우 왜 달라지나요?” • 쿼리 실행에 따른 부하가 없다 • 실행 계획 • 쿼리 실행과 함께, 실행 시점의 실행 계획 표시 • 보다 정확한 실행 계획 출력 • 쿼리 실행에 따른 부하가 있다 • 비교 • 예상 실행 계획에서 볼 수 있는 내용 • FASTFIRSTROW, (FAST n) 힌트, SET 문, etc… • 실행 계획에서 볼 수 있는 내용 • 임시 테이블을 포함한 저장 프로시저, etc…
실행 계획의 출력 방법 • 쿼리 분석기의 그래픽 실행 계획 • Connection(Session) Option • 프로필러(Profiler)
그래픽 실행 계획 보기 • 쿼리 메뉴 • 예상 실행 계획표시 (Ctrl-L) • SET SHOWPLAN_TEXT OFF • SET SHOWPLAN_ALL ON/OFF • 메뉴 실행 시 출력 • 실행 계획 표시 (Ctrl-K) • SET STATISTICS PROFILE ON/OFF • 메뉴 실행 시 활성화, 쿼리 실행 시 출력
노드(부모/자식) 연산 비용 물리적/논리적 연산자 그래픽 실행계획 출력 요소 쿼리 비용 Sequence of Steps 쿼리 텍스트
물리적/논리적 연산자 • 쿼리 및 업데이트 실행 방식을 설명 • 물리적 연산자 • 물리적 구현 알고리즘Clustered Index SeekNested LoopJoinStream Aggregate, etc • 논리적 연산자 • 관계형 대수 연산 • 쿼리 자체에 포함된 구문과 연관Inner JoinAggregate, etc • 참고. 온라인 설명서, 색인, 키워드 - “실행 계획 표시”
그래픽 실행계획 출력 읽기 • 읽는 순서 • 위에서 아래로, 오른쪽에서 왼쪽으로 • 일괄 처리 총 비용 대비 각 쿼리 비용 • 각 노드는 • 논리 및 물리 연산자 아이콘을 표시 • 부모 노드와 관련 • 형제 노드들은 동일한 열에서 생성, 화살표를 통한 표시 • 트리 구조는 실행되는 명령문의 유형에 의해 결정 • Transact-SQL 및 저장 프로시저 • DML, 트리거 • 관계 연산자 • DECLARE CURSOR
그래픽 실행 계획 도구 설명 정보 물리적 연산자 * 물리 연산자, Stream Aggregate, Nested Loop Join, etc 논리적 연산자 물리 연산자에 해당하는 논리 연산자, 서로 다를 경우 ( / ) 로 구분 행 개수 연산자에 의해 출력된 행 수 예상 행 크기 연산자에 의해 출력된 예상 행 크기 I/O 비용 연산자에 대한 모든 I/O 작업의 예상 비용 CPU 비용 연산자에 대한 CPU 작업의 예상 비용 실행 횟수 쿼리 중 연산이 실행되는 횟수 비용 연산 실행에 대한 Query Optimizer의 비용 (쿼리 총 비용에 대한 비율) 하위 트리 비용 이 연산 및 모든 자식 연산들에 대한 누적 비용 인수 쿼리 에서 사용하는 조건자와 매개변수 (Argument) * 빨간색으로 표시된 물리적 연산자는Query Optimizer에 의해서 손실된 열 통계 또는 손실된 조인 조건자 와 같은 경고를 발생했음을 나타냄. (개별 주제로 소개됨)
실행 계획 비용 • ‘문서화되지 않은정보’ • 실제 I/O 양이나 CPU 사이클은 아님 • 별도의 도구를 사용 • 내부 비용 알고리즘에 의해 책정된 값 • 예측 쿼리 비용이며, 실제 실행 시간으로 변환되지 않는다 • Optimizer의 판단 근거를 알 수 있는 기초 자료 • 쿼리 비용의 크기를 체감하기 위한 방법으로 유용 SQL Server Magazine, by Brian Moran • 추가 자료참조 • SQL Server Quantitative Performance Analysis Joe Chang, www.sql-server-performance.com
Connection Option 보기 • 예상 실행 계획 표시 • SHOWPLAN_ALL ON/OFF • 출력: 실행 계획에 대한 모든 정보 • SHOWPLAN_TEXT ON/OFF • 출력: StmtText 항목(쿼리, 연산자, 인수) • 두 옵션은 배타적으로 사용 • 실행 계획 표시 • SET PROFILE ON/OFF • 출력: SHOWPLAN_ALL 출력+ ROWS, EXECUTES
Connection Option 출력 StmtText Transact-SQL 문의 텍스트, 작업에 대한 설명, 연산자 StmtId 현재 일괄 처리에 있는 명령문의 수 (* 명령문의 ID) NodeID 현재 노드의 ID Parent 부모 노드의 ID PhysicalOp, LogicalOp, Argument DefinedValue 연산자가 사용하는 값에 대해 쉼표로 구분된 목록. 계산된 식(예, SELECT 목록이나 WHERE 절에 있는)이나 이 쿼리를 처리하기 위해 쿼리 프로세스에서 사용한 내부 값 등 EstimateRows, EstimateIO, EstimateCPU AvgRowSize, TotalSubtreeCost OutputList 현재 작업에서 예상하고 있는 열에 대한 쉼표로 구분된 목록 Warnings 현재 작업과 관련된 경고 메시지에 대한 쉼표로 구분된 목록 Type 노드 유형. 쿼리의 부모 노드는 유형이 T-SQL 문 유형(예: SELECT, INSERT, EXECUTE) 등이며, 실행 계획을 나타내는 하위 노드에 대해서는 PLAN_ROW 유형. 노드 유형에 따라서 위 출력 내용이 달라짐 Parallel 1 = 연산자가 병렬로 실행, 0 = 직렬 실행 EstimateExecutions 쿼리를 실행하는 동안 연산자가 실행될 횟수
프로필러(Profiler) 보기 • 이벤트 클래스 • 성능 • Execution Plan • Show Plan All • Show Plan Statistics • Show Plan Text • 데이터 열 • BinaryData • EventClass • IntegerData • ObjectID • TextData
빨간색으로 표시된물리적 연산자 통계 정보가 없는 경우 데이터베이스 옵션 ALTER DATABASE Northwind SET AUTO_CREATE_STATISTICS OFF 손실된 통계 정보
인덱스 복습 • Page 구조 • Heap • B-Tree Index • Nonclustered Index • Clustered Index • NC Index with CL Index • Page I/O 읽기
데이터 저장소 기본 단위 8K 고정 크기 유형 Data Index Text/Image IAM PFS, GAM, SGAM 기타… Extent 테이블과 인덱스의 공간 할당 단위 연속된 8 page 0x1d2 0x122 0x60 Page 구조 Page Header(96 byte) pageId=(1:205), type, objId,… Record #1 Record #2 Record #3 Data Rows Row Offset
CL Index 가 없는 테이블의 Data Page(s) 데이터 행이 저장되는 특정 순서가 없다 연결된 리스트로 연결되어 있지 않다. Heap Heap 1:376 1:377 1:378 1:379 1:380 ….. ….. ….. ….. ….. 10792 2 10911 1 11077 4 10912 11 11077 3 ….. ….. ….. ….. ….. 10742 60 10676 44 10912 29 11077 6 10743 46 … ... ….. ….. ….. ….. ….. 10913 58 11077 7 10742 72 10741 2 10912 29 ….. ….. ….. ….. ….. 10575 72 10575 76 10754 33 10574 40 10742 3 ….. ….. ….. ….. ….. ….. ….. ….. ….. …..
KeyValue Page-Pointer KeyValue Page-Pointer Sorted Bookmark KeyValue B(alanced)-Tree Index ROOT (Level = 2) Non-Leaf Level (Level = 1) Leaf Level (Level = 0) Heap Key1 Key2 Col3 Col4 Col5
Nonclustered Index Non-Leaf Level 1:408 NULL 10913 58 1:410 10743 46 1:412 10575 72 1:413 10417 68 1:414 ….. ….. ROOT KeyValue Bookmark Leaf Level 1:380:022 1:379:002 1:376:001 1:376:003 NULL 10913 58 10743 46 10575 72 … ... 11077 3 1:376:000 10912 11 1:378:000 10742 3 1:380:003 10575 76 1:377:003 11077 4 1:377:000 10912 29 1:377:001 10742 60 1:379:001 10754 33 1:378:003 1:380:000 1:377:002 1:379:003 11077 6 1:378:001 10911 1 10742 72 10574 40 …. …. …. …. …. …. …. …. 1:408 1:410 1:412 1:413 Heap ….. ….. ….. ….. ….. 10792 2 10911 1 11077 4 10912 11 11077 3 ….. ….. ….. ….. ….. 10742 60 10676 44 10912 29 11077 6 10743 46 ….. ….. ….. ….. ….. … ... 10913 58 11077 7 10742 72 10741 2 10912 29 ….. ….. ….. ….. ….. 10575 72 10575 76 10754 33 10574 40 10742 3 ….. ….. ….. ….. ….. ….. ….. ….. ….. ….. 1:376 1:377 1:378 1:379 1:380
1:408 NULL 10913 58 1:410 10743 46 1:412 10575 72 1:413 10417 68 1:414 ….. ….. Leaf Level 1:380:022 1:379:002 1:376:001 1:376:003 NULL 10913 58 10743 46 10575 72 … ... 11077 3 1:376:000 10912 11 1:378:000 10742 3 1:380:003 10575 76 1:377:003 11077 4 1:377:000 10912 29 1:377:001 10742 60 1:379:001 10754 33 1:378:003 1:380:000 1:377:002 1:379:003 11077 6 1:378:001 10911 1 10742 72 10574 40 …. …. …. …. …. …. …. …. 1:408 1:410 1:412 1:413 Data Pages 1:432 ….. ….. ….. ….. ….. NULL 10768 31 10670 46 10981 38 10869 1 11077 2 ….. ….. ….. ….. ….. 10981 38 1:434 10768 60 10676 67 10980 75 10869 11 11077 3 ….. ….. ….. ….. ….. … ... 10869 1 1:435 10768 71 10670 73 10979 7 10869 23 11077 4 ….. ….. ….. ….. ….. 10768 31 1:436 11077 6 10979 12 10869 68 10767 42 10670 75 ….. ….. ….. ….. ….. ….. ….. ….. ….. ….. 10670 46 1:437 ….. ….. 1:432 1:434 1:435 1:436 1:437 Clustered Index Non-Leaf Level • Leaf Level = Data Page = Index Page • Data Row 가 논리적으로 정렬된 구조를 가진다 • Leaf Level Page 에 Bookmark 값을 포함하지 않는다 ROOT
NC Index with CL Index NC Non-Leaf Level (KeyValue = UnitPrice) 1:360 NULL 35.1000 10402 63 1:362 21.5000 10847 71 1:364 …. …. ROOT KeyValue Bookmark Leaf Level 10251 65 16.8000 NULL 10402 63 10847 71 NULL 35.1000 21.5000 … ... 16.8000 10250 65 263.5000 10981 38 35.1000 10376 63 21.5000 10771 71 16.2500 11072 50 263.5000 10964 38 35.1000 10324 63 21.5000 10768 71 …. …. …. …. …. …. …. …. 1:360 1:362 1:364 1:365 CL Non-Leaf Level 1:432 NULL 1:434 10981 38 1:435 10869 1 ….. ….. ROOT Data Pages ….. ….. ….. ….. ….. 10768 31 10670 46 10981 38 10869 1 11077 2 ….. ….. ….. ….. ….. 10768 60 10676 67 10980 75 10869 11 11077 3 … ... ….. ….. ….. ….. ….. 10768 71 10670 73 10979 7 10869 23 11077 4 ….. ….. ….. ….. ….. ….. ….. ….. ….. ….. 1:432 1:434 1:435 1:436 1:437
Page I/O 읽기 • 쿼리 별 Page I/O 읽기 SET STATISTICS IO ON … ‘Emp' 테이블. 스캔 수1, 논리적 읽기 수1, 물리적 읽기 수 0, 미리 읽기 수 0. • 테이블/인덱스 페이지 사용량검색 SELECTid, indid, dpages, used, root, firstIAM, * FROM sysindexes id : object idindid : index id (0: Heap, 1: CL Index, 2~250: NC Index or 통계정보, 255: (B)Lobdpages : 1) indid (0, 1): data pages, 2) indid (2~250): leaf level pagesused : 1) indid (0, 1): table pages, 2) indid (2~250): index pages
Module 2. 실행 계획 읽기 • INSERT, UPDATE, DELETE • SELECT • 데이터 검색 방법 • SELECT select_list • WHERE search_condition • ORDER BY • 집계 함수와 GROUP BY • JOIN • UNION • DERIVED TABLE • SUBQUERY
도구 설명 입력 행을 지정된 테이블에 삽입 인수 적용 개체, OBJECT:() 각 열의 설정 값, SET:() 비용 소비자 I/O 집중적 Data Pages NC Index Pages PK, UNIQUE 제약조건 FK 제약조건 CHECK 제약조건 Table Insert
Clustered Index Insert • 도구 설명 • 클러스터된 인덱스에 행을 삽입 • 인수 • 적용 개체, OBJECT:() • 각 열의 설정 값. SET:() • 비용 소비자 • I/O 집중적 • CL Index Pages • NC Index Pages • PK, UNIQUE 제약조건 • FK 제약조건 • CHECK 제약조건
Table Update • 도구 설명 • 지정한 테이블의 입력 행을 업데이트 • 인수 • 적용 개체, OBJECT:() • 업데이트 열의 설정 값. SET:() • 비용 소비자 • I/O 집중적 • NC Index Pages • PK, UNIQUE 제약조건 • FK 제약조건 • CHECK 제약조건 • DEFINE:(), WHERE:() 조건자를 별도 처리 • Index Seek • Table Scan
Clustered Index Update • 도구 설명 • 클러스터된 인덱스에 행을 업데이트 • 인수 • 적용 개체, OBJECT:() • 업데이트 열의 설정 값. SET:() • 연산자가 정의하는 값, DEFINE:() • 검색 조건 식, WHERE:() • 비용 소비자 • I/O 집중적 • CL Index Pages • NC Index Pages • PK, UNIQUE 제약조건 • FK 제약조건 • CHECK 제약조건
Table Delete • 도구 설명 • 지정한 테이블의 입력 행을 업데이트 • 인수 • 적용 개체, OBJECT:() • 비용 소비자 • I/O 집중적 • NC Index Pages • PK, UNIQUE 제약조건 • FK 제약조건 • WHERE:() 조건자를 별도 처리 • Index Seek • Table Scan
Clustered Index Delete • 도구 설명 • 클러스터된 인덱스에서 행 삭제 • 인수 • 적용 개체, OBJECT:() • 검색 조건 식, WHERE:() • 비용 소비자 • I/O 집중적 • CL Index Pages • NC Index Pages • PK, UNIQUE 제약조건 • FK 제약조건
데이터 검색 방법 • Table Scan • Index Seek/Scan • Bookmark Lookup • Clustered Index Seek/Scan • Covering Index
Table Scan (Heap) • 도구 설명 • 테이블에서 행을 스캔 • 인수 • 적용 개체, OBJECT:() • 검색 조건 식, WHERE:() • 비용 소비자 • I/O 집중적 • 논리적 읽기 수 = Data 페이지 총 수 • CPU 집중적 • 모든 행
Index Seek (Heap) • 도구 설명 • 클러스터되지 않은 인덱스에서 특정 범위의 행을 검색 • 인수 • 적용 개체, OBJECT:() • 인덱스 사용 검색 조건 식, SEEK:() • 검색 조건 식, WHERE:() • 출력 순서 유지, ORDERED 절 • 비용 소비자 • I/O 집중적 • 논리적 읽기 수 = Non-Leaf Level 수 + Leaf 페이지 수* *Leaf 페이지 수 = 검색 행 수 / Leaf 페이지 당 행 수 • CPU • 검색 행 수
Index Scan • 도구 설명 • 클러스터되지 않은 인덱스를 전체 또는 한 범위만스캔 • 인수 • 적용 개체, OBJECT:() • 검색 조건 식, WHERE:() • 출력 순서 유지, ORDERED 절 • 비용 소비자 • I/O 집중적 • 논리적 읽기 수 = Non-Leaf Level 수 + Leaf 페이지 총 수 • CPU 집중적 • 검색 행 수
Bookmark Lookup (Heap) • 도구 설명 • 책갈피(RID또는 클러스터링 키)를 사용, 테이블 또는 클러스터된 인덱스의해당행 조회 • 인수 • 책갈피, BOOKMARK:() • 적용 개체, OBJECT:() • 미리 읽기 사용, WITH PREFETCH • 비용 소비자 • I/O 집중적 • 논리적 읽기 수 = 행 개수
Clustered Index Seek • 도구 설명 • 클러스터된 인덱스에서 특정 범위의 행을 검색 • 인수 • 적용 개체, OBJECT:() • 인덱스 사용 검색 조건 식, SEEK:() • 검색 조건 식, WHERE:() • 출력 순서 유지, ORDERED 절 • 비용 소비자 • I/O 집중적 • 논리적 읽기 수 = Non-Leaf Level 수 + Data 페이지 수* *Data 페이지 수 = 검색 행 수 / Data 페이지 당 행 수 • CPU • 검색 행 수
Clustered Index Scan • 도구 설명 • 클러스터된 인덱스를 전체 또는 한 범위를스캔 • 인수 • 적용 개체, OBJECT:() • 검색 조건 식, WHERE:() • 출력 순서 유지, ORDERED 절 • 비용 소비자 • I/O 집중적 • 논리적 읽기 수 = Non-Leaf Level 수 + Data 페이지 총 수 • CPU 집중적 • 검색 행 수