sql server ™ 2000 에서 성능 좋은 어플리케이션 구현하기

47
SQL Server SQL Server 2000 2000 에에 에에 에에 에에 에에 에에에에에에 에에에에 에에 에에에에에에 에에에에 ( Building High Performance Applications With SQL Server Building High Performance Applications With SQL Server 2000 2000) 에 에에 에 에에 에에에에 에에에에 에에에에 에에에에 [email protected] [email protected] www.inbrein.com www.inbrein.com

Upload: anoki

Post on 15-Jan-2016

82 views

Category:

Documents


0 download

DESCRIPTION

SQL Server ™ 2000 에서 성능 좋은 어플리케이션 구현하기 ( Building High Performance Applications With SQL Server ™ 2000 ) 우 철웅 ㈜ 인브레인 기술이사 [email protected] www.inbrein.com. 세션의 목적. 어플리케이션 개발자 관점에서 SQL 서버의 확장성과 수행 속도에 대한 논의 어플리케이션 개발과 직접 관계 있는 SQL 서버의 특징 점검 성능 좋은 어플리케이션을 만들기 위한 예제. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: SQL Server ™  2000 에서 성능 좋은 어플리케이션 구현하기

SQL ServerSQL Server™™ 2000 2000 에서 에서 성능 좋은 어플리케이션 성능 좋은 어플리케이션 구현하기구현하기((Building High Performance Applications With SQL ServerBuilding High Performance Applications With SQL Server™™ 2000 2000))

우 철웅우 철웅 ㈜㈜인브레인 기술이사인브레인 기술이사[email protected]@inbrein.com

www.inbrein.comwww.inbrein.com

Page 2: SQL Server ™  2000 에서 성능 좋은 어플리케이션 구현하기

세션의 목적세션의 목적 어플리케이션 개발자 관점에서 어플리케이션 개발자 관점에서 SQL SQL

서버의 확장성과 수행 속도에 대한 서버의 확장성과 수행 속도에 대한 논의 논의

어플리케이션 개발과 직접 관계 있는 어플리케이션 개발과 직접 관계 있는 SQL SQL 서버의 특징 점검서버의 특징 점검

성능 좋은 어플리케이션을 만들기 위한 성능 좋은 어플리케이션을 만들기 위한 예제 예제

Page 3: SQL Server ™  2000 에서 성능 좋은 어플리케이션 구현하기

SQL SQL 서버 성능 관리 서버 성능 관리 Self Configuring, Managing, TuningSelf Configuring, Managing, Tuning

자동화된 자동화된 memory/lock/object memory/lock/object 관리관리 확장되고 스마트한 확장되고 스마트한 I/O I/O 복합 구문에 대한 병행 실행 계획복합 구문에 대한 병행 실행 계획 자동화된 미리 읽기자동화된 미리 읽기 ((Readahead)Readahead) 자동화된 통계정보의 생성자동화된 통계정보의 생성 // 관리관리 고급 쿼리 최적화고급 쿼리 최적화 자동화된 인덱스 튜닝자동화된 인덱스 튜닝 관리관리 자동화된 쿼리 실행 계획의 캐싱자동화된 쿼리 실행 계획의 캐싱 기타기타 , , 여러 가지여러 가지……

Page 4: SQL Server ™  2000 에서 성능 좋은 어플리케이션 구현하기

““SQL SQL 서버의 성능은 좋은데서버의 성능은 좋은데 , , 왜 왜 나의 어플리케이션은 그렇지 못한나의 어플리케이션은 그렇지 못한가가 ?”?” 어플리케이션 수행속도와 확장성을 위해 어플리케이션 수행속도와 확장성을 위해

살펴 보아야 할 내용 살펴 보아야 할 내용 최적화된 실행 계획의 케싱 보장최적화된 실행 계획의 케싱 보장 네트웍 라운드트립네트웍 라운드트립 ((roundtrip)roundtrip) 의 최소화의 최소화 효과적인 커서의 사용효과적인 커서의 사용

데이터를 접근하는 방법에 따라 수행 데이터를 접근하는 방법에 따라 수행 속도의 결과는 굉장한 차이를 보일 수 있속도의 결과는 굉장한 차이를 보일 수 있다다 . .

Page 5: SQL Server ™  2000 에서 성능 좋은 어플리케이션 구현하기

실행 계획의 캐싱실행 계획의 캐싱아키텍쳐 살펴보기아키텍쳐 살펴보기

쿼리한 쿼리한 SQL SQL 구문은 파서에 의해 쿼리 트리로 구문은 파서에 의해 쿼리 트리로 만들어 진다만들어 진다 ..

