아흐..

지난 주 스터디 하면서 자신있게 Partition Table 과 관련하여 발표 도중

Partition Local index 에서 맨붕이 와버렸다..


그래도 내가 알려주는거에 대한 책임감(??변명..) 때문에 다음에 다시 발표하겠다 한 후 

이제서야 테스트 하면서 결과에 대해서 공유해 본다.


1. 파티션 테이블 생성


SQL> create table test_a

(col1 number,

col2 number,

col3 varchar2(20))

Partition by range (col1, col2)

(Partition part_test_a_1 values less than (10, 100),

Partition part_test_a_2 values less than (20, 200) ,

Partition part_test_a_3 values less than (30, 300) ,

Partition part_test_a_4 values less than (40, 400) );


2. Local Index 생성
(여기서 맨붕이 왔다. 내가 테스트한 부분은 아래와 같이 생성하였으며 이렇게 생성해야만 하는걸로 알고 있었다..)

SQL> create Index ix_test_a on test_a(col1, col2) Local

(Partition in_test_a_1 ,

Partition in_test_a_2 ,

Partition in_test_a_3 ,

Partition in_test_a_4 );


조회해 보면 아래와 같다



하지만 책에는 아래와 같이 나와 있다.

SQL> create index ix_test_a on test_a(col1, col2) local;



확인해 보면 partition_name 만 틀릴 뿐 나머지는 동일하다.


partition name 은 어떻게 되는걸까?

Table를 다시 생성해 본다


SQL> create table test_c

(col1 number,

col2 number,

col3 varchar2(20))

Partition by range (col1, col2)

(Partition test_c_1 values less than (10, 100),

Partition test_c_2 values less than (20, 200) ,

Partition test_c_3 values less than (30, 300) ,

Partition test_c_4 values less than (40, 400) );


SQL> create index ix_test_c on test_c(col1, col2) local;



Index Partition_Name은 명시해 줄 경우 명시된 partition 이름으로 가며, 

명시안하는 경우 Partition Table의 partition name을 따라가는 것을 확인할 수 있다.



왜 이렇게 쉬운 부분에서 멘붕이 오냐고 질책할 수 있지만...내 잘못입니다...ㅠㅠ

테스트 꼭 해보고 책도 한번씩 쿼리 다 작성해서 결과확인 후 진행 하도록 하겠습니다.

죄송합니다.ㅠ


한가지 더 테스트로 Local index 를 명시하되, 파티션 table과 동일한 갯수로 생성을 안하면 어떻게 되는걸까,


SQL> create Index ix_test_a on test_a(col1, col2) Local

(Partition in_test_a_1 ,

Partition in_test_a_2 ,

Partition in_test_a_3);



우리가 책에서 배웠듯이 에러가 발생한다.


아래는 내가 어떤 자료를 보고 정리한 내용이다.



구분

적용 기준 및 고려 사항

비 파티션

-       파티션 키 칼럼이 조건절에 누락되면 여러 인덱스 파티션을 액세스해야 하므로 비효율적. 특히, OLTP 환경에서 성능에 미치는 영향이 크므로 비파티셔닝 전략이 유용할 수 있음


-       NL Join 에서 파티션 키에 대한 넓은 범위검색 조건을 가진 Inner 테이블 액세스 용도로 인덱스 파티션이 사용된다면 효율적 -> 비파티션 인덱스 사용을 고려


-       파티션 인덱스를 이용하면 sort order by 대체 효과 상실. Sort 연산을 대체함으로써 부분범위 처리를 활용하고자 할 땐 비파티셔닝 전략이 유용


-       테이블 파티션 이동, 삭제 등의 작업 시 unusable 되므로 적용 시 주의

Global Prefixed

     - 인덱스 경합 분산에 효과적


     - 여러 Local 인덱스 파티션을 액세스하는 것이 비효율적일 때 대안으로 활용 가능


     - 테이블 파티션 이동, 삭제 등의 작업 시 unusable 되므로 적용 시 주의

Local Prefixed

-       관리적 특면에서 유용 : 테이블 파티션에 대한 추가, 삭제 등의 작업이 빈번할 때


