2010-05-19 6 views
1

저는 현재 회사의 관리 시스템을 개선하여 네트워크 트래픽 측면에서 좀 더 정교하게 운영하고 있습니다. 지금은 내가 마지막으로 물어 본 이후로 (모든 사용자가) 수정 한 레코드 만 쿼리하는 효과적인 방법을 찾으려고합니다.SQL Server 데이터베이스에서 수정 된 레코드 목록을 얻으려면 어떻게합니까?

응용 프로그램이 시작되면 작업 정보를로드하고 로컬로 다음과 같이 캐시합니다 (SELECT * FROM jobs).

레코드가 수정 된 날짜/시간은 ala UPDATE jobs SET [email protected], LastModified=GetDate() WHERE [email protected]입니다. 모든 사용자가 나는 다음과 같은 목록 요청한 마지막 시간 이후에 수정 된 모든 레코드에 질의 작업의 목록을 요청

: 요청의 SELECT * FROM jobs WHERE LastModified>[email protected]을하고 날짜를 저장/시간이 @LastRequest로 통과 할 때 사용자가 다시 묻습니다. 이론적으로 이는 마지막 요청 이후 수정 된 레코드 만 반환합니다.

내가 겪고있는 문제는 사용자의 날짜/시간이 서버의 날짜/시간과 동기화되지 않은 경우와 인덱싱되지 않은 날짜/시간 열을 쿼리 할 때 서버로드와 동기화되지 않는 경우입니다. 날짜/시간 정보를 쿼리하는보다 효과적인 시스템이 있습니까?

답변

2

SQL Server 외부에 있기 때문에 날짜 - 시간에 의존 할 것인지 모르겠다. 당신은 ID 열이있는 경우

, 나는이 테이블에 (존재하는 경우 또는 업데이트) UserId, LastQueryDateTime, LastIdRetrieved

당신이 기본 테이블을 조회 할 때마다, 새로운 사용자에 대한 행을 삽입 할 테이블의 최대 ID를 해당 열을 사용합니다. 또한 쿼리는이 테이블의 행을 읽어 LastIdRetrieved를 가져와 where 절에서 사용합니다.

모든 코드가 클라이언트 컴퓨터가 아닌 SQL Server에서 GetDate()를 삽입하도록 선택하면이 모든 작업이 제거 될 수 있지만 그 작업은 상당히 노동 집약적입니다.

+1

+1 서버 측 datetimes에 대해서는 +1이 작동하지만, 다른 많은 이유로 중요합니다. –

0

가장 쉬운 해결책은 선두로서 한 번 정착하는 것 같습니다.

한 가지 방법은 서버 시간을 정하는 것입니다. 행을 갱신 한 후 select LastModified where JobID = @JobID에 의해 리턴 된 값을 클라이언트 측에 저장하십시오. 그러면 클라이언트는 서버 시간만을 참조로 사용하여 효과적으로 쿼리 할 수 ​​있습니다.

0

Active Directory 및 DNS와 마찬가지로 업데이트 시퀀스 번호 (USN)를 사용하여 마지막 복제 이후 변경된 개체를 추적합니다. 시작 번호를 선택하고 작업 테이블의 레코드를 삽입하거나 수정할 때마다 가장 최근 USN을 씁니다. 마지막 Select 쿼리가 실행될 때 USN을 추적하면 마지막 쿼리 이후에 변경된 레코드를 항상 알 수 있습니다. 예를 들어 ... 당신이 채용 정보를 얻을 때, 너무 서버 시간 얻을

Set LastQryUSN = 100 

Update Jobs Set USN=101, ... 

Update Jobs Set USN=102, ... 

Insert Jobs (USN, ...) Values (103, ...) 

Select * From Jobs Where USN > LastQryUSN 

Set LastQryUSN = 103 

Update Jobs Set USN=104 

Insert Jobs (USN, ...) Values (105, ...) 

Select * From Jobs Where USN > LastQryUSN 

Set LastQryUSN = 105 

... 그래서

0

에 : 당신은 최소 날짜로 전달

DECLARE @now DATETIME = GETUTCDATE(); 

SELECT @now AS [ServerTime], * FROM Jobs WHERE Modified >= @LastModified; 

처음 @LastModified. 이후의 각 호출에서 마지막 호출에서 반환 된 ServerTime을 전달합니다. 이렇게하면 클라이언트 시간이 방정식에서 제거됩니다.

서버로드에 대한 대답은 수정 된 열에 인덱스를 추가하는 것이 분명합니다.

그리고 더 많은 adice : 서버에서도 로컬 시간을 사용하지 마십시오. 항상 UTC 시간을 사용하고 수정 된 시간에 UTC 시간을 저장하십시오. 지금 당장 귀하의 프로그램은 일광 절약 시간제 변경이 설정되거나 제거 될 때 연 2 회 완전하게 망가져 있습니다.

+0

좋았지 만 서버 시간이 앞으로 나아갈 수 있다고 보장 할 수는 없습니다.이 쿼리는 주변 쿼리를 통해 "잃어버린"데이터를 잃을 수 있습니다. 서버는 자신의 시간을 활성 디렉토리에 정기적으로 동기화하지만, 작은 점프를 앞뒤로 가져 오지는 않습니다. – TomTom

0

현재 SQL Server에는 변경 내용 추적 기능이 있으므로 정확히 사용할 수 있습니다. 추적하려는 테이블에서 변경 내용 추적 만 사용하면됩니다.

관련 문제