ISSUE
CATEGORY 별로 판매량 1등 상품을 뽑는 쿼리에서, CATEGORY parameter가 "|" 로 구분돼서 들어오기 때문에 cursor 를 사용하여 split 후 category 별로 계산한 쿼리가 있었다. 대용량 서비스에서 cursor 문법은 지양해야 한다는 것을 듣고 찾아보게 되었다.
우리 플랫폼 sp 에서는 기본적으로 적은 수의 CATEGORY(GROUP_CODE)를 처리하고 있어서 차이는 거의 없지만,
CURSOR 사용 시 내부적으로 임시테이블을 사용하기 때문에 성능에 영향을 미친다고 한다.
단점 위주로 설명하겠다.
-SP에서 사용 시
재컴파일 이슈:
CURSOR를 사용하면 일반적으로 사용자가 작성한 T-SQL 문과 CURSOR 내부 로직을 분리합니다. CURSOR 내부에는 반복적으로 실행되는 SELECT 문이 포함되며, CURSOR를 열 때마다 이 SELECT 문이 컴파일되고 최적화됩니다. CURSOR를 사용하면 데이터베이스 엔진은 반복적으로 컴파일 작업을 수행하므로 CPU 리소스를 소비하고 성능에 영향을 미칠 수 있습니다.
CPU 부하 이슈:
CURSOR를 사용하면 데이터베이스 엔진은 각 행을 가져와서 처리해야 하므로 CPU 사용량이 증가할 수 있습니다. 특히 큰 데이터 집합에서 CURSOR를 사용할 경우 CPU 부하가 크게 증가할 수 있습니다. 이는 서버 리소스가 고갈되고 성능이 저하되는 원인이 될 수 있습니다.
cursor 자체가 기본적으로 서버가 행 단위 처리하기 때문에 성능이 저하될 가능성이 있고, 또한 서버 부하 및 처리속도 감소를 발생시킬 수 있다 합니다.
임시 테이블이라 결과 집합을 메모리에 유지해야 하는데, 대용량 처리 시 이로 인해 메모리 사용량 급증 -> 메모리 부족으로 인한 성능 문제 발생 가능성이 있다.
해당 행에 락을 걸 수 있어 다른 트랜잭션,연결에 대해 병목현상 유발 가능성이 있다.
while 처리로 바꿔서 해결~ 웬만하면 쉽게 바꿀 수 있다.