-       이력성 데이터를 주로 관리하는 DB 환경에 효과적


-       파티션 키 칼럼이 “=” 조건으로 사용될 때 유용


-       파티셔닝 칼럼에 대한 검색 조건이 없으면, 인덱스 선두 칼럼이 조건절에 누락된 것이므로 정상적인 사용이 불가 (Index Full Scan 으로는 선택 가능)


-       파티션 키 칼럼(=인덱스 선두 칼럼)Like, Between, 부등호 같은 범위검색 조건일 때 불리

Local Non Prefixed

-       관리적 측면에서 유용 : 테이블 파티션에 대한 추가, 삭제 등의 작업이 빈번할 때


-       이력성 데이터를 주로 관리하는 DB 환경에 효과적


-       파티션 키 칼럼이 조건절에 사용될 때 유용


-       파티셔닝 칼럼에 대한 검색 조건이 없으면 인덱스 파티션 전체를 액세스하는 비효율이 발생할 수 있으므로 주의


-       파티션 키 칼럼이 범위검색 조건으로 자주 사용된다면 Local Prefixed 보다 Local NonPrefixed가 유리. 그렇더라도 좁은 범위검색이어야 함



반응형

'Oracle > DBA' 카테고리의 다른 글

[펌][ORACLE] ORA-에러  (0) 2015.12.22
[Oracle] Index monitoring  (0) 2015.12.14
[ORACLE] ASM 에 Datafile 추가  (1) 2015.11.25
[Oracle] OWI Latch & Lock 정리  (0) 2015.11.24
[펌][Oracle] 대용량 자료전환 시 튜닝 포인트 - Hash join  (0) 2015.11.19

가끔 Datafile 옮길...일이 없지만..

이번 운영 확인하다 보니, datafile 이 엔진쪽에...헉!!!!


HA 장비라서 엔진쪽에 있으면 안되는데...왜???누가???


에휴...고객사 장비라 누가 건든지 알수 없으니..

더 큰 문제가 생기기 전에 옮겨줘야겠다..


1. Database 로 진행 (DB Shutdown 필요)

2. Tablespace 로 진행 (DB Shutdown 필요 없음)


1. Database 로 진행

- Tablespace 및 Datafile 확인

- DB shutdown 후 Mount 로 startup 진행


SQL> shutdown immediate

Database closed.

Database dismounted.

ORACLE instance shut down.


SQL> startup mount

ORACLE instance started.


Total System Global Area  612368384 bytes

Fixed Size                  2079480 bytes

Variable Size             176162056 bytes

Database Buffers          427819008 bytes

Redo Buffers                6307840 bytes

Database mounted.


- 해당 Datafile 를 이동 후 rename 진행


SQL> alter database rename file 'E:\MASDBDEV\HG1.dbf' to 'E:\HG1.dbf';


- Database open 진행


SQL> alter database open;

Database altered.


- 확인

SQL> select file_name, tablespace_name from dba_data_files order by 2;


FILE_NAME                                TABLESPACE_NAME

---------------------------------------- -----------------------------

E:\MASDBDEV\HG2.DBF                      HG

E:\HG1.DBF                               HG

E:\MASDBDEV\IMSI01.DBF                   IMSI

E:\MASDBDEV\SYSAUX01.DBF                 SYSAUX

E:\MASDBDEV\SYSTEM01.DBF                 SYSTEM

E:\MASDBDEV\TEST01.DBF                   TEST

E:\MASDBDEV\UNDOTBS01.DBF                UNDOTBS1

E:\MASDBDEV\USERS01.DBF                  USERS




2. Tablespace 로 진행


- Tablespace 및 Datafile 확인



- 옮기고자 하는 Datafile 의 Tablespace 를 offline 진행


SQL> alter tablespace HG offline;


- Offline 이 후 해당 Datafile 를 이동 후 rename 진행


SQL> alter tablespace HG rename datafile 'E:\HG1.dbf' to 'E:\MASDBDEV\HG1.dbf';


- Rename 까지 완료 되면 다시 online 진행


SQL> alter tablespace HG online;


- 옮겨 졌는지 확인 후 Test로 Talbe 를 Select 해 보자.


