2011-11-25 2 views
2

Informix DB의 테이블에 약 3 백만 행이 있습니다. 새 데이터를로드하기 전에 삭제해야합니다. 해당 열 중 하나에 기본 키가 있습니다. 같은 것을 삭제하려면, 나는 rowid 사용법을 생각했다. 내가 Informix 데이터베이스의 행 삭제

select rowid from table 

을 시도 할 때 그러나 -857 오류 [ROWID가 존재하지 않습니다]로 응답.

그래서 삭제 방법을 잘 모르겠습니다. 기본 키를 사용하는 삭제는 rowid 삭제와 비교할 때 값이 비싸기 때문에 기본 키를 사용하지 않는 것이 좋습니다.

위의 제안 사항이 도움이 될 것입니다.

답변

1

IDS라고 가정합니다. 얼마나 많은 새로운 행이로드되고 얼마나 자주이 프로세스가 반복됩니까? 참조 제한 조건과 뷰를 다시 설정해야하지만, 내 의견으로는 훨씬 좋습니다 테이블을 삭제하고 처음부터 새로 작성한 다음 데이터를로드 한 다음 색인을 작성하십시오. 모든 행을 삭제하는 경우 삭제 된 행은 여전히 ​​행의 끝에 NULL \ 0 플래그가있는 물리적으로 테이블에 남아 있기 때문에 새로운 행을로드 할 때 테이블 크기가 더 커져서 성능이 저하 될 것입니다! .. 새로운 인덱스를 생성 할 수있는 좋은 기회이기도하고 가능하면 가장 바람직한 순서로로드 데이터를 미리 정렬하십시오 (예 : CLUSTERED INDEX를 만들 때). 표현식이나 다른 유형의 테이블을 조각화하려면 ROWID가 창 밖으로 나옵니다. 단, 테이블이 조각화되지 않는다고 확신하는 경우 WITH ROWIDS를 사용하십시오. 테이블에 직렬 열이있는 경우 직렬 열을 외래 키로 사용하는 다른 테이블이 있습니까?

2

오류 -857이 발생하면 테이블이 조각화되어 있고 WITH ROWIDS 옵션없이 생성 된 것일 수 있습니다.

사용중인 Informix 버전과 플랫폼은 무엇입니까?

TRUNCATE TABLE 문을 사용하면 테이블의 모든 행을 매우 빠르게 삭제할 수 있습니다. 한 충분한 논리 로그 공간이 가지고있는

DELETE FROM TableName; 

: 그 실패

, 당신은 바로 감기를 사용할 수 있습니다. 그게 작동하지 않으면 기본 키 (또는 다른 편리한 열)의 범위에 따라 반복 된 DELETE 문을 수행해야합니다.

또는 테이블을 삭제 한 다음 WITH ROWIDS 절을 사용하여 새 테이블을 만들 것을 고려할 수 있습니다 (특히 WITH ROWIDS 절을 사용하지 않는 것이 좋지만 가상 열이 아닌 실제 열이됩니다). 그것은 비 단편화 된 테이블에 있습니다). 테이블 삭제 및 재 빌드의 단점 중 하나는 참조 제약 조건을 복원해야하고 테이블을 삭제할 때 테이블에 작성된 모든 뷰가 자동으로 삭제되므로 다시 복원해야한다는 것입니다.