옵티마이저는 최적화된 실행 계획을 만들기 옵티마이저는 최적화된 실행 계획을 만들기 위해 쿼리 트리를 만든다위해 쿼리 트리를 만든다 .. 정규화정규화 (Normalization)(Normalization) 통계 정보를 이용한 최적화 통계 정보를 이용한 최적화 (( 비용 기준비용 기준 ) ) 가장 빠른 경로를 위한가장 빠른 경로를 위한 , , 최소 비용 처리 방법 발견최소 비용 처리 방법 발견

실행 계획 실행 계획 – – 데이터 구조 생성데이터 구조 생성 실행 계획의 저장 실행 계획의 저장 같은 실행 컨택스트 내에서 재사용같은 실행 컨택스트 내에서 재사용

Page 6: SQL Server ™  2000 에서 성능 좋은 어플리케이션 구현하기

실행 계획의 케싱실행 계획의 케싱 ((Caching)Caching)케싱 메커니즘의 형태케싱 메커니즘의 형태

임의 질의에 대한 케싱임의 질의에 대한 케싱 임의 질의임의 질의 ((Ad-hoc) Ad-hoc) 케싱케싱 자동 파라메터화자동 파라메터화

고정된 질의에 대한 케싱고정된 질의에 대한 케싱 저장 프로시저저장 프로시저 ExecuteSQLExecuteSQL Prepare/Execute/UnpreparePrepare/Execute/Unprepare

Page 7: SQL Server ™  2000 에서 성능 좋은 어플리케이션 구현하기

임의 질의에 대한 케싱임의 질의에 대한 케싱어떻게 작업하는가어떻게 작업하는가 ??

임의 질의 구문에 대한 실행 계획 케싱임의 질의 구문에 대한 실행 계획 케싱 정확히 같은 구문을 수행한다면 케시된 정확히 같은 구문을 수행한다면 케시된

수행계획을 재 사용수행계획을 재 사용예 예 ::

Q1: select * from employees where fname like ‘S%’Q1: select * from employees where fname like ‘S%’

Q2: select * from employees where fname like ‘D%’Q2: select * from employees where fname like ‘D%’

Q3: select * from employees where fname like ‘S%’Q3: select * from employees where fname like ‘S%’

Q3 Q3 는 는 Q1Q1 의 케시된 실행 계획을 사용하게 된다의 케시된 실행 계획을 사용하게 된다 .. Q2 Q2 컴파일을 필요로 한다컴파일을 필요로 한다 ..

Page 8: SQL Server ™  2000 에서 성능 좋은 어플리케이션 구현하기

자동 파라메터화자동 파라메터화 어떻게 작업하는가어떻게 작업하는가 ??

단순 구문에 대해서만 처리된다단순 구문에 대해서만 처리된다 .. 옵티마이저는 상수에 대해 파라메터화 옵티마이저는 상수에 대해 파라메터화

할 것인지 검토한다할 것인지 검토한다 .. 만약 파라메터화가 결정되면 템플릿 만약 파라메터화가 결정되면 템플릿

실행 계획은 캐시에 저장된다실행 계획은 캐시에 저장된다 .. 연속적으로 동종의 쿼리가 수행되어 연속적으로 동종의 쿼리가 수행되어

캐시의 저장된 템플릿 실행 계획을 캐시의 저장된 템플릿 실행 계획을 사용한다면 “사용한다면 “ safe”safe” 로 만들것을 로 만들것을 고려한다고려한다 ..

권고 사항권고 사항 : : 잘 정의된 작업에 대해 잘 정의된 작업에 대해 이런 기능을 믿고 작업하지는 않는 것이 이런 기능을 믿고 작업하지는 않는 것이 좋겠다좋겠다 ..

Page 9: SQL Server ™  2000 에서 성능 좋은 어플리케이션 구현하기

자동 파라메터화자동 파라메터화 지원하는 기본 구문지원하는 기본 구문

INSERT <table> VALUES ({constant} | INSERT <table> VALUES ({constant} | NULL | DEFAULT}, ..)NULL | DEFAULT}, ..)

DELETE <table> WHERE <key-exp>DELETE <table> WHERE <key-exp> UPDATE <table> SET <col> = <constant> UPDATE <table> SET <col> = <constant>

WHERE <key-exp>WHERE <key-exp> SELECT <col-list> FROM <table> SELECT <col-list> FROM <table>

WHERE <key-exp> ORDER BY <col-list>WHERE <key-exp> ORDER BY <col-list>

Page 10: SQL Server ™  2000 에서 성능 좋은 어플리케이션 구현하기

자동 파라메터화자동 파라메터화 템플릿 예제템플릿 예제