혹시라도 Tablespace offline 이 후 Table를 select 하면 아래와 같이 오류가 나니 가급적 업무 시간에는 진행하지 말자.


ERROR at line 1:

ORA-00376: file 7 cannot be read at this time

ORA-01110: data file 7: 'E:\HG1.DBF'



또한, SYSTEM, Rollback segment혹은 Temporary segment를 포함하는 테이블스페이스는 안되므로 이때는 Database로 진행


ERROR at line 1:

ORA-01541: system tablespace cannot be brought offline; shut down if necessary


오늘도 기초를 한번 더 상기해 보자!!

반응형

사실 내가 관리하는 사이트 들은 모두 File system을 사용한다.

(개발/관리 업무만 하던 이전 직장에 있다가 DB로 넘어온 후 File system / Raw device / Cluster가 뭔지 정말 생소한 단어들에 엄청 맘 고생하면서 찾아보고...물어보기도 창피하고 직급은 있는데...정말 그때 생각하면 아직도 가슴이 찡하다..이게 도대체 뭐라고 ㅋㅋㅋ)


하지만 동료들 사이트 보면 간간히 ASM 이 포함되어 있어서 이레저레 한두번 보기만 해봤다.

물론 테스트 디비랑은 다 구축해 놨지만 정작 구축만 하고 활용은 안했다는..


각설하고 이번에 ASM 에 datafile 추가하는데 file system 처럼 하면 되는데,

갑자기 왜 file 명이 이래요..? 이리 물어보니.. 어버버 거려서 이참에

한번 정리해 본다.


ASM 에 Tablespace 추가


sql) CREATE TABLESPACE TEST DATAFILE SIZE 10M;


이렇게 하면 자동으로 datafile 명시 안해줘도 disk group 아래에 생성이 된다.



cf) File system 에서는 아래와 같이 명시적으로 추가해 줘야한다

sql) CREATE TABLESPACE TEST DATAFILE '/DATA/ORCL/test_data01.dbf' SIZE 10m;


혹시라도 아래와 같은 에러가 발생할 수 있다.

ERROR at line 1:

ORA-01119: error in creating database file '+DATA'

ORA-17502: ksfdcre:4 Failed to create file +DATA

ORA-15001: diskgroup "DATA" does not exist or is not mounted

ORA-15001: diskgroup "DATA" does not exist or is not mounted


그러면 아래와 같이 경로를 확인해 보자.


SQL> show parameter db_create_file_dest



Disk Group 위치도 확인해 보자


SQL> select group_number, name, state from v$asm_diskgroup;

SQL> select b.name group_name, a.name disk_name, a.header_status , a.state, a.free_mb from v$asm_disk a, v$asm_diskgroup b
       where a.group_number = b.group_number;



이리 저리 봐도 DB_CREATE_FILE_DEST 가 잘못 설정되어 있는 것을 확인할 수 있다.

변경하자. 

변경 후에 DB는 재기동 할 필요가 없다.


SQL> alter system set db_create_file_dest='+DATA1';


이후 다시 Tablespace 생성 하면 문제 없이 생성 되는 것을 확인할 수 있다.




이번에는 Add datafile 진행을 해 보자.


SQL> alter tablespace TEST add datafile '+DATA1/orcl/datafile/test2.dbf' size 10m;


이렇게 추가는 가능하지만, Data guard 등에서 문제가 생길 수 있다고 하기에..

(이 부분은 찾아서 올리도록 하겠습니다.........[정중히ㅠ])


가급적 자동으로 생성 되도록 유도하자.(ASM 에서 A가 Automatic 이니깐!! Storage Management )


SQL> ALTER TABLESPACE TEST ADD DATAFILE SIZE 10m;

아래를 보면 명시한 파일명을 명시한 경우와 명시하지 않은 경우가 있다.

가급적 우리는 명시하지 않도록 하고 자동으로 관리하도록 하자.



추가적으로 확인해야 할 부분들도 많고 하지만..

차근차근 진행을 한 후 공유 하도록 해야겠다.


참고 사이트 : http://dinggur.tistory.com/201

반응형

+ Recent posts