Oracle 데이터베이스를 관리하다 보면, DBA_TAB_COLS와 DBA_TAB_COLUMNS 뷰의 차이점을 이해하는 것이 중요합니다. 특히, 컬럼을 삭제하거나 파티션 테이블에서 EXCHANGE PARTITION 작업을 수행할 때 이들 뷰의 특성을 알고 있어야 예상치 못한 문제를 방지할 수 있습니다.
이 뷰는 시스템에서 생성한 숨겨진 컬럼(system-generated hidden columns)을 포함하여 모든 컬럼 정보를 제공합니다. 따라서, 삭제된 컬럼이나 내부적으로 사용되는 컬럼도 이 뷰에서 확인할 수 있습니다.
이 뷰는 숨겨진 컬럼을 제외한, 사용자에게 노출된 컬럼 정보만을 제공합니다. 즉, 일반적으로 사용자가 정의한 컬럼들만 이 뷰에서 확인됩니다.
테이블에서 특정 컬럼을 삭제(DROP COLUMN)하면, Oracle은 즉시 해당 컬럼을 물리적으로 제거하지 않고 내부적으로 숨겨진 컬럼으로 표시합니다. 이러한 숨겨진 컬럼은 DBA_TAB_COLS 뷰에는 나타나지만, DBA_TAB_COLUMNS 뷰에는 나타나지 않습니다. 따라서, 삭제된 컬럼의 존재 여부를 확인하려면 DBA_TAB_COLS 뷰를 조회해야 합니다.
EXCHANGE PARTITION 연산은 파티션과 독립적인 테이블 간의 데이터를 교환하는 작업입니다. 이때, 교환 대상이 되는 파티션과 테이블은 구조적으로 완전히 동일해야 합니다. 즉, 컬럼의 수, 데이터 타입, 순서 등이 일치해야 합니다.
만약 테이블에서 컬럼을 삭제한 후 EXCHANGE PARTITION을 수행하려고 하면, 앞서 언급한 숨겨진 컬럼으로 인해 두 객체의 구조가 일치하지 않을 수 있습니다. 이는 DBA_TAB_COLS 뷰를 통해 확인할 수 있으며, 이 뷰에서 숨겨진 컬럼까지 모두 표시되므로, 구조적 불일치를 감지하는 데 도움이 됩니다.
이럴때는 아래명령어를 통해 딕셔너리에 존재하는 히든 컬럼을 삭제하면 된다고 합니다.
alter table 테이블이름 drop unused columns;
하지만 저의 경우는 컬럼을 삭제하고 dba_tab_cols로 보는데 히든컬럼으로 보이지 않네요.. 버전의 차이가 있나봅니다. (현재 버전 19c)