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내에 특별한 로직이 없는한..
댓글 없음:
댓글 쓰기