SQL Server CURSOR

Post on 18-Jan-2017

396 views 3 download

Transcript of SQL Server CURSOR

CURSOR

2015

발표자 소개

강성욱SQL Server MVPBlog : http://sqlmvp.krFacebook : facebook.com/sqlmvp강의 및 컨설팅 문의 : swkang@codeclassic.systems

Agenda

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

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

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 ] ] ]

[ ; ]

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

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

CURSOR 처리 순서

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

• 키 집합 커서 (KEYSET)

• 동적 커서 (DYNAMIC)

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

CURSOR 옵션정적 커서 (STATIC)

• DECLARE CUSOR_NAME CURSOR [INSENSI-

TIVE]

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

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

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

CURSOR 옵션키 집합 커서 (KEYSET)

• DECLARE CUSOR_NAME CURSOR KEYSET

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

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

CURSOR 옵션동적 커서 (DYNAMIC)

• DECLARE CUSOR_NAME CURSOR DYNAMIC

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

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

CURSOR 읽기 옵션FORWARD_ONLY SCROLL

READ_ONLY FAST_FORWARD

SCROLL_LOCKS OPTIMISTIC

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

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

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

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

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 ~( 현재 좌표 기준에서 이동 )

CURSOR VS SQL(JOIN)

CURSOR SQL(JOIN)

Pros( 장점 )

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

복잡한 로직CONNECT BY, CTE

Cons( 단점 )

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

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

LOCK Escalation 가능성TOP 5000 제한 필요

Use( 사용 )

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

CURSOR 응용커서 사용조인 사용

DEMO : 05_SQL

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

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

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

프로그램 커서

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

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

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

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

서버 커서클라이언트 커서

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

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

LocationEnum

.adUseServer;

Rs.CursorLocation = CursorLocatio-

nEnum

.adUseClient;

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

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

감사합니다