2018년 10월 20일 토요일

SSMS에서 프로시저를 실행했을 때 수행 결과가 부족하다 - SET ROWCOUNT 설정으로 인한 실수

시나리오
원격지 서버의 프로시저를 사용자 로컬 PC에서 수동으로 돌리고자 한다. 프로시저 결과로 대략 수백~수억 row가 insert될 것이라고 생각하는데 자꾸 500row만 insert가 되는 이상한 상황이 연출되었다. 아무리 프로시저 내 로직을 검증해봐도 이상이 없었고 유독 프로시저만 수행하면 결과가 부족한 현상을 경험하였다. SSMS의 버그인지, 원래 이렇게 유도를 한 것인지는 잘 모르겠지만 현상을 확인한 후 주의를 하고 있다.

원인


SSMS의 도구->옵션->쿼리실행->SQL Server ->일반 탭에서 SET ROWCOUNT를 500으로 맞춰놓았다. default는 0이며 set rowcount 0은 쿼리 결과를 제한 없이 모두 출력한다는 것이다. 여기에서 500으로 제한을 해둔 탓에 로컬 pc에서 원격지 프로시저를 수행하여도 로컬 pc의 set rowcount 500 설정에 막혀 결국 테이블에도 500 row만 insert되는 상황이었다. 결국 이를 풀어줌으로써 해결하였다.


증상재현

증상 재현을 위해 먼저 위와 5000 ROW가 들어있는 TEST 테이블을 생성하였다.

그리고 똑같은 스키마의 TBL_TEST_2와 프로시저를 생성하였다.



그리고 프로시저를 수행해보았다.
TRUNCATE TABLE TBL_TEST_2

EXEC USPS_TEST

SELECT COUNT(*)
FROM TBL_TEST_2


SSMS의 도구->옵션->쿼리실행->SQL Server ->일반 탭에서 SET ROWCOUNT를 500으로 맞춰놓았기 때문에 쿼리 결과가 500 row밖에 되지 않는 현상이 재현되었다.

이를 해결하기 위해 SSMS에서 SET ROWCOUTN를 0으로 풀어도 바로 해결이 되지 않고 세션을 새로 열어야 한다. 세션을 새로 열지 않으면 명시적으로 SET ROWCOUNT 0을 해당 세션창에서 한번수행해주어야 한다.



느낀점
일반적으로 FULL SCAN을 방지하기 위해 SSMS의 설정에서 최대 행 갯수를 제한해놓을 것이다. 하지만 이 설정으로 인해 수동으로 서버의 프로시저를 수행할 경우 원하는 결과가 나오지 않을 수 있다. 따라서 이런 상황이 발생할 수 있다는 것을 인지하고 있어야겠다.







댓글 없음:

댓글 쓰기

2022년 회고

 올해는 블로그 포스팅을 열심히 못했다. 개인적으로 지금까지 경험했던 내용들을 리마인드하자는 마인드로 한해를 보낸 것 같다.  대부분의 시간을 MLOps pipeline 구축하고 대부분을 최적화 하는데 시간을 많이 할애했다. 결국에는 MLops도 데이...