Safe:Safe:

INT @P, SELECT fname, lname FROM INT @P, SELECT fname, lname FROM employees WHERE emp_id = @Pemployees WHERE emp_id = @P

Unsafe:Unsafe: SELECT fname, lname FROM SELECT fname, lname FROM

employees WHERE (salary + bonus) > employees WHERE (salary + bonus) > 3000030000

옵티마이저의 이러한 결정은 매우 옵티마이저의 이러한 결정은 매우 보수적이다보수적이다 ..

Page 11: SQL Server ™  2000 에서 성능 좋은 어플리케이션 구현하기

저장 프로시저저장 프로시저어떻게 작업 하는가어떻게 작업 하는가 ??

서버에 컴파일된 구문 저장서버에 컴파일된 구문 저장 객체 관리 계속적 지원객체 관리 계속적 지원 어플리케이션에 의한 파라메터 명시어플리케이션에 의한 파라메터 명시 케시에 있는 컴파일된 계획 실행 케시에 있는 컴파일된 계획 실행

WITH RECOMPILE WITH RECOMPILE 옵션으로 재 컴파일옵션으로 재 컴파일 저장 프로시저로 동적 생성 구문 수행저장 프로시저로 동적 생성 구문 수행

Sp_executesql, EXEC Sp_executesql, EXEC

Page 12: SQL Server ™  2000 에서 성능 좋은 어플리케이션 구현하기

저장 프로시저저장 프로시저장점장점

데이터에 대한 비즈니스 로직의 은익화 데이터에 대한 비즈니스 로직의 은익화 수행 속도수행 속도

재사용성재사용성 네트웍 트래픽의 감소네트웍 트래픽의 감소 RPC RPC 수행을 통한 구문 파싱과 파라메터 수행을 통한 구문 파싱과 파라메터

프로세싱 작업을 안함프로세싱 작업을 안함 사용자 정의 함수사용자 정의 함수 (UDFs)(UDFs) 도 비슷한 도 비슷한

장점이 제공됨장점이 제공됨

Page 13: SQL Server ™  2000 에서 성능 좋은 어플리케이션 구현하기

저장 프로시저저장 프로시저잘못된 저장 프로시저 호출 방법잘못된 저장 프로시저 호출 방법

값으로 직접 호출하지 마라값으로 직접 호출하지 마라……

// 나쁜 수행 방법이다 . // 호출 할 때 마다 보내어진 값 ‘ myval’ 에 대해 컴파일 한다 .//RPC event 대신에 SQLBatch 로 수행되어 진다 .

SQLExecDirect(hStmt,“execute mysp‘myval’”, SQL_NTS);

// 최적화된 상태는 아니다 .// 호출할 때마다 값에 대해 컴파일하여야 하기 때문에 SQLExecDirect(hStmt,“{ CALL mysp(‘myval’)}”, SQL_NTS);

Page 14: SQL Server ™  2000 에서 성능 좋은 어플리케이션 구현하기

저장 프로시저저장 프로시저SPSP 를 효과적으로 호출하는 방법를 효과적으로 호출하는 방법

파라메터를 이용한 호출 구문파라메터를 이용한 호출 구문

// Bind parameterschar szParam[32];SQLBindParameter(hStmt,…,szParam);

// Set parametersstrcpy(&szParam[0], “myval”);

// Execute the stored procedureSQLExecDirect(hStmt, “{ CALL mysp(?) }”, SQL_NTS);

//Even better on SQL Server 2000SQLPrepare ( hStmt, “{ CALL mysp(?) }”, SQL_NTS);SQLExecute ( hStmt );

다음 호출시케시에 있는플랜을 사용

Page 15: SQL Server ™  2000 에서 성능 좋은 어플리케이션 구현하기

ExecuteSQLExecuteSQL어떻게 작업되는가어떻게 작업되는가 ??

어플리케이션에 의해 생성되며어플리케이션에 의해 생성되며 지속적 객체 관리가 안됨지속적 객체 관리가 안됨Example:Example:

Sp_ExecuteSQL 'insert T1 values (@p) ', '@p float',1Sp_ExecuteSQL 'insert T1 values (@p) ', '@p float',1

Sp_ExecuteSQL 'insert T1 values (@p) ', '@p float', 3Sp_ExecuteSQL 'insert T1 values (@p) ', '@p float', 3

Sp_ExecuteSQL 'insert T1 values (@p) ', '@p float', 1Sp_ExecuteSQL 'insert T1 values (@p) ', '@p float', 1

ODBC SQLExecDirect ODBC SQLExecDirect 또는또는 OLEDB OLEDB ICommandWithParameters ICommandWithParameters 로 구현 가능로 구현 가능

