안녕하세요, sql server를 사용하고 있는 개발자 입니다.
sql server에서 이상한 증상이 발견되어, 혹시 버그는 아닌가 해서 문의 드립니다.
여러 단계의 프로세스 중, 먼저 select한 getdate()보다 나중에 select한 getdate()가 더 과거의 값이 select되는 증상을 발견하였습니다.
이를 테스트 하기 위해 별도의 쿼리를 작성하여 테스트를 해보니, 동일한 증상이 많이 나타납니다.
혹시, 연속으로 getdate()를 여러번 진행할 경우에 그런 증상이 나타날 수 있는 것인지요?
datetime형식의 경우 .000, .003 또는 .007초 단위로 반올림 되는 사항과 연관이 있나 싶었지만,
그 문제는 아닌것 같고, 반올림 여부와 상관없이 오류가 있는 듯 합니다.
실제 소스는 아래와 같은 패턴이며 테스트 쿼리는 따로 작성했습니다.
실제 소스 패턴
1. set @변수1 = getdate()
2. 필요한 프로세스 처리
3. set @변수2 = getdate()
4. 필요한 프로세스 처리
5. @변수1과 @변수2와 관련한 처리 시 오동작(if문이나 where문에서 사용)
GETDATE()의 오동작 테스트 쿼리
SET NOCOUNT ON;DECLARE @loopCount INT
, @loopMaxCount INT
, @beforeDatetime DATETIME
, @currentDatetime DATETIME
SET @loopCount = 1
SET @loopMaxCount = 100000000
SET @beforeDatetime = GETDATE()
WHILE @loopCount <= @loopMaxCount
BEGIN
SET @currentDatetime = GETDATE()
IF @beforeDatetime>@currentDatetime
BEGIN
SELECT @loopCount AS 'No', @beforeDatetime AS 'beforeDatetime', @currentDatetime AS 'currentDatetime'
END
SET @beforeDatetime = @currentDatetime
SET @loopCount = @loopCount + 1
END
증상은 2005, 2014에서 나타나는것을 확인했지만, 모든 버전에서 확인하기가 힘들기 때문에 문의 드립니다.
또한, 위 쿼리로 테스트 시 증상이 무조건 나오는 것도 아니고 나왔다 안나왔다 혹은 조금 나왔다 많이 나왔다 합니다.
위 증상에 대해서 확인이 가능했으면 좋겠습니다.
Comment 4
-
처리짱
2015.12.01 11:11
-
Jaden
2015.12.01 13:08
자동 동기화는 아닌 것 같습니다. 그런 부분이 없기도 하고,
테스트 쿼리 보시면, loop돌리면서 바로 체크하는 방식이기 때문이기도 합니다.
쿼리를 조금 수정하여 SYSDATETIME()까지 포함한 결과 화면을 올립니다.
-
minsouk
2015.12.04 10:06
정확한 원인분석을 위해서는 까봐야 알 듯 합니다.
혹자는 0.003 * 2 범위내 오류라고 하지만 그 스샷을 보면 그 범위를 넘어가는 오류가 있네요.
원인분석이 안되면 에러가 없는 sysdatetime 을 쓰는게 좋을듯 합니다.
-
Jaden
2015.12.04 17:19
답변 감사합니다. 그럼 아직까지는 특별히 이슈화 된 사항이라거나 그런건 없는건가 보네요..
말씀하신대로 좀 더 자세히 봐야겠지만, 여러가지 이유(sql이 설치된 장비 이슈, sql server설정이나 기타등등)가 원인일 수도 있겠지만
확인이 불가능할 경우에는 할 수 없이 sysdatetime을 사용해야 겠군요...
다시 한번 답변 감사합니다. (--)(__)
설마 그럴리가 없는데 하면서 테스트 올리신거를 돌리고 계속 기다려 보니 역시나 였습니다..
시간차이가 얼마나 나는지요??
제가 소설을 한번 써보겠습니다.
현재 서버 피시에 날짜시간 맞추는 부분에 자동 동기화 설정을 걸어 놓았습니다.
GETDATE()를 날리는데 어느 순간 동기화 시간이 되어 동기화를 실행하였고
동기화를 마치니 이전에 설정되어 있던시간보다 앞으로 당겨 졌습니다.
소설 끝 !!