sql server cursor

22
CURSOR 2015

Upload: sungwook-kang

Post on 18-Jan-2017

410 views

Category:

Engineering


3 download

TRANSCRIPT

Page 1: SQL Server CURSOR

CURSOR

2015

Page 2: SQL Server CURSOR

발표자 소개

강성욱SQL Server MVPBlog : http://sqlmvp.krFacebook : facebook.com/sqlmvp강의 및 컨설팅 문의 : [email protected]

Page 3: SQL Server CURSOR

Agenda

• 커서 개요• 커서 옵션과 사용방법• 커서 응용• 서버 커서와 클라이언트 커서

Page 4: SQL Server CURSOR

CURSOR 개요쿼리 결과인 행 집합을 한 행씩 처리하기 위한 방식Select 문의 결과처리를 위해 잠시 보관하는 행 집합

Page 5: SQL Server CURSOR

CURSOR 생성DECLARE SQLTAG_CURSOR GLOBAL

FOR SELECT Col1, Col2 FROM SQLTAG

Transact-SQL Extended SyntaxDECLARE cursor_name CURSOR [ LOCAL | GLOBAL ]

[ FORWARD_ONLY | SCROLL ][ STATIC | KEYSET | DYNAMIC |

FAST_FORWARD ][ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ][ TYPE_WARNING ]FOR select_statement[ FOR UPDATE [ OF column_name [ ,…n ] ] ]

[ ; ]

Page 6: SQL Server CURSOR

CURSOR LOCAL / GLOBAL지역 커서 (LOCAL)• 지정된 범위에서만 유효• 해당 범위를 벗어나면 자동으로 소멸전역 커서 (GLOBAL)• 모든 저장 프로시저나 일괄처리에서 참조 가능• 동일 세션에서만 참조 가능되도록 지역커서 사용 ( 왜 ?)• 글로벌 커서 생성 시 지역 커서에서 이미 사용되고 있는 동일이름으로 인해 충돌 가능성 있음

Page 7: SQL Server CURSOR

CURSOR 디폴트 값 확인• 커서를 정의할 때 형식을 지정하지 않으면 DB 기본값 생성• 기본값 GLOBAL (0 = GLOBAL, 1 = LOCAL)

• select name, database_Id, is_local_cursor_default from

master.sys.databases

• ALTER DATABASE DB 명 SET CURSOR_DEFAULT LO-

CAL/GLOBAL WITH NO_WAIT

Page 8: SQL Server CURSOR

CURSOR 처리 순서

Page 9: SQL Server CURSOR

CURSOR 종류옵션에 따라• 정적 커서 (STATIC)

• 키 집합 커서 (KEYSET)

• 동적 커서 (DYNAMIC)

Page 10: SQL Server CURSOR

CURSOR 종류실행 위치에 따라• DB 커서• 서버 커서• 클라이언트 커서 프로그램 커서

Page 11: SQL Server CURSOR

CURSOR 옵션정적 커서 (STATIC)

• DECLARE CUSOR_NAME CURSOR [INSENSI-

TIVE]

• OPEN 시 결과집합 전체를 tempdb 에 복사• SELECT 가능 (tempdb 에서 가져옴 )

• 원 본 테 이 블 의 UPDATE / DELETE / INSERT

미반영• 특정 시점의 데이터를 이용한 배치처리

Page 12: SQL Server CURSOR

CURSOR 옵션키 집합 커서 (KEYSET)

• DECLARE CUSOR_NAME CURSOR KEYSET

• OPEN 시 전체 KEY 값 을 tempdb 에 복사• SELECT 가능 ( 원본에서 가져옴 )

• 원본 테이블의 UPDATE 반영• 원본 테이블의 DELETE / INSERT 미반영• 원본 테이블에 고유 인덱스 필요

Page 13: SQL Server CURSOR

CURSOR 옵션동적 커서 (DYNAMIC)

• DECLARE CUSOR_NAME CURSOR DYNAMIC

• SELECT 가능 ( 원본에서 가져옴 )

• 원본 테이블의 UPDATE / DELETE / INSERT 반영

Page 14: SQL Server CURSOR

CURSOR 읽기 옵션FORWARD_ONLY SCROLL

READ_ONLY FAST_FORWARD

SCROLL_LOCKS OPTIMISTIC

아래 방향으로만 가능 양방향 가능

• 읽기 전용• WHERE CURRENT OF 사용한 원본 테이블 업데이트 불가

• FORWARD_ONLY 커서 생성• READ_ONLY 커서 생성

• 커서의 현재 행 UPDATE 시 비관적 동시성 제어인 LOCK 사용 • LOCK 사용하지 않음• 업데이트 시도 시 기존 값과 비교하여 변경이 없는 경우 업데이트 성공 , 이미 변경된 경우 오류 반환

Page 15: SQL Server CURSOR

CURSOR FETCH 옵션NEXT 다음 행 FETCH NETX FROM ~

PRIOR 이전 행 FETCH PRIOR FROM ~

LAST 최종 행 FETCH LAST FROM ~

FIRST 최초 행 FETCH FIRST FROM ~

ABSOLUTE 절대좌표 FETCH ABSOLUTE 6 FROM ~

RELATIVE 상대좌표 FETCH RELATIVE 3 FROM ~( 현재 좌표 기준에서 이동 )

Page 16: SQL Server CURSOR

CURSOR VS SQL(JOIN)

CURSOR SQL(JOIN)

Pros( 장점 )

직관적인 로직ANSI 구문 ( 호환성 )

복잡한 로직CONNECT BY, CTE

Cons( 단점 )

성능개선이 어려움(ROW 단위 처리 )

성능개선이 용이Warning( 주의 )

LOCK Escalation 가능성TOP 5000 제한 필요

Use( 사용 )

배치처리빌링 과금 , 운영툴 등 OLTP ( 게임 )

Page 17: SQL Server CURSOR

CURSOR 응용커서 사용조인 사용

DEMO : 05_SQL

계층 쿼리를 지원하지 않는 환경에서 손쉽게 구현 가능

Page 18: SQL Server CURSOR

서버 커서 , 클라이언트 커서DB 커서 DB 에서 선언하여 DB 에 만들어지는 커서 (tempdb)

서버 커서클라이언트에서 선언하여 서버에 만들어지는 커서클라이언트 커서클라이언트에서 선언하여 클라이언트에 만들어지는 커서

프로그램 커서

Page 19: SQL Server CURSOR

DB 커서와 프래그램 커서• DB 커서는 Fetch 등의 건별 처리가 DB 에서 실행• 프로그램 커서는 프로그램 ( 미들웨어 ) 에서 실행

DB 의 데이터를 프로그램 단에서 처리하기 위해 ODBC,

OLEDB, ADO 등에서 제공하는 API 함수 사용

Page 20: SQL Server CURSOR

서버 커서와 클라이언트 커서

서버 커서클라이언트 커서

Page 21: SQL Server CURSOR

서버 커서와 클라이언트 커서

서버 커서 클라이언트 커서선언 Rs.CursorLocation = Cursor-

LocationEnum

.adUseServer;

Rs.CursorLocation = CursorLocatio-

nEnum

.adUseClient;

위치 서버 메모리 클라이언트 메모리동작 서버 API 함수 클라이언트 캐시방식 중앙 집중 처리 분산처리특징 서버 부하 존재 전송 부하 존재

레코드셋의 포인터 ( 또는 결과집합 ) 가 위치하는 곳에 따라 서버와 클라이언트 구분

Page 22: SQL Server CURSOR

감사합니다