필기노트

MSSQL 커서 - 성능 최적화 본문

Database

MSSQL 커서 - 성능 최적화

우퐁코기 2022. 12. 3. 09:14
반응형

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

이 커서를 통한 업데이트를 방지합니다.

 

 

 

참고

 

DECLARE CURSOR(Transact-SQL) - SQL Server

DECLARE CURSOR(Transact-SQL)

learn.microsoft.com

 

FETCH_STATUS(Transact-SQL) - SQL Server

@@FETCH_STATUS(Transact-SQL)

learn.microsoft.com

 

[MSSQL] 커서 사용법 & 예제

커서란? 행 단위 작업을 효율적으로 하기 위한 방식으로 테이블에서 여러 개의 행을 조회한 후 쿼리의 결과를 한 행씩 처리하는 방식입니다. SELECT 한 결과(행 집합)를 반복 작업해줘야 할 경우

coding-factory.tistory.com

반응형
Comments