2012-03-01 3 views
2

따라서 본질적으로 Finding duplicate records의 후속 질문입니다.Oracle의 ORA_ROWSCN 동작 이해

우리는 매일 텍스트 파일에서 데이터 가져 오기를 수행하고 182 개의 파일에 두 번 씩 분산 된 10163 개의 레코드를 가져옵니다. 위에서 언급 한 쿼리를 실행하여 중복 된 레코드를 찾으면 총 레코드 수는 10174이며 이는 파일에 포함 된 것보다 많은 11 개의 레코드입니다. 필자는 정확하게 동일한 두 레코드의 확실성에 대해 가정했으며 유효한 레코드도 쿼리에서 고려되었습니다. 그래서 나는 timestamp 필드를 사용하여 오늘 실행 된 모든 레코드를 찾고 (따라서 중복 행을 추가하는 것을 끝내는 것) 최고의 방법이라고 생각했습니다.

select count(*) from my_table 
where TRUNC(SCN_TO_TIMESTAMP(ORA_ROWSCN)) = '01-MAR-2012' 
; 

그러나, 카운트가 내가 들어있는 폴더에서 다음 명령을 실행하여 파일의 전체 라인이 10163이라고 확신 지금 여전히 10168. 더 예이다 : 나는 다음과 같은 쿼리를 사용하여 ORA_ROWSCN을 사용 모든 파일. wc -l *.txt.

어떤 행이 실제로 두 번 삽입되는지 확인할 수 있습니까?

답변

13

기본적으로 ORA_ROWSCN은 행 수준이 아닌 블록 수준에 저장됩니다. 이 테이블은 테이블이 원래 ROWDEPENDENCIES으로 설정된 경우에만 행 수준에 저장됩니다. 단일 블록에 테이블의 많은 행을 넣을 수 있고 테이블의 기존 최고 수위 표시 위에 새 데이터를 삽입하는 데 APPEND 힌트를 사용하지 않는다고 가정하면 이미있는 블록에 새 데이터를 삽입 할 가능성이 높습니다 기존 데이터가 있습니다. 기본적으로 이는 블록의 모든 행에있는 ORA_ROWSCN을 변경하여 실제로 삽입 된 것보다 많은 행을 계산하도록합니다.

행에 DML이 마지막으로있을 때 ORA_ROWSCN이 상한 일 뿐이므로 기본값 인 테이블에 CREATE_DATE 열을 추가하여 오늘 삽입 된 행 수를 확인하는 것이 훨씬 더 일반적입니다 INSERT이 실행 된 후에 SYSDATE으로 또는 SQL%ROWCOUNT에 의존해야합니다 (물론 모든 행을 삽입하기 위해 단일 INSERT 문을 사용한다고 가정).

일반적으로 ORA_ROWSCN 및 함수를 사용하면 테이블이 ROWDEPENDENCIES으로 작성된 경우에도 행이 삽입 된시기를 식별하는 데 문제가 있습니다. ORA_ROWSCN은 시스템 변경 번호 인 Oracle SCN을 반환합니다. 이는 특정 변경 (즉, 거래)에 대한 고유 식별자입니다. 따라서 SCN과 시간의 직접적인 연관성은 없습니다. 데이터베이스가 SCN을 100 만 배 이상 빠르게 생성 할 수 있으며 SCN 1이 SCN 1과 수년 차이가 날 수 있습니다. Oracle 백그라운드 프로세스 SMON은 테이블을 유지 관리합니다 SCN 값을 대략적인 타임 스탬프로 매핑하지만 제한된 기간 동안 만 해당 데이터를 유지합니다. 그렇지 않으면 데이터베이스가 타임 스탬프 매핑에 SCN을 저장하는 수십억 개의 행 테이블로 끝납니다. 행이 일주일 전에 삽입 된 경우 (정확한 제한은 데이터베이스 및 데이터베이스 버전에 따라 다름) SCN_TO_TIMESTAMP은 SCN을 타임 스탬프로 변환 할 수 없으며 오류를 반환합니다.

+0

감사합니다. 저스틴. 'ORA_ROWSCN'을 포함하는 쿼리를 위해 구분 된 파일로 데이터를 내보낼 수 있는지 알려주시겠습니까? SQL Developer에서 데이터를 내보내려고하는데 내보내기가 알 수없는 열'ORA_ROWSCN'과 함께 실패합니다. –

+0

@ darkie15 - 할 수 있어야합니다. 왜 SCN을 플랫 파일로 만들면 얻을 수있는 이점이 좋을지 모르겠습니다. –

+0

파일에 SCN을 추가하는 것을 의미하지는 않지만 내 테이블의 데이터 탭을 마우스 오른쪽 버튼으로 클릭하고 내보내기를 클릭하고 ORA_ROWSCN을 입력 한 where 절에서 OR_ROWSCN이 유효하지 않다는 오류가 발생했습니다. 여하튼 나는 그것을 이해했다. –