2024년 1월 7일 일요일

MSSQL TOP, NOLOCK관련 SQLServerException 쿼리시간 초과 에러관련 내용 정리

MSSQL안에 테이블 조회 시 간혈적으로 타임아웃이 발생되는데 정상조회 시 약 30초가 소요됨 왜 타임아웃이 발생되는 걸까? 이에 궁금한 부분을 확인 내용을 정리

조회 조건은

  • 쿼리에는 TOP구문으로 데이터 존재 유무 확인
  • [테이블명] with (nolock) 구문 포함
  • PO JDBC Sender채널 > Advanced에 'sqlquerytimeout' 파라메터 추가

TOP이란?

  • 테이블 레코드 조회 후 결과에 대해 상위 몇개만 표시하는 구문 → 일단 전체레코드에 대한 조회?
  • SELECT TOP [조회 레코드 수] [컬럼] FROM [테이블명] WHERE [조건] 처럼 쓰임
  • ORDER BY 관련
    • 같이 사용하지 않으면 임의 순서로 반환
    • 같이 사용하면 처음 순서로부터 행을 반환
  • 조회할 레코드 수는 상수,변수,백분율로 사용 가능
  • WITH TIES와 사용하면 중복값 포함한 결과
  • TOP문 동작
    • TOP 3일때 3개의 배열 생성
    • 배열에 조회된 값들이 채워짐(ORDER BY없는 경우)
    • ORDERY BY이 있다면 그 조건에 따라 반복적인 프로세스를 진행하는듯?
  • DELETE,UPDATE,MERGE,UNION 등에 사용 시 생각했던대로 처리가 안될수 있음 → 예를들어 더 많은 레코드가 삭제되거나 잘못된 값의 수정 등이 발생될수 있다고 함
  • Oracle의 ROWNUM, MYSQL Limit와 유사하게 사용 가능하는듯

WITH(NOLOCK)이란?

  • SELECT [컬럼] FROM [테이블명] WITH (NOLOCK) WHERE [조건] 처럼 쓰임
  • MSSQL은 기본적으로 SELECT를 할때 공유잠금이 걸림 격리레벨은 Read Uncommitted와 같음
  • 공유잠금(S) 외에 업데이트(U),베타(X)가 존재
  • MSSQL의 기본 격리레벨(ISOLATION LEVEL)은 Read Committed
  • NOLOCK가 있는 경우 테이블이 작업중인경우 끝나야 다음 작업가능
  • NOLOCK가 없는 상태로 실행 시 BLOCK이 걸려 DB의 성능 저하발생
  • 여러 테이블 조인하는 경우 잠금을 풀어주며 가져오는게 좋다함
  • 프로시저 내에서 사용 시 시작부분만 구문을 추가해주면 됨
  • 프로시저에는 SET TRANSACTION ISOLATON LEVEL READ UNCOMMITTED 사용
  • 잠금을 걸지 않아 데드락,교착상태가 발생되지 않음
  • 롤백될수 있는 데이터까지 읽을수 있음(일관성,정합성에 영향)

조회 시 TOP1, WITH (NOLOCK) 구문만 있는데 'SQLServerException: 쿼리 시간이 초과되었습니다' 에러가 발생된다면? 모르겠음
다만 JDBC Sender 채널에 Poll Interval과 동일하게 sqlquerytimeout값을 셋팅해주고 그래도 에러가 발생된다면? 해당 DB담당한테 문의를 해봐야할듯 싶음 
이유는 몇천건 조회해오는데 30~50초가 걸린다면 쿼리나 뷰에 확인이 필요해보임 PO내에 특별한 로직이 없는한..

댓글 없음:

댓글 쓰기