Page 16: SQL Server ™  2000 에서 성능 좋은 어플리케이션 구현하기

Prepare / ExecutePrepare / Execute어떻게 작업하는가어떻게 작업하는가 ??

어플리케션에 의해 생성어플리케션에 의해 생성 파라메터를 파라메터를 Question marks(?)Question marks(?) 와 와

문자열로 쿼리를 수행한다문자열로 쿼리를 수행한다 .. 반복적 수행에 대해 효과적인 지원반복적 수행에 대해 효과적인 지원 UnPrepareUnPrepare 가 발생할 때 초기화됨가 발생할 때 초기화됨 ODBC, OLEDB, or DB-LibraryODBC, OLEDB, or DB-Library 의의

ICommandPrepareICommandPrepare 에 의해 지원됨에 의해 지원됨 .. DELETE FROM AUTHORS WHERE DELETE FROM AUTHORS WHERE

au_fname = ? AND au_lname = ? au_fname = ? AND au_lname = ?

Page 17: SQL Server ™  2000 에서 성능 좋은 어플리케이션 구현하기

부적절한 실행 계획의 공유부적절한 실행 계획의 공유 케시의 수행 계획을 사용하고 싶지 않을 때케시의 수행 계획을 사용하고 싶지 않을 때 최적화된 수행 계획은 선택 파라메터에 최적화된 수행 계획은 선택 파라메터에

의해 결정되기 때문의해 결정되기 때문예제 예제 ::

Select * from T where c>=5 and c<=10 (index lookup)Select * from T where c>=5 and c<=10 (index lookup)

Select * from T where c>=5 and c<=100 (table scan)Select * from T where c>=5 and c<=100 (table scan)

단일 실행 계획으로 두 구문에 대해 최적화된 단일 실행 계획으로 두 구문에 대해 최적화된 실행 계획을 가질 수 없다실행 계획을 가질 수 없다 ..

Page 18: SQL Server ™  2000 에서 성능 좋은 어플리케이션 구현하기

SQL 7.0 SQL 7.0 수행 속도의 핵심수행 속도의 핵심ExecDirect ExecDirect 대대 Prepare/ExecutePrepare/Execute

대부분의 많은 어플리케이션들은 대부분의 많은 어플리케이션들은 독립적인 드라이버 레이어로 구현된다독립적인 드라이버 레이어로 구현된다 어플리케이션 로직으로 독립된 어플리케이션 로직으로 독립된

데이터베이스데이터베이스 특별한 목적을 위한 프레임웍 특별한 목적을 위한 프레임웍 Passing hintsPassing hints

사용자 사용의 예측사용자 사용의 예측 Application Application 서버서버 N+2 costingN+2 costing

Page 19: SQL Server ™  2000 에서 성능 좋은 어플리케이션 구현하기

적은적은 Round-TripsRound-TripsSQL Server 2000 SQL Server 2000 개선 부분개선 부분

Prepare/Execute model:Prepare/Execute model: 모든 파라메터의 타입을 명시할 수 있음모든 파라메터의 타입을 명시할 수 있음 PreparePrepare 와 와 Execute Execute 간의 요청 사항 간의 요청 사항

없음없음 N N 번의 라운드 트립은 번의 라운드 트립은 N N 번의 수행을 번의 수행을

이야기 한다이야기 한다 ..

권고 사항 권고 사항 : : 항상 항상 Prepare/Execute Prepare/Execute 사용하자사용하자 !!

Page 20: SQL Server ™  2000 에서 성능 좋은 어플리케이션 구현하기

Prepare/Execute Round-TripsPrepare/Execute Round-Trips SQL SQL 서버서버 7.07.0 에서에서

7.0 7.0 ClientClient7.0 7.0 ClientClient

SQL Server 7.0SQL Server 7.0SQL Server 7.0SQL Server 7.0

User CodeUser CodeUser CodeUser Code

Pre

par

eP

rep

are

Han

dle

Han

dle

Exe

cute

Res

po

nse

Un

Pre

par

eU

nP

rep

are

Res

po

nse

Res

po

nse

Pre

par

eP

rep

are

Han

dle

Han

dle

Exe

cute

Res

po

nse

Un

Pre

par

eU

nP

rep

are

Res

po

nse

Res

po

nse

Exe

cute

Res

po

nse

Exe

cute

Res

po

nse

Pre

par

e

Exe

cute

Exe

cute

Un

Pre

par

e

Pre

par

e

Exe

cute

Exe

cute

Un

Pre

par

e

… …

Page 21: SQL Server ™  2000 에서 성능 좋은 어플리케이션 구현하기

