안녕하세요,
연이은 질문에 죄송하지만 도저히 해결이 되지 않아 질문드립니다.
멀쩡히 잘 작동하던 프로그램(A)이 갑자기 하나의 쿼리에서 계속 Timeout 에러가 발생하고 있는데
어떻게 해결해야할지 모르겠습니다.
(Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.)
상황 설명을 드리자면 2개의 프로그램이 관여되어 있습니다.
A : DB 에서 데이터를 Select(Select X Inner Join Y ~) 하는 프로그램
B : 다른 PC 에서 데이터를 가져와 DB 에 Insert 하는 프로그램
때문에 B 는 계속해서 Select, Insert 작업이 이루어지고, 추가로 종종 기간이 오래된 데이터들에 대해서는 Delete 도 이루어집니다.
그런데 A 프로그램의 문제가 되는 쿼리(Select) 가 원래는 아무 문제 없이 작동되었는데
몇일 전 부터 계속 실행되지 못하고 결국 TimeOut 에러가 발생합니다.
참고로 문제의 쿼리 이전에 다른 테이블을 Select 하는 쿼리는 지금도 문제 없이 작동하고 있으며,
B 프로그램도 계속 문제 없이 작동하고 있습니다.
제가 원인 해결을 위해 구글링을 통하여 시도해 본 방법들은 아래와 같습니다.
1. CommandTimeOut 시간 조정
시간을 0(무한)으로 설정해도 쿼리 실행이 되지 않아 무관한 듯 함.
2. WITH (NOLOCK) 을 이용한 Select
일반 Select 문은 효과가 있는 것을 확인하였으나, Join 을 이용한 Select 에는 영향이 없는 듯 함.
3. Full Backup 을 통한 Transaction Log 백업
해결 안됨.
4. Transaction Log Shrink
해결 안됨.
5. Index Rebuild
굉장히 오랜 시간이 걸렸지만, 해결 안됨.
6. Statistics Rebuild
앞으로 시도 예정. 해결 여부 모름.
이 외에 더 시도해볼 방법이 무엇이 더 있을까요?
지난번에도 이와 유사한 에러가 있었지만 그 땐 급하여 DB 를 새로 만들어 데이터를 다시 채웠습니다.
그렇게 잠시 해결이 된 듯 하였는데 또 문제가 다시 발생했네요.
문제가 발생할 때 마다 계속 DB 를 지우고 다시 만들수가 없어 원인을 파악해보려고 합니다.
관련하여 아시는 분은 불확실해도 좋으니 꼭 답변 주시면 감사하겠습니다.
Comment 1
-
이리
2020.08.05 13:55
해당 쿼리의 실행계획을 확인해 보시고 쿼리 실행중에 대기 유형이 무언지도 한번 확인해보세요