2017-02-10 7 views
0

ETL Datastage를 통해 DB2 테이블에서 Netezza로 데이터를로드하려고합니다. 이것은 타임 스탬프 열에 대한 델타로드입니다. 그래서 소스 SQL은 내가 그 결과 다음 쿼리 아래에 달려있어 Netezza를 테이블에 데이터를로드 한 후ETL 데이터 저장소를 통해 데이터를로드하는 동안 누락 된 데이터

select * from db2_table where timestamp_column > '2017-02-10 08:24:00'; 

같은.

select max(timestamp_column) from netezza_table; 

반환 '2017-02-10 11:17:56' 나에게 좋아 보인다

.

그러나 timestamp_column이 '2017-02-10 11:17:54' 인 DB2 테이블에 레코드가 있음을 알았지 만 해당 데이터가 대상 Netezza 테이블에 없습니다.

이것은 일반적인 문제는 아니지만 문제가 발생하면 누락 된 레코드의 timestamp_column 값이 1 초 또는 2 초 미만임을 확인했습니다.

제 질문은 max(timestamp_column) 값이 Netezza의 '2017-02-10 11:17:56' 일 경우, ETL 작업이 '2017-02-10 11:17:54' 레코드를 가져온 것입니다.

어떻게이 기록을 놓칠 수 있습니까?

+0

내가 추가 한 서식을 제거한 이유가 무엇입니까? 당신의 질문은 그것 없이는 읽기가 아주 어렵습니다. – mustaccio

+0

안녕하세요, 사과드립니다. 그것은 실수로 일어난 일입니다. – Amlan

답변

0

행이 ETL 작업에 의해 읽 t 진 후 '2017-02-10 11:17:54' 레코드를 갱신 한 트랜잭션이 확약되었을 가능성이 있습니다. DB2 데이터베이스의 기본 격리 수준 (DB2는 LUW 용이라고 가정 함)은 CS이며 커서를 처리 할 때 현재 행만 잠그고 다른 트랜잭션은 이미 읽은 행을 갱신 할 수 있습니다.

ETL 작업의 분리 레벨을 RR로 증가시켜 결과 세트가 읽 t지기 전까지 변경되지 않도록 시도 할 수 있지만 DB2 측에서 갱신의 동시성에 영향을 L (니다.

+0

귀하의 의견을 보내 주셔서 감사합니다. 내 ETL 작업의 격리 수준은 RU입니다. 원본 테이블은 트랜잭션 테이블이며 초당 여러 레코드가 삽입됩니다. 그래서이 문제를 해결하는 가장 좋은 방법은 무엇입니까. – Amlan

+0

글쎄, 그것은 당신에게 무엇이 더 중요한지에 달려있다 : 일관성 또는 동시성. 일관성있는 소스 테이블의 스냅 샷이 필요하다면, 업데이트를 막고 동시성을 없애야합니다. 동시성을 희생 할 수 없으면 다음 ETL이 실행될 때까지 약간 일관성없는 데이터로 살아야합니다. – mustaccio

+0

예, 문제는 다음 번에 ETL이 소스 테이블에서 timestamp_column> '2017-02-10 11:17:56' (이 작업을 통해 델타 레코드를로드 할 때) 데이터를 가져옵니다. 그래서 누락 된 데이터는 내 대상 테이블에서 사용할 수 없습니다. – Amlan

0

문제점을 해결하는 방법은 행 변경 시간 소인 일 수 있습니다. 이 타임 스탬프는 삽입 또는 업데이트시 자동으로 DB2에 의해 생성되므로 델타를 결정하는 완벽한 솔루션입니다. 때문에 당신은 또한 "숨겨진"로이 열을 정의 할 수있는 DDL 변화의 충돌을 피하기 위해이

rct timestamp not null generated always for each row on update as row change timestamp 

같은 소스 테이블에 추가 열을 추가합니다. 즉, 명시 적으로 선택할 수는 있지만 실행시 반환되지 않습니다.

SELECT * FROM tab