sql server 2000 디자인 및 사용자 정의 함수 (building high function applications with sql...

41
SQL Server 2000 SQL Server 2000 디디디 디 디디디 디 디디디 디디 디디 디디디 디디 디디 (Building High Function Applications With SQL Server (Building High Function Applications With SQL Server 2000 2000) 디 디디 디 디디 디디디디 디디디디 디디디디 디디디디 [email protected] [email protected] www.inbrein.com www.inbrein.com

Upload: hasad

Post on 15-Jan-2016

96 views

Category:

Documents


0 download

DESCRIPTION

SQL Server 2000 디자인 및 사용자 정의 함수 (Building High Function Applications With SQL Server ™ 2000 ) 우 철웅 ㈜ 인브레인 기술이사 [email protected] www.inbrein.com. 세션의 목적. 동적 Cross-Tab 생성(35) 다양한 격자형 데이터 조회를 저장 프로시저를 이용하여 동적으로 구현하기 Cache 기능의 이해(50) Ad-hoc Query 와 저장 프로시저의 캐싱 비교 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: SQL Server 2000  디자인 및 사용자 정의 함수 (Building High Function Applications With SQL Server ™  2000 )

SQL Server 2000 SQL Server 2000 디자인 및 디자인 및 사용자 정의 함수사용자 정의 함수(Building High Function Applications With SQL Server(Building High Function Applications With SQL Server™™ 2000 2000))

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

www.inbrein.comwww.inbrein.com

Page 2: SQL Server 2000  디자인 및 사용자 정의 함수 (Building High Function Applications With SQL Server ™  2000 )

세션의 목적세션의 목적 동적 동적 Cross-Tab Cross-Tab 생성생성 (35)(35) 다양한 격자형 데이터 조회를 저장 프로시저를 다양한 격자형 데이터 조회를 저장 프로시저를

이용하여 동적으로 구현하기이용하여 동적으로 구현하기 Cache Cache 기능의 이해기능의 이해 (50)(50) Ad-hoc QueryAd-hoc Query 와 저장 프로시저의 캐싱 비교 와 저장 프로시저의 캐싱 비교 Ad-hoc QueryAd-hoc Query 의 강제 캐싱하기의 강제 캐싱하기 사용자 정의 함수 이해사용자 정의 함수 이해 (35)(35) 사용자 정의 함수로 효과적인 프로그래밍 사용자 정의 함수로 효과적인 프로그래밍

구현하기구현하기 SQL Server SQL Server 데이터베이스 디자인 시 고려 사항 데이터베이스 디자인 시 고려 사항

사항사항 (40) (40) 테이블을 분리해야 하는 기준과 키 코드 결정시 테이블을 분리해야 하는 기준과 키 코드 결정시

고려 사항고려 사항

Page 3: SQL Server 2000  디자인 및 사용자 정의 함수 (Building High Function Applications With SQL Server ™  2000 )

동적 동적 Cross-Tab Cross-Tab 생성 생성 서버 사이드 프로그래밍 기초 지식서버 사이드 프로그래밍 기초 지식

동적 동적 Cross-TabCross-Tab 을 사용해야 하는 이유을 사용해야 하는 이유 변수의 선언과 사용변수의 선언과 사용

로컬 변수로컬 변수 전역 변수전역 변수

임시 테이블의 선언과 사용임시 테이블의 선언과 사용 로컬 임시 테이블로컬 임시 테이블 전역 임시 테이블전역 임시 테이블

배치의 이해배치의 이해 구문 오류구문 오류 오브젝트 오류오브젝트 오류 제약조건 오류제약조건 오류

Page 4: SQL Server 2000  디자인 및 사용자 정의 함수 (Building High Function Applications With SQL Server ™  2000 )

동적 동적 Cross-Tab Cross-Tab 생성 생성 배치에 대한 이해배치에 대한 이해USE TempDBUSE TempDBGOGOCREATE TABLE TEST (id int PRIMARY KEY) CREATE TABLE TEST (id int PRIMARY KEY) GOGOINSERT TEST Values(1)INSERT TEST Values(1)INSERST TEST Values(2) -- INSERST TEST Values(2) -- 구문 에러 구문 에러 INSERT TEST Values(3)INSERT TEST Values(3)GOGOINSERT TEST Values(4)INSERT TEST Values(4)INSERT TESST Values(5) -- INSERT TESST Values(5) -- 개체 에러 개체 에러 INSERT TEST Values(6)INSERT TEST Values(6)GOGOINSERT TEST Values(7)INSERT TEST Values(7)INSERT TEST Values(7) -- INSERT TEST Values(7) -- 기본키 에러 기본키 에러 INSERT TEST Values(8)INSERT TEST Values(8)GOGO

Page 5: SQL Server 2000  디자인 및 사용자 정의 함수 (Building High Function Applications With SQL Server ™  2000 )

동적 동적 CrossCross-Tab -Tab 생성 생성 배치에 대한 이해배치에 대한 이해

Page 6: SQL Server 2000  디자인 및 사용자 정의 함수 (Building High Function Applications With SQL Server ™  2000 )

동적 동적 Cross-Tab Cross-Tab 생성 생성 세션에서 하위 영역과 상위 영역 이해세션에서 하위 영역과 상위 영역 이해세션의 상위 영역에서 만든 오브젝트에 대해 하위 영역에서 인식 가능세션의 상위 영역에서 만든 오브젝트에 대해 하위 영역에서 인식 가능SELECT * INTO #Sales1 FROM Pubs.dbo.Sales SELECT * INTO #Sales1 FROM Pubs.dbo.Sales

EXEC ('SELECT COUNT(*) FROM #Sales1')EXEC ('SELECT COUNT(*) FROM #Sales1')

GOGO

세션의 하위 영역에서 만든 오브젝트에 대해 상위 영역에서 인식 불가능세션의 하위 영역에서 만든 오브젝트에 대해 상위 영역에서 인식 불가능EXEC ('SELECT * INTO #Sales2 FROM Pubs.dbo.Sales')EXEC ('SELECT * INTO #Sales2 FROM Pubs.dbo.Sales')

SELECT * FROM #Sales2SELECT * FROM #Sales2

GOGO

위의 쿼리가 수행되려면 모든 것이 하위 영역에서 수행되어야 함위의 쿼리가 수행되려면 모든 것이 하위 영역에서 수행되어야 함EXEC ('SELECT * INTO #Sales2 FROM Pubs.dbo.Sales EXEC ('SELECT * INTO #Sales2 FROM Pubs.dbo.Sales

SELECT * FROM #Sales2')SELECT * FROM #Sales2')

GOGO

Page 7: SQL Server 2000  디자인 및 사용자 정의 함수 (Building High Function Applications With SQL Server ™  2000 )

동적 동적 Cross-Tab Cross-Tab 생성 생성 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 8: SQL Server 2000  디자인 및 사용자 정의 함수 (Building High Function Applications With SQL Server ™  2000 )

어플리케이션 수행속도와 확장성을 위해 어플리케이션 수행속도와 확장성을 위해 살펴 보아야 할 내용 살펴 보아야 할 내용 최적화된 실행 계획최적화된 실행 계획 실행 계획의 재사용실행 계획의 재사용 네트웍 라운드트립네트웍 라운드트립 ((roundtrip)roundtrip) 의 최소화의 최소화

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

Cache Cache 기능의 이해기능의 이해효과적인 어플리케이션 효과적인 어플리케이션

Page 9: SQL Server 2000  디자인 및 사용자 정의 함수 (Building High Function Applications With SQL Server ™  2000 )

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

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

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

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

Page 10: SQL Server 2000  디자인 및 사용자 정의 함수 (Building High Function Applications With SQL Server ™  2000 )

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

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

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

Page 11: SQL Server 2000  디자인 및 사용자 정의 함수 (Building High Function Applications With 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 12: SQL Server 2000  디자인 및 사용자 정의 함수 (Building High Function Applications With SQL Server ™  2000 )

캐싱 정보를 담고있는 시스템 테이블캐싱 정보를 담고있는 시스템 테이블

master.dbo.syscacheobjectsmaster.dbo.syscacheobjects컬럼명 데이터 타입 설 명

bucketid Int Bucket ID. 0 부터 해시 테이블 사이즈 – 1cacheobjtyp

nvarchar(34) 캐시 오브젝트 타입 (Compiled Plan, Executable Plan, Parse Tree 등 )

Objtype nvarchar(16) 오브젝트 타입 (Stored Procedure, Prepared statement, Ad hoc query, Trigger, View, Default 등

Objid Int 쿼리 구문에서 주요한 오브젝트 ID

Usecounts Int 쿼리 수행시 캐시 오브젝트를 참조한 수 .Refcounts 와 usecounts 에 의해 프로시저 메모리 공간이 필요한 경우에 제거할 오브젝트를 선정하게 된다 .

Pagesused

Int 캐시 오브젝트에 의해 사용되어 지는 메모리 페이지 .

Setopts Int 실행하는 환경을 저장 . 다른 실행 환경에는 다른 실행 계획을 만들어 사용 . 영향을 미치는 SET 옵션 . ANSI_PADDING,FORCEPLAN, ANSI_WARNINGSCONCAT_NULL_YIELDS_NULL,ANSI_NULLSQUOTED_IDENTIFIER,ANSI_NULL_DFLT_ONANSI_NULL_DFLT_OFF

Sql nvarchar(3900)

쿼리의 좌측 3900 바이트 저장된 쿼리 구문 .

Page 13: SQL Server 2000  디자인 및 사용자 정의 함수 (Building High Function Applications With SQL Server ™  2000 )

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

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

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

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

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

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

Page 14: SQL Server 2000  디자인 및 사용자 정의 함수 (Building High Function Applications With 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 15: SQL Server 2000  디자인 및 사용자 정의 함수 (Building High Function Applications With 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 16: SQL Server 2000  디자인 및 사용자 정의 함수 (Building High Function Applications With SQL Server ™  2000 )

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

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

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

Sp_executesql, EXEC Sp_executesql, EXEC

Page 17: SQL Server 2000  디자인 및 사용자 정의 함수 (Building High Function Applications With SQL Server ™  2000 )

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

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

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

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

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

Page 18: SQL Server 2000  디자인 및 사용자 정의 함수 (Building High Function Applications With SQL Server ™  2000 )

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

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

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

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

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

Page 19: SQL Server 2000  디자인 및 사용자 정의 함수 (Building High Function Applications With 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 20: SQL Server 2000  디자인 및 사용자 정의 함수 (Building High Function Applications With 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 21: SQL Server 2000  디자인 및 사용자 정의 함수 (Building High Function Applications With 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 22: SQL Server 2000  디자인 및 사용자 정의 함수 (Building High Function Applications With 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 23: SQL Server 2000  디자인 및 사용자 정의 함수 (Building High Function Applications With 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 24: SQL Server 2000  디자인 및 사용자 정의 함수 (Building High Function Applications With 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 25: SQL Server 2000  디자인 및 사용자 정의 함수 (Building High Function Applications With 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 26: SQL Server 2000  디자인 및 사용자 정의 함수 (Building High Function Applications With SQL Server ™  2000 )

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

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

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

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

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

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

Page 27: SQL Server 2000  디자인 및 사용자 정의 함수 (Building High Function Applications With SQL Server ™  2000 )

자주 사용하는 반복 작업을 은닉화하고 자주 사용하는 반복 작업을 은닉화하고 처리 속도를 향상시키는 목적으로 사용처리 속도를 향상시키는 목적으로 사용

매개 변수를 가질 수 있으며 결과 값이나 매개 변수를 가질 수 있으며 결과 값이나 결과셋을 반환할 수 있다결과셋을 반환할 수 있다 ..

임시 테이블을 만들어 작업해야 하는 임시 테이블을 만들어 작업해야 하는 복잡한 쿼리에 대한 뷰의 역할을 수행할 복잡한 쿼리에 대한 뷰의 역할을 수행할 수 있다수 있다 ..

매개 변수를 가진 뷰의 역할을 수행할 수 매개 변수를 가진 뷰의 역할을 수행할 수 있다있다 ..

사용자 정의 함수 이해사용자 정의 함수 이해사용자 정의 함수의 사용 목적사용자 정의 함수의 사용 목적

Page 28: SQL Server 2000  디자인 및 사용자 정의 함수 (Building High Function Applications With SQL Server ™  2000 )

변수 선언을 위한 변수 선언을 위한 Declare Declare 구문구문 변수 대입을 위한 변수 대입을 위한 Set, Select Set, Select 구문구문 임시 테이블 저장을 위한 임시 테이블 저장을 위한 Select Select 구문구문 흐름 제어 구문흐름 제어 구문 커서 사용을 위한 구문커서 사용을 위한 구문 확장 프로시저 수행 구문확장 프로시저 수행 구문

사용자 정의 함수에 사용 불가한 구문사용자 정의 함수에 사용 불가한 구문 결과 값을 반환하는 쿼리결과 값을 반환하는 쿼리 테이블을 갱신하는 쿼리테이블을 갱신하는 쿼리

사용자 정의 함수 이해사용자 정의 함수 이해사용자 정의 함수에 사용 가능한 구문사용자 정의 함수에 사용 가능한 구문

Page 29: SQL Server 2000  디자인 및 사용자 정의 함수 (Building High Function Applications With SQL Server ™  2000 )

CREATE FUNCTION MonthLastDay (@DATE smalldatetime)CREATE FUNCTION MonthLastDay (@DATE smalldatetime)

RETURNS smalldatetimeRETURNS smalldatetime

ASAS

BEGINBEGIN

RETURN(DATEADD(mm,1,CONVERT(char(8),@DATE,112))-RETURN(DATEADD(mm,1,CONVERT(char(8),@DATE,112))-DATEPART(dd,@DATE))DATEPART(dd,@DATE))

ENDEND

GOGO

SELECT dbo.MonthLastDay('20000205'), dbo.MonthLastDay(GETDATE())SELECT dbo.MonthLastDay('20000205'), dbo.MonthLastDay(GETDATE())

GOGO

SELECT *,dbo.MonthFirstDay(Ord_Date) FROM SalesSELECT *,dbo.MonthFirstDay(Ord_Date) FROM Sales

GOGO

SELECT * FROM dbo.Sales SELECT * FROM dbo.Sales

WHERE Ord_Date BETWEEN dbo.MonthFirstDay(GETDATE()) and WHERE Ord_Date BETWEEN dbo.MonthFirstDay(GETDATE()) and dbo.MonthLastDay(GETDATE())dbo.MonthLastDay(GETDATE())

GOGO

사용자 정의 함수 이해사용자 정의 함수 이해값값 반환 함수반환 함수

Page 30: SQL Server 2000  디자인 및 사용자 정의 함수 (Building High Function Applications With SQL Server ™  2000 )

CREATE FUNCTION fn_SalesQty (@Qty int)CREATE FUNCTION fn_SalesQty (@Qty int)

RETURNS TABLERETURNS TABLE

ASAS

RETURN (SELECT stor_id, title_id, qty FROM Sales RETURN (SELECT stor_id, title_id, qty FROM Sales

WHERE qty > @Qty)WHERE qty > @Qty)

GOGO

SELECT * FROM dbo.fn_SalesQty(40) Order By qty DescSELECT * FROM dbo.fn_SalesQty(40) Order By qty Desc

SELECT stor_id,SUM(Qty) FROM dbo.fn_SalesQty(40) SELECT stor_id,SUM(Qty) FROM dbo.fn_SalesQty(40)

GROUP BY stor_idGROUP BY stor_id

GOGO

SELECT s.stor_id, t.stor_name, s.title_id, s.qty SELECT s.stor_id, t.stor_name, s.title_id, s.qty

FROM dbo.fn_SalesQty(40) s, Stores tFROM dbo.fn_SalesQty(40) s, Stores t

WHERE s.stor_id = t.stor_idWHERE s.stor_id = t.stor_id

GOGO

사용자 정의 함수 이해사용자 정의 함수 이해테이블 반환 함수테이블 반환 함수

Page 31: SQL Server 2000  디자인 및 사용자 정의 함수 (Building High Function Applications With SQL Server ™  2000 )

데이터베이스 모델링에 따라 많은 수행속도의 차이가 있다데이터베이스 모델링에 따라 많은 수행속도의 차이가 있다 ..

그리고 실제 병목 현상이 발생하여 운영하고 있는그리고 실제 병목 현상이 발생하여 운영하고 있는데이터베이스 스키마를 변경하기란 쉽지가 않다데이터베이스 스키마를 변경하기란 쉽지가 않다 ..

따라서 처음부터 수행 속도를 고려한 디자인을 하는 것이따라서 처음부터 수행 속도를 고려한 디자인을 하는 것이좋겠다좋겠다 .. 여기서는 일반적인 데이터베이스 디자인 고려 사항 보다는여기서는 일반적인 데이터베이스 디자인 고려 사항 보다는세부적으로 주요한 몇 가지 팁을 다루고자 한다세부적으로 주요한 몇 가지 팁을 다루고자 한다 ..

데이터베이스 디자인 시 고려 사항 데이터베이스 디자인 시 고려 사항

Page 32: SQL Server 2000  디자인 및 사용자 정의 함수 (Building High Function Applications With SQL Server ™  2000 )

기 본 키 의 사 이 즈 를 줄이 자기 본 키 의 사 이 즈 를 줄이 자 .(.( 클러 스 터 인덱스 의 클러 스 터 인덱스 의 사이즈를 줄이자사이즈를 줄이자 .) .)

컬럼의 특성에 따라 테이블을 분리하자컬럼의 특성에 따라 테이블을 분리하자 .. 조회 위주의 컬럼과 갱신 위주의 컬럼을 분리조회 위주의 컬럼과 갱신 위주의 컬럼을 분리 .. 자주 사용되는 컬럼과 종종 사용되는 컬럼을 분리자주 사용되는 컬럼과 종종 사용되는 컬럼을 분리 .. 이벤트 처리를 위한 임시 컬럼을 분리이벤트 처리를 위한 임시 컬럼을 분리 .. 데이터량이 많은 경우 히스토리 테이블로 분리데이터량이 많은 경우 히스토리 테이블로 분리 ..

가능한 자동 증가형을 사용하고 프로그램 차원의 가능한 자동 증가형을 사용하고 프로그램 차원의 증가형을 구현하지 말자증가형을 구현하지 말자 ..

트리거 구현 시 단순하게 처리할 수 있는 구조로 만들자트리거 구현 시 단순하게 처리할 수 있는 구조로 만들자 .. 키의 변화가 잦은 경우에는 대리키를 사용하자키의 변화가 잦은 경우에는 대리키를 사용하자 .. 여러 컬럼을 비교하여 차집합을 구해야 하는 경우가 여러 컬럼을 비교하여 차집합을 구해야 하는 경우가

있다면 하나의 컬럼으로 비교 가능한 대리키를 사용하자있다면 하나의 컬럼으로 비교 가능한 대리키를 사용하자 ..

데이터베이스 디자인 시 고려 사항데이터베이스 디자인 시 고려 사항

Page 33: SQL Server 2000  디자인 및 사용자 정의 함수 (Building High Function Applications With SQL Server ™  2000 )

데이터베이스 디자인 시 고려 사항 데이터베이스 디자인 시 고려 사항 기본키의 사이즈를 줄이자기본키의 사이즈를 줄이자 ..((클러스터 인덱스의 사이즈를 줄이자클러스터 인덱스의 사이즈를 줄이자 .).)

Page 34: SQL Server 2000  디자인 및 사용자 정의 함수 (Building High Function Applications With SQL Server ™  2000 )

데이터베이스 디자인 시 고려 사항 데이터베이스 디자인 시 고려 사항 조회 위주의 컬럼과 갱신 위주의 컬럼을 분리조회 위주의 컬럼과 갱신 위주의 컬럼을 분리

Page 35: SQL Server 2000  디자인 및 사용자 정의 함수 (Building High Function Applications With SQL Server ™  2000 )

데이터베이스 디자인 시 고려 사항 데이터베이스 디자인 시 고려 사항 자주 사용되는 컬럼과 종종 사용되는 컬럼을 자주 사용되는 컬럼과 종종 사용되는 컬럼을 분리분리 . . 이벤트 처리를 위한 임시 컬럼을 분리이벤트 처리를 위한 임시 컬럼을 분리

Page 36: SQL Server 2000  디자인 및 사용자 정의 함수 (Building High Function Applications With SQL Server ™  2000 )

데이터베이스 디자인 시 고려 사항 데이터베이스 디자인 시 고려 사항 데이터량이 많은 경우 히스토리 테이블로 데이터량이 많은 경우 히스토리 테이블로 분리분리

Page 37: SQL Server 2000  디자인 및 사용자 정의 함수 (Building High Function Applications With SQL Server ™  2000 )

데이터베이스 디자인 시 고려 사항 데이터베이스 디자인 시 고려 사항 가능한 자동 증가형을 사용하고 프로그램 가능한 자동 증가형을 사용하고 프로그램 차원의 증가형을 구현하지말자차원의 증가형을 구현하지말자 ..

Page 38: SQL Server 2000  디자인 및 사용자 정의 함수 (Building High Function Applications With SQL Server ™  2000 )

데이터베이스 디자인 시 고려 사항 데이터베이스 디자인 시 고려 사항 가능한 자동 증가형을 사용하고 프로그램 가능한 자동 증가형을 사용하고 프로그램 차원의 증가형을 구현하지말자차원의 증가형을 구현하지말자 ..

Page 39: SQL Server 2000  디자인 및 사용자 정의 함수 (Building High Function Applications With SQL Server ™  2000 )

데이터베이스 디자인 시 데이터베이스 디자인 시 트리거 구현 시 단순하게 처리할 트리거 구현 시 단순하게 처리할 수 있는 구조를 만들자수 있는 구조를 만들자 ..CREATE TRIGGER Ins_Insert ON Ins FOR INSERTCREATE TRIGGER Ins_Insert ON Ins FOR INSERT

ASAS

UPDATE CStocks SET Qty = s.Qty + i.Qty UPDATE CStocks SET Qty = s.Qty + i.Qty

FROM (SELECT PID, SUM(Qty) AS Qty FROM Inserted GROUP BY PID) FROM (SELECT PID, SUM(Qty) AS Qty FROM Inserted GROUP BY PID) ii

, CStocks s WHERE i.PID = s.PID, CStocks s WHERE i.PID = s.PID

INSERT INTO CStocks INSERT INTO CStocks

SELECT PID, SUM(Qty) FROM Inserted WHERE PID NOT IN( SELECT SELECT PID, SUM(Qty) FROM Inserted WHERE PID NOT IN( SELECT PID FROM CStocks )PID FROM CStocks )

GROUP BY PIDGROUP BY PID

GOGO

CREATE TRIGGER Products_Insert ON Products FOR INSERTCREATE TRIGGER Products_Insert ON Products FOR INSERT

ASAS

INSERT INTO CStocks INSERT INTO CStocks

SELECT PID, 0 FROM Inserted SELECT PID, 0 FROM Inserted

GOGO

Page 40: SQL Server 2000  디자인 및 사용자 정의 함수 (Building High Function Applications With SQL Server ™  2000 )

데이터베이스 디자인 시 고려 사항데이터베이스 디자인 시 고려 사항키의 변화가 잦은 경우에는 대리키를 사용하자키의 변화가 잦은 경우에는 대리키를 사용하자 ..

Page 41: SQL Server 2000  디자인 및 사용자 정의 함수 (Building High Function Applications With SQL Server ™  2000 )

SELECT * INTO SalesTemp FROM Sales WHERE qty >= 20SELECT * INTO SalesTemp FROM Sales WHERE qty >= 20

GOGO

SELECT stor_id,ord_num,title_id,qty FROM Sales SELECT stor_id,ord_num,title_id,qty FROM Sales

WHERE stor_id+CONVERT(char(20),ord_num)WHERE stor_id+CONVERT(char(20),ord_num)+CONVERT(char(10),title_id) +CONVERT(char(10),title_id)

NOT IN NOT IN

(SELECT stor_id+CONVERT(char(20),ord_num)(SELECT stor_id+CONVERT(char(20),ord_num)+CONVERT(char(10),title_id) +CONVERT(char(10),title_id)

FROM SalesTemp)FROM SalesTemp)

GOGO

SELECT stor_id,ord_num,title_id INTO #T FROM SalesSELECT stor_id,ord_num,title_id INTO #T FROM Sales

DELETE #T FROM #T t, SalesTemp s DELETE #T FROM #T t, SalesTemp s

WHERE t.stor_id = s.stor_id AND t.ord_num = s.ord_num AND t.title_id WHERE t.stor_id = s.stor_id AND t.ord_num = s.ord_num AND t.title_id = s.title_id= s.title_id

SELECT s.stor_id,s.ord_num,s.title_id FROM #T t, Sales s SELECT s.stor_id,s.ord_num,s.title_id FROM #T t, Sales s

WHERE t.stor_id = s.stor_id AND t.ord_num = s.ord_num AND t.title_id WHERE t.stor_id = s.stor_id AND t.ord_num = s.ord_num AND t.title_id = s.title_id= s.title_id

GOGO

데이터베이스 디자인 시 고려 사항데이터베이스 디자인 시 고려 사항여러 컬럼을 차집합을 위해 가능한 대리키를 여러 컬럼을 차집합을 위해 가능한 대리키를 사용하거나 긍정형 비교처리로 바꾸자사용하거나 긍정형 비교처리로 바꾸자 ..