일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- spring
- transferTo
- 홈스쿨링
- 튜닝
- 재귀멤버
- TRANCOUNT
- getChannel()
- 요약
- SQLSTATE=42705
- SQL
- 앵커멤버
- git
- java
- dm_exec_requests
- 디스패처서블릿
- 프론트컨트롤러
- 아이
- 자바
- 함수
- MSSQL
- renameTo
- XWPF
- ERROR_MESSAGE
- HWPF
- XACT_STATE
- 진경혜
- 요청매핑
- 교육법
- 스프링
- 배치
- Today
- Total
필기노트
MSSQL 커서 - 성능 최적화 본문
1. 커서
행 단위 작업을 효율적으로 하기 위한 방식으로 테이블에서 여러 개의 행을 조회한 후 쿼리의 결과를 한 행씩 처리하는 방식. 보통 DML(SELECT, UPDATE, DELETE, INSERT)등으로 이뤄진다.
DECLARE @ID AS INT
DECLARE @AGE AS INT
DECLARE CUR CURSOR LOCAL FAST_FORWARD FOR
SELECT ID, AGE
FROM userTbl
WHERE 1=1
OPEN CUR
FETCH NEXT FROM CUR INTO @ID, @AGE
WHILE @@FETCH_STATUS = 0
BEGIN
-- UPDATE OR INSERT OR DELETE
FETCH NEXT FROM CUR INTO @ID, @AGE
END
CLOSE CUR
DEALLOCATE CUR
1) DECLARE CURSOR
커서의 이름과 옵션, 조회하고자 하는 결과값을 SELECT문을 이용해서 선언.
2) OPEN
결과 세트를 채우고 FETCH는 결과 세트에서 행을 반환합니다.
3) @@FETCH_STATUS = 0
0은 FETCH 문이 성공적으로 수행되었습니다. 그 외에는 실패. 커서의 마지막행이 될때까지 반복.
연결의 모든 커서에 전역으로 적용되므로 신중히 사용하세요.
4) FETCH
결과 데이터셋의 다음 행으로 커서를 이동합니다.
5) CLOSE
커서와 연결된 현재 결과 세트를 해제합니다.
6) DEALLOCATE
커서에서 사용된 리소스를 해제합니다.
2. MSSQL 커서 사용 시 성능이슈와 최적화
커서를 되도록 사용하지 말라는 이유는 SQL Server의 성능에 나쁜 영향을 미치기 때문이다.
물론, 적은 양의 데이터에 커서를 사용하는 것은 그다지 문제가 되지 않지만,
많은 양의 데이터에 사용하거나, 커서가 자주 호출된다면 시스템의 부하가 많이 발생할 수 밖에 없다.
1) LOCAL
커서 범위를 커서가 생성된 일괄 처리, 저장 프로시저, 트리거에 대해 로컬로 지정합니다.
커서 이름은 지정된 범위 내에서만 유효합니다.
2) FAST_FORWARD
성능 최적화가 설정된 FORWARD_ONLY, READ_ONLY 커서를 지정합니다.
성능 측면에서 가장 바람직한 옵션
2-1) FORWARD_ONLY
커서가 앞으로만 이동하고 첫 번째 행에서 마지막 행까지 스크롤할 수 있도록 지정합니다.
2-2) READ_ONLY
이 커서를 통한 업데이트를 방지합니다.
참고
'Database' 카테고리의 다른 글
MSSQL 프로파일러 사용하기 (0) | 2022.12.06 |
---|---|
MSSQL 여러행을 한줄로 나타내기 (0) | 2022.12.06 |
MSSQL 임시테이블 간단하게 생성하는 방법 INTO (0) | 2022.12.03 |
SQL Sever 저장 프로시저, 함수 템플릿 생성하는 방법 (0) | 2022.12.03 |
MSSQL 저장 프로시저를 통한 FTP 서버와 파일 전송 (0) | 2022.12.03 |