사용자가 데이터를 저장할때 테이블구성은 일반 테이블, 분할 테이블, 인덱스 구성 테이블, 클러스터 4가지가 있다. 일반 테이블은 통합된 하나의 테이블을 의미한다. 분할 테이블은 테이블의 정보가 너무 클때 검색속도를 높이기 위해 일정 기준으로 테이블을 분할하여 따로 저장하는 방식이다. 분할여부는 관리자만 알고, 어플리케이션 개발자는 알수없다. 인덱스 구성 테이블은 테이블 내에서 행을 정렬하여 저장하는 것으로 무결성이 훼손되기 때문에 현재는 사용하지 않는다. 클러스터 방식은 조인문으로 묶인 테이블을 1블록에 같이 불러오는 방식이다.
내장 데이터 유형은 아래 사진과 같다.
CHAR (N),NCHAR (N) : 고정길이 문자 타입
VARCHAR2 (N), NVARCHAR2 (N) : 가변길이 문자타입
NUMBER (P, S) : P는 자릿수, S는 소수점 이하 자릿수
DATE, TIMESTAMP : 날짜 타입 출력, DATE는 고정된 서식사용, TIMESTAMP는 사용자 지정 타입 사용.
BLOB, CLOB, NCLOB, BFILE : 테이블 밖에 저장된다.
RAW (N) : 이진데이터
LONG, LONG RAW :
ROWID, UROWID :
ROWID형식
ROWID는 64진수로 표현되며, 행의 GPS정보로서 인덱스에 저장되어있고, 테이블스페이스 안에서만 존재한다.
제한된 ROWID형식은 ROWID의 값을 블록번호, 행번호, 파일번호로 나누어 저장한다. 제한된 ROWID형식을 사용하면 ROWID의 표현값이 너무 크게 된다. 그래서 확장된 ROWID형식을 이용한다. 확장된 ROWID형식은 데이터 객체 번호, 상대 파일 번호, 행 번호, 블록 번호로 구성된다. 데이터 객체 번호는 Segment의 고유번호이다.
행의 구조는 블록안에 저장되는데 데이터 입출력은 블록단위로 이루어 지기때문에 의미가 없다. 그럼에도 그 구조를 한번 보면 행 헤더와 data길이, data로 이루어져 있다. 행 헤더에는 systemchange number가 저장되어 있다. 테이블의 행에 트랜젝션이 발생하면 undosegment에서 블록 헤더에 있는 transaction slot에서 systemchange number를 참조하여 이전의 데이터를 읽어와 보여준다. 만약 이 값이 수정되거나 덮어씌여져 이전 데이터가 지워진다면 ORA-01555 snapshot to old - rollback segment에러가 발생한다.
테이블을 생성할때 테이블을 합쳐서 저장하지 말고 별도의 다른 테이블스페이스에 분할하여 저장하는것이 좋다. 왜냐하면 장애가 발생했을시 확산이 안되기 때문이다. 하지만 합쳐서 저장하게 되면 속도가 빠르다. 두가지를 정하는것은 회사의 업무시스템에 따라 다르다.
행이전 및 체인화는 행이 너무 길어 분산저장될때 일어나는데 update시 자주 발생한다. 행이 블럭보다 크면 무조건 체인화 된다. 체인화 현상이 발생하면 index에서 rowid를 갱신하는 것이 아니라 rowid에 포인터를 입력해 지정된 열을 참조할 수 있게 한다. index에서 rowid를 변경하게 되면 더 큰 문제가 발생할 수 있기 때문에 직접변경하지 않는다. 체인화 현상은 오라클 시스템입장에서는 굉장히 번거롭기 때문에 좋은 현상은 아니다. 이를 방지하기 위한것이 PCTFREE와 PCTUSED방식이다.
참조 : <PCTFREE, PCTUSED>
테이블의 확장영역을 수동으로 할당하는 것은 예전에 dictionary management방식을 사용할때 시스템에 부담을 주지 않기 위해서 수동으로 설정했다. 최근에는 locally management에서는 자동으로 할당해도 시스템에 부담이 되지 않고 수동으로 할당할 경우에는 비효율적인 측면이 있어 자동으로 할당한다.
딕셔너리에서 갱신이 되는것이 있고 안되는 것이 있다. DML문을 이용해 변경되는 값은 갱신되지 않아서 쓰레기값이 나오는 경우가 많다. 따라서 확인하기 위해서는 갱신해서 참고해야 하는데 이 경우에는 모든 데이터를 하나씩 갱신 해주어야한다.
분할되지 않은 테이블을 재구성하는 방법은
ALTER TABLE 테이블명
MOVE [TABLESPACE 테이블스페이스명];
명령어를 사용한다. 이 명령어를 사용하면 같은 테이블스페이스에 재구성한다. 뒤에 이동할 테이블스페이스를 적어주면 테이블이 이동한다.
테이블의 물리적 정보를 얻기 위해서는 DBA_TABLES, DBA_OBJECTS 뷰에 질의하여 알수있다.
실습 : 테이블 스페이스를 생성해본다.
'교육 > Oracle' 카테고리의 다른 글
Day 48 (DB) (0) | 2020.01.28 |
---|---|
Day 46 (DB_인덱스) (0) | 2020.01.22 |
Day 44 (오라클 기초구성1) (0) | 2020.01.20 |
Day 44 (DB) (0) | 2020.01.20 |
Day 43 (UTF-8 Oracle, Php) (0) | 2020.01.17 |