Prepare/Execute Round-TripsPrepare/Execute Round-Trips SQL SQL 서버서버 20002000 에서에서

2000 2000 ClientClient2000 2000 ClientClient

SQL Server 2000SQL Server 2000SQL Server 2000SQL Server 2000

User CodeUser CodeUser CodeUser Code

Pre

par

e+E

xecu

te

Han

dle

+R

esp

on

se

Un

Pre

p+

Pre

p+

Exe

c

New

Han

dle

+R

esp

on

se

Exe

cute

Res

po

nse

Exe

cute

Res

po

nse

Pre

par

e

Exe

cute

Exe

cute

Un

Pre

par

e

Pre

par

e

Exe

cute

Exe

cute

Un

Pre

par

e

… …

Page 22: SQL Server ™  2000 에서 성능 좋은 어플리케이션 구현하기

Meta-Data Meta-Data 감소 감소 SQL SQL 서버서버 20002000 에서 개선에서 개선

Selects: Selects: 각 컬럼을 위한 각 컬럼을 위한 meta-datameta-data 클라이언트 사이드에 클라이언트 사이드에 Meta-dataMeta-data 를 케싱 를 케싱

(prepare/execute(prepare/execute 의 사용으로의 사용으로 )) meta-datameta-data 와 파라메터에 의한 처리와 파라메터에 의한 처리

많은 컬럼의 테이블에 대한 비용 감축많은 컬럼의 테이블에 대한 비용 감축(30%)(30%)

SQL2000 SQL2000 클라이언트에 의한 최적화클라이언트에 의한 최적화 단지 단지 SQL SQL 서버의 데이터와 데이터 길이만 서버의 데이터와 데이터 길이만

조회조회

Page 23: SQL Server ™  2000 에서 성능 좋은 어플리케이션 구현하기

권고 사항권고 사항SQL SQL 서버서버 20002000 에서에서

가능한 저장 프로시저를 사용하라가능한 저장 프로시저를 사용하라 .. Prepare/ExecutePrepare/Execute 를 사용하라를 사용하라 . .

((SQLExecute SQLExecute 대신대신 )) 가능한 파라메터화 하라가능한 파라메터화 하라

파라메터의 변동 폭이 큰 경우는 주의할 필요가 있다파라메터의 변동 폭이 큰 경우는 주의할 필요가 있다 .. 가능하다면 어플리케이션에서 파라메터의 데이터 가능하다면 어플리케이션에서 파라메터의 데이터

형을 명시하라형을 명시하라 .. 공통적인 룰을 관찰하고 적용하라공통적인 룰을 관찰하고 적용하라 .. 툴을 사용하여 툴을 사용하여 compiles/recompilescompiles/recompiles 에 대한 에 대한

통계를 관측하여 적용하라통계를 관측하여 적용하라 ..

Page 24: SQL Server ™  2000 에서 성능 좋은 어플리케이션 구현하기

커서를 사용하는 이유커서를 사용하는 이유 ??

데이터베이스 드라이버와 함께 데이터베이스 드라이버와 함께 어플리게이션을 구현할 수 있음어플리게이션을 구현할 수 있음

행 작업에 대해 스크롤행 작업에 대해 스크롤 ((scroll)scroll) 과 수정과 수정((update) update) 가능가능

하나의 커넥션에 여러 반복적 구문 수행 하나의 커넥션에 여러 반복적 구문 수행 가능가능

일부 행에 대한 부분 처리를 위해일부 행에 대한 부분 처리를 위해 어플리케이션에서 커서 사용을 필요로 어플리케이션에서 커서 사용을 필요로

하는 경우하는 경우

Page 25: SQL Server ™  2000 에서 성능 좋은 어플리케이션 구현하기

효과 적인 커서의 사용효과 적인 커서의 사용 커서 타입의 선택에 따라 수행 성능의 커서 타입의 선택에 따라 수행 성능의

차이가 커질 수 있음차이가 커질 수 있음 요구 수행할 수 있는 최소 비용이 드는 요구 수행할 수 있는 최소 비용이 드는

커서 타입을 사용커서 타입을 사용 커서 기본 옵션이나 커서 기본 옵션이나 Fast Forward OnlyFast Forward Only 를 를

사용사용 다른 기능을 원한다면 다른 커서 타입을 다른 기능을 원한다면 다른 커서 타입을

고려한다고려한다 .. Server/Network Server/Network 자원 사용에 대한 자원 사용에 대한

고려를 한다고려를 한다 .. 최소 비용이 드는 트랜젝션을 고려한다최소 비용이 드는 트랜젝션을 고려한다 ..

Page 26: SQL Server ™  2000 에서 성능 좋은 어플리케이션 구현하기

기본 결과 셋기본 결과 셋

기본 적인 모델은 커넥션에 대해 단일 기본 적인 모델은 커넥션에 대해 단일 SQL SQL 구문이다구문이다 ..

결과 셋을 모두 사용하게 최적화된 결과 셋을 모두 사용하게 최적화된 결과 셋을 조회하여야 한다결과 셋을 조회하여야 한다 ..

잇점잇점 :: 적은 서버 자원의 사용적은 서버 자원의 사용 불필요한 자료 요구의 제거불필요한 자료 요구의 제거

핵심핵심 : : 결과 셋을 사용하는 동안 결과 셋을 사용하는 동안 커넥션 은 쉬지 않고 움직인다커넥션 은 쉬지 않고 움직인다 ..

Page 27: SQL Server ™  2000 에서 성능 좋은 어플리케이션 구현하기

기본 결과 셋 예기본 결과 셋 예

ClientClientClientClient

SQL ServerSQL ServerSQL ServerSQL Server

Res

ult

Set

Pac

ket

Cu

rso

r O

pen

Cu

rso

r O

pen

Res

ult

Set

Pac

ket

Res

ult

Set

Pac

ket

Get

Nex

t R

ow

sG

et N

ext

Ro

ws

Page 28: SQL Server ™  2000 에서 성능 좋은 어플리케이션 구현하기

Fast Forward-Only Fast Forward-Only 커서커서 forward-onlyforward-only 와 와 read-onlyread-only 를 조합한 를 조합한 서버 커넥션이 많은 경우 유리 서버 커넥션이 많은 경우 유리 네트웍이 약한 기반에서 유리네트웍이 약한 기반에서 유리 기초 테이블에 직접 작업기초 테이블에 직접 작업 Fetch next Fetch next 만 지원만 지원 수정된 데이터에 대한 반영 됨수정된 데이터에 대한 반영 됨 ODBCODBC 에서 에서 AutoFetchAutoFetch 를 활성화 하여 를 활성화 하여 놓으면놓으면 , , AutoClose AutoClose 역시 자동으로 역시 자동으로 작동됨작동됨

Page 29: SQL Server ™  2000 에서 성능 좋은 어플리케이션 구현하기

Fast Forward Only ExampleFast Forward Only Example

ClientClientClientClient

SQL ServerSQL ServerSQL ServerSQL Server

Res

ult

Set

Pac

ket

Cu

rso

r O

pen

Cu

rso

r O

pen

Res

ult

Set

Pac

ket

Get

Nex

t R

ow

sG

et N

ext

Ro

ws

Res

ult

Set

Pac

ket

Get

Nex

t R

ow

sG

et N

ext

Ro

ws

Get

Nex

t R

ow

sG

et N

ext

Ro

ws

Page 30: SQL Server ™  2000 에서 성능 좋은 어플리케이션 구현하기

정적정적 ((Static) Static) 커서커서 커서 오픈 시 스냅샷커서 오픈 시 스냅샷 ((Snapshot) Snapshot)

형태로 형태로 TempDBTempDB 에 임시 에 임시 테이블을 생성하여 사용테이블을 생성하여 사용

읽기 전용읽기 전용 – – 기초 테이블 수정 기초 테이블 수정 불가불가

모든 스크롤모든 스크롤 ((scroll) scroll) 옵션 가능옵션 가능 데이터의 동적 반영이 안됨데이터의 동적 반영이 안됨

Page 31: SQL Server ™  2000 에서 성능 좋은 어플리케이션 구현하기

정적정적 ((Static) Static) 커서커서 동작원리동작원리

ClientClientClientClient

Res

ult

Set

Pac

ket

Cu

rso

r O

pen

Cu

rso

r O

pen

Res

ult

Set

Pac

ket

Get

Nex

t R

ow

sG

et N

ext

Ro

ws

Res

ult

Set

Pac

ket

Get

Nex

t R

ow

sG

et N

ext

Ro

ws

BaseBaseTablesTables QueryQuery

TempTableTempTable

SQL ServerSQL Server

Get

Nex

t R

ow

sG

et N

ext

Ro

ws

Page 32: SQL Server ™  2000 에서 성능 좋은 어플리케이션 구현하기

키셋키셋 ((Keyset) Keyset) 커서커서 커서 오픈 시 키셋에 대해 커서 오픈 시 키셋에 대해 TempDBTempDB 에 임시 에 임시

테이블로 저장하여 사용테이블로 저장하여 사용 커서를 오픈하면 키셋의 구성요소가 고정됨커서를 오픈하면 키셋의 구성요소가 고정됨 모든 스크롤모든 스크롤 ((scroll) scroll) 옵션 가능옵션 가능 SELECT SELECT 관계된 모든 테이블에 관계된 모든 테이블에 unique unique

indexindex 가 필요 가 필요 인덱스 컬럼 이외의 데이터는 동적으로 인덱스 컬럼 이외의 데이터는 동적으로

수정된 자료 조회 가능수정된 자료 조회 가능 새로운 데이터의 추가는 조회 불가능새로운 데이터의 추가는 조회 불가능 기존 데이터의 삭제는 에러 기존 데이터의 삭제는 에러

@@FETCH_STATUS@@FETCH_STATUS = -2 = -2 인지를 확인인지를 확인 WHERE CURRENT OFWHERE CURRENT OF 구문으로 인덱스 구문으로 인덱스

컬럼의 변경에 대해서는 조회 가능컬럼의 변경에 대해서는 조회 가능

Page 33: SQL Server ™  2000 에서 성능 좋은 어플리케이션 구현하기

Keyset Cursors ExampleKeyset Cursors Example

ClientClientClientClient

Res

ult

Set

Pac

ket

Cu

rso

r O

pen

Cu

rso

r O

pen

Res

ult

Set

Pac

ket

Get

Nex

t R

ow

sG

et N

ext

Ro

ws

Res

ult

Set

Pac

ket

Get

Nex

t R

ow

sG

et N

ext

Ro

ws

Get

Nex

t R

ow

sG

et N

ext

Ro

ws

BaseBaseTablesTables QueryQuery

BaseBaseTablesTables

TempTableTempTable

Keys

SQL ServerSQL Server

Page 34: SQL Server ™  2000 에서 성능 좋은 어플리케이션 구현하기

Dynamic CursorsDynamic Cursors

기초 테이블을 직접 조작기초 테이블을 직접 조작 모든 스크롤 옵션 가능 모든 스크롤 옵션 가능

절대절대 ((absolute position)absolute position) 위치 변경은 위치 변경은 지원 안됨지원 안됨

스크롤 할 때 마다 변경된 모든 데이터 스크롤 할 때 마다 변경된 모든 데이터 조회 가능조회 가능

JoinJoin 으로 열린 커서에 대한 제약이 으로 열린 커서에 대한 제약이 따름 따름 ((INSERT,UPDATE)INSERT,UPDATE)

성능 저하의 우려가 있음성능 저하의 우려가 있음

Page 35: SQL Server ™  2000 에서 성능 좋은 어플리케이션 구현하기

묵시적인 묵시적인 Cursor Cursor 형 변환형 변환 서버에 필요 결과 셋을 요구할 때서버에 필요 결과 셋을 요구할 때

원래의 질의에 영향을 받아원래의 질의에 영향을 받아 ORDER BY (indexORDER BY (index 에 포함되지 않은 컬럼으로에 포함되지 않은 컬럼으로 ) ) TOP, GROUP BY, UNION, DISTINCT …. TOP, GROUP BY, UNION, DISTINCT ….

대부분은 대부분은 staticstatic 으로 변환으로 변환 형 변환 룰에 의한 커서형 변환형 변환 룰에 의한 커서형 변환

권고 사항권고 사항 : : 커서 형 변환을 확인하기 위해 커서 형 변환을 확인하기 위해 SQL_SUCCESS_WITH_INFOSQL_SUCCESS_WITH_INFO 를 확인를 확인

Page 36: SQL Server ™  2000 에서 성능 좋은 어플리케이션 구현하기

Static Static 대대 Keyset Keyset StaticStatic

전체 구성 요소 셋을 만듬전체 구성 요소 셋을 만듬 연속적인 페치 시 가장 저렴한 비용연속적인 페치 시 가장 저렴한 비용

KeysetKeyset 키 구성 요소 셋을 만듬키 구성 요소 셋을 만듬 페치 시 인덱스 외의 컬럼을 페치페치 시 인덱스 외의 컬럼을 페치 Static Static 보단 저렴한 비용보단 저렴한 비용

Asynchronous Asynchronous 정도 설정정도 설정 Sp_configure ‘cursor threshold’ nSp_configure ‘cursor threshold’ n

Page 37: SQL Server ™  2000 에서 성능 좋은 어플리케이션 구현하기

커서 강화된 기능커서 강화된 기능 SQL SQL 서버서버 20002000 에서에서

커서 컴파일 플랜커서 컴파일 플랜 커서 수행 계획커서 수행 계획 StaticStatic 과 과 keysetskeysets 에 대한 에 대한 Fetch Fetch

next next Keyset fetchKeyset fetch Cursor foot print (memoryCursor foot print (memory))

Page 38: SQL Server ™  2000 에서 성능 좋은 어플리케이션 구현하기

개별 행 접근 시 향상된 기능개별 행 접근 시 향상된 기능SQL Server 2000SQL Server 2000

SelectsSelects 내부 메모리에 정보 사용내부 메모리에 정보 사용 컬럼 접근 속도 향상컬럼 접근 속도 향상

IRow interface (OLE-DB) IRow interface (OLE-DB) 단일 행 접근 시 직접 접근단일 행 접근 시 직접 접근 연속적인 다음행 접근연속적인 다음행 접근

Page 39: SQL Server ™  2000 에서 성능 좋은 어플리케이션 구현하기

예제예제Dynamic Cross-Tab Dynamic Cross-Tab 만들기만들기Create Proc up_Cross_tabCreate Proc up_Cross_tab

ASAS

……..

Create Table #CrossTab (ColKey varchar(20))Create Table #CrossTab (ColKey varchar(20))

While …While …

exec ('ALTER TABLE #Matrix ADD…' )exec ('ALTER TABLE #Matrix ADD…' )

……

DECLARE Data_Cursor CURSOR FOR DECLARE Data_Cursor CURSOR FOR

……

WHILE @@FETCH_STATUS = 0WHILE @@FETCH_STATUS = 0

BEGINBEGIN

… …....

ENDEND

SELECT * FROM #CrossTabSELECT * FROM #CrossTab

Page 40: SQL Server ™  2000 에서 성능 좋은 어플리케이션 구현하기

DemoDemo

Ad-Hoc Plan CachingAd-Hoc Plan Caching Auto-ParameterizationAuto-Parameterization Stored ProceduresStored Procedures Reduced Round-TripsReduced Round-Trips CursorCursor

Page 41: SQL Server ™  2000 에서 성능 좋은 어플리케이션 구현하기

General Performance General Performance 추가 권고 사항추가 권고 사항

배치 프로세싱 처리 하라배치 프로세싱 처리 하라 ..

(inserts(inserts 와와 selectsselects 를 한 배치에를 한 배치에 )) Combine inserts Combine inserts

Network LibraryNetwork Library 의 자원 공유의 자원 공유 SAN(System Area Network) SAN(System Area Network) 사용 사용

고려고려

Page 42: SQL Server ™  2000 에서 성능 좋은 어플리케이션 구현하기

Connection PoolingConnection Pooling

SQL ServerSQL Server 에 대한 클라이언트 에 대한 클라이언트 커넥션의 재사용커넥션의 재사용

네트웍 트래픽과 네트웍 트래픽과 CPUCPU 의 부하를 의 부하를 줄일수 있다줄일수 있다 ..

SQL SQL 서버의 메모리 자원을 적게 서버의 메모리 자원을 적게 사용한다사용한다 ..

Page 43: SQL Server ™  2000 에서 성능 좋은 어플리케이션 구현하기

SummarySummary

강력한 수행 계획의 케싱을 위한강력한 수행 계획의 케싱을 위한 저장 프로시저저장 프로시저 Prepare/ExecutePrepare/Execute 파라메터화파라메터화 ((Parameterize)Parameterize)

커서커서 효과 적인 커서 타입 설정효과 적인 커서 타입 설정 Test for downgradeTest for downgrade

SQL SQL 서버서버 2000 2000 내부적으로 최적화를 내부적으로 최적화를 지원하는 다양한 잊점을 사용하자지원하는 다양한 잊점을 사용하자 !!

Page 44: SQL Server ™  2000 에서 성능 좋은 어플리케이션 구현하기

SQL Server Today…SQL Server Today…

CRMCRM ERPERP E-CommerceE-Commerce Data WarehousingData Warehousing

Page 45: SQL Server ™  2000 에서 성능 좋은 어플리케이션 구현하기

More Information…More Information…

Books On-Line Books On-Line

Beta2 News groupsBeta2 News groupsMicrosoft.beta.Shiloh.*Microsoft.beta.Shiloh.*

SQL Server Home pageSQL Server Home pagehttp://www.microsoft.com/sqlhttp://www.microsoft.com/sql

Microsoft Product Support ServicesMicrosoft Product Support Serviceshttp://search.support.microsoft.comhttp://search.support.microsoft.com

Page 46: SQL Server ™  2000 에서 성능 좋은 어플리케이션 구현하기

Questions And FeedbackQuestions And Feedback

[email protected]@inbrein.com

Page 47: SQL Server ™  2000 에서 성능 좋은 어플리케이션 구현하기