다른 명령
테이블
테이블 생성
CREATE TABLE TB_TEST ( COL1 numeric(10) not null, COL2 varchar2(50) not null, COL3 varchar2(50), CONSTRAINT PK_TEST PRIMARY KEY (COL1) );
테이블 변경
테이블명 변경
ALTER TABLE OWNER.TB_A RENAME TO TB_B;
오라클_테이블_최종_입력수정일시 조회
-- 테이블 최종 입력/수정/삭제 일시
- ALL_TAB_MODIFICATIONS는 마지막 통계가 테이블에 수집 된 이후 수정 된 현재 사용자가 액세스 할 수있는 테이블정보 임.
- MONITORING 속성이있는 테이블만 가능
- 오랜 기간에 걸친 통계 수집을 위해 고안됨.
- 성능상의 이유로 Oracle Database는 실제 수정이 발생할 때 즉시 채우지 않음.
: DIMS_STATSPL / SQL 패키지에서 FLUSH_DATABASE_MONITORING_INFO 프로시저를 실행 최신 정보로 갱신 할수 있음.
SELECT * FROM ALL_TAB_MODIFICATIONS WHERE TABLE_OWNER = 'BABYMEAL' AND TABLE_NAME NOT LIKE 'BIN%'
(원문)
ALL_TAB_MODIFICATIONS 438/1627 ALL_TAB_MODIFICATIONS describes tables accessible to the current user that have been modified since the last time statistics were gathered on the tables.
Related Views
DBA_TAB_MODIFICATIONS provides such information for all tables in the database.
USER_TAB_MODIFICATIONS provides such information for tables owned by the current user. This view does not display the TABLE_OWNER column.
Note:
These views are populated only for tables with theMONITORINGattribute. They are intended for statistics collection over a long period of time. For performance reasons, the Oracle Database does not populate these views immediately when the actual modifications occur. Run theFLUSH_DATABASE_MONITORING_INFOprocedure in theDIMS_STATSPL/SQL package to populate these views with the latest information. TheANALYZE_ANYsystem privilege is required to run this procedure.
Column Datatype NULL Description
TABLE_OWNER VARCHAR2(30) Owner of the modified table.
TABLE_NAME VARCHAR2(30) Name of the modified table
PARTITION_NAME VARCHAR2(30) Name of the modified partition
SUBPARTITION_NAME VARCHAR2(30) Name of the modified subpartition
INSERTS NUMBER Approximate number of inserts since the last time statistics were gathered
UPDATES NUMBER Approximate number of updates since the last time statistics were gathered
DELETES NUMBER Approximate number of deletes since the last time statistics were gathered
TIMESTAMP DATE Indicates the last time the table was modified
DROP_SEGMENTS NUMBER Number of partition and subpartition segments dropped since the last analyze
테이블 읽기/쓰기 모드 변경
- 11g 이전 버전의 경우, 테이블에 대한 DML 수행을 막는 방법으로 가상의 스키마 유저를 생성하고 테이블에대한 SELECT 권한만 부여하는 방식으로 사용
- 11g 부터 테이블의 속성을 'READ ONLY'로 변경함으로써 가상의 유저만이 아니라 OWNER까지 포함하여 DML을 사용할수 없게끔 제한할수 있는 기능 추가됨.
- 단, READ ONLY 테이블의 제한 대상은 DML에 국한되면 DDL은 허용됨.
- CREATE 명령
CREATE TABLE TB_TEST ... ... READ ONLY;
- ALTER 명령
ALTER TABLE TB_TEST READ ONLY; ALTER TABLE TB_TEST READ WRITE;
테이블(제약사항 포함) 삭제
DROP TABLE OWNER.TB_A CASCADE CONSTRAINT;
테이블/컬럼 정보 조회
테이블_컬럼정보 HTML로 추출하기
사용자 테이블/컬럼 전체 조회용 (html)
- 현재 접속중인 USER 테이블/컬럼정보
DECLARE TYPE TYPE_VARCHAR2 IS TABLE OF VARCHAR2(4000); V_TABLE_NAME TYPE_VARCHAR2; V_TABLE_COMT TYPE_VARCHAR2; V_CNT NUMBER; V_MAX_PX NUMBER; V_SQL VARCHAR2(4000); V_VERSION VARCHAR2(100) ; BEGIN V_VERSION := 'ORACLE DBA '; -- 1. 전체 테이블 정보 조회 SELECT A.TABLE_NAME , REGEXP_SUBSTR(B.COMMENTS,'[^|]+',1,1) AS CMT BULK COLLECT INTO V_TABLE_NAME , V_TABLE_COMT FROM USER_TABLES A , USER_TAB_COMMENTS B WHERE B.TABLE_NAME = A.TABLE_NAME ORDER BY A.TABLE_NAME; DBMS_OUTPUT.PUT_LINE('<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">'); DBMS_OUTPUT.PUT_LINE('<html>'); DBMS_OUTPUT.PUT_LINE('<head>'); DBMS_OUTPUT.PUT_LINE(' <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />'); DBMS_OUTPUT.PUT_LINE(' <title>'||V_VERSION||'</title>'); DBMS_OUTPUT.PUT_LINE(' <style type="text/css">'); DBMS_OUTPUT.PUT_LINE(' .entity{'); DBMS_OUTPUT.PUT_LINE(' border: solid 1px #7E2828;'); DBMS_OUTPUT.PUT_LINE(' margin-bottom: 20px;'); DBMS_OUTPUT.PUT_LINE(' font-size:10pt;'); DBMS_OUTPUT.PUT_LINE(' line-height:16pt;'); DBMS_OUTPUT.PUT_LINE(' }'); DBMS_OUTPUT.PUT_LINE(' .header{'); DBMS_OUTPUT.PUT_LINE(' background-color: #7E2828;'); DBMS_OUTPUT.PUT_LINE(' color: white;'); DBMS_OUTPUT.PUT_LINE(' }'); DBMS_OUTPUT.PUT_LINE(' .column-header{'); DBMS_OUTPUT.PUT_LINE(' background-color: #E8E8E8;'); DBMS_OUTPUT.PUT_LINE(' }'); DBMS_OUTPUT.PUT_LINE(' td{'); DBMS_OUTPUT.PUT_LINE(' padding-left: 5px;'); DBMS_OUTPUT.PUT_LINE(' padding-right: 5px;'); DBMS_OUTPUT.PUT_LINE(' }'); DBMS_OUTPUT.PUT_LINE(' </style>'); DBMS_OUTPUT.PUT_LINE('</head>'); DBMS_OUTPUT.PUT_LINE('<body>'); DBMS_OUTPUT.PUT_LINE('<h2>'||V_VERSION||' </h2>'); -- 2.테이블 별 LOOP FOR I IN V_TABLE_NAME.FIRST..V_TABLE_NAME.LAST LOOP SELECT MAX(A.COLUMN_ID) AS CNT , (MAX(LENGTH(COLUMN_NAME)) * 14) AS MAX_PX INTO V_CNT , V_MAX_PX FROM USER_TAB_COLS A WHERE A.TABLE_NAME = V_TABLE_NAME(I) ; DBMS_OUTPUT.PUT_LINE('<font size ="2"><table class="entity" cellpadding="0" cellspacing="0" width="100%" style="word-break:break-all;">'); DBMS_OUTPUT.PUT_LINE('<tr>'); DBMS_OUTPUT.PUT_LINE(' <td colspan="5" class="header">'||V_TABLE_NAME(I)||'('||V_TABLE_COMT(I)||')'||'</td>'); DBMS_OUTPUT.PUT_LINE('</tr>'); DBMS_OUTPUT.PUT_LINE(' <tr class="column-header">'); DBMS_OUTPUT.PUT_LINE(' <td>논리명</td>'); DBMS_OUTPUT.PUT_LINE(' <td>물리명</td>'); DBMS_OUTPUT.PUT_LINE(' <td>데이터 타입</td>'); DBMS_OUTPUT.PUT_LINE(' <td ALIGN="CENTER">Not Null</td>'); DBMS_OUTPUT.PUT_LINE(' <td>설명</td>'); DBMS_OUTPUT.PUT_LINE(' </tr>'); -- 3. 컬러 정보 FOR J IN 1..V_CNT LOOP SELECT ' <tr>'||CHR(10)||' <td WIDTH="'||V_MAX_PX*1.5||'">'||A.LG||'</td>'||CHR(10)||' <td WIDTH="'||V_MAX_PX||'">'||A.COLUMN_NAME||'</td>'||CHR(10)||' <td WIDTH="120">'||A.DATA_TYPE||'</td>'||CHR(10)||' <td WIDTH="100" ALIGN="CENTER">'||A.NOTNULL||'</td>'||CHR(10)||' <td>'||A.COMMENTS||'</td>'||CHR(10)||' </tr>' INTO V_SQL FROM ( SELECT REGEXP_SUBSTR(B.COMMENTS, '[^|]+', 1, 1)||CASE WHEN C.COLUMN_NAME IS NOT NULL THEN '(PK)' END AS LG , A.COLUMN_NAME , A.DATA_TYPE || (CASE WHEN A.DATA_TYPE IN ('CHAR', 'VARCHAR2', 'NVARCHAR') THEN '(' || A.DATA_LENGTH || ')' WHEN A.DATA_TYPE = 'NUMBER' AND A.DATA_SCALE = 0 AND A.DATA_PRECISION IS NOT NULL THEN '(' || A.DATA_PRECISION || ')' WHEN A.DATA_TYPE = 'NUMBER' AND A.DATA_SCALE <> 0 THEN '(' || A.DATA_PRECISION || ',' || A.DATA_SCALE || ')' END ) AS DATA_TYPE , DECODE(A.NULLABLE, 'Y', 'N', 'N', 'Y') AS NOTNULL , B.COMMENTS FROM USER_TAB_COLS A , USER_COL_COMMENTS B , ( SELECT C.INDEX_NAME, C.TABLE_NAME, C.COLUMN_NAME FROM USER_IND_COLUMNS C WHERE EXISTS ( SELECT 1 FROM USER_CONSTRAINTS S WHERE S.CONSTRAINT_TYPE = 'P' AND S.TABLE_NAME = C.TABLE_NAME AND S.INDEX_NAME = C.INDEX_NAME ) ) C WHERE A.COLUMN_NAME != 'HIW_SOLUTION_TPCODE' AND A.TABLE_NAME = V_TABLE_NAME(I) AND B.TABLE_NAME = A.TABLE_NAME AND B.COLUMN_NAME = A.COLUMN_NAME AND C.TABLE_NAME(+) = A.TABLE_NAME AND C.COLUMN_NAME(+) = A.COLUMN_NAME AND A.COLUMN_ID = J ) A ; DBMS_OUTPUT.PUT_LINE(V_SQL); V_SQL := NULL; END LOOP; DBMS_OUTPUT.PUT_LINE('</table>'); V_CNT := 0; END LOOP; DBMS_OUTPUT.PUT_LINE('</body>'); DBMS_OUTPUT.PUT_LINE('</html>'); END; /
DBA용 조회 SQL
SELECT OWNER , TABLE_NAME , COLUMN_NAME , PK , COLUMN_NAME , DATA_TYPE || '( ' || NVL(DATA_TYPE_2, DATA_LENGTH) || ' )' DATA_TYPE , NULLABLE , COMMENTS FROM (SELECT A.OWNER , A.TABLE_NAME , A.COLUMN_ID , B.POSITION PK , A.COLUMN_NAME , A.DATA_TYPE , A.DATA_PRECISION || DECODE(A.DATA_SCALE, NULL, NULL, ',' || A.DATA_SCALE) DATA_TYPE_2 , A.DATA_LENGTH , A.DATA_PRECISION , A.DATA_SCALE , A.NULLABLE , A.COMMENTS , ROW_NUMBER() OVER (PARTITION BY A.OWNER, A.TABLE_NAME, A.COLUMN_ID ORDER BY A.COLUMN_ID, B.POSITION) RN FROM (SELECT COL.OWNER , COL.TABLE_NAME , COL.COLUMN_ID , COL.COLUMN_NAME , COL.DATA_TYPE , COL.DATA_LENGTH , COL.DATA_PRECISION , COL.DATA_SCALE , COL.NULLABLE , COM.COMMENTS FROM DBA_TAB_COLUMNS COL , DBA_COL_COMMENTS COM WHERE COL.COLUMN_NAME = COM.COLUMN_NAME AND COL.OWNER = COM.OWNER AND COL.TABLE_NAME = COM.TABLE_NAME AND COM.OWNER =:IN_OWNER AND COM.TABLE_NAME LIKE:IN_TABLE_NAME || '%') A , DBA_CONS_COLUMNS B WHERE B.TABLE_NAME(+) = A.TABLE_NAME AND B.COLUMN_NAME(+) = A.COLUMN_NAME) X WHERE X.RN = 1 ORDER BY X.TABLE_NAME, X.COLUMN_ID;
일반 사용자 용
SELECT TABLE_NAME , COLUMN_NAME , PK , COLUMN_NAME , DATA_TYPE || '( ' || NVL(DATA_TYPE_2, DATA_LENGTH) || ' )' DATA_TYPE , NULLABLE , COMMENTS FROM (SELECT A.TABLE_NAME , A.COLUMN_ID , B.POSITION PK , A.COLUMN_NAME , A.DATA_TYPE , A.DATA_PRECISION || DECODE(A.DATA_SCALE, NULL, NULL, ',' || A.DATA_SCALE) DATA_TYPE_2 , A.DATA_LENGTH , A.DATA_PRECISION , A.DATA_SCALE , A.NULLABLE , A.COMMENTS , ROW_NUMBER() OVER (PARTITION BY A.TABLE_NAME, A.COLUMN_ID ORDER BY A.COLUMN_ID, B.POSITION) RN FROM (SELECT COL.TABLE_NAME , COL.COLUMN_ID , COL.COLUMN_NAME , COL.DATA_TYPE , COL.DATA_LENGTH , COL.DATA_PRECISION , COL.DATA_SCALE , COL.NULLABLE , COM.COMMENTS FROM USER_TAB_COLUMNS COL , USER_COL_COMMENTS COM WHERE COL.COLUMN_NAME = COM.COLUMN_NAME AND COL.TABLE_NAME = COM.TABLE_NAME AND COM.TABLE_NAME LIKE:IN_TABLE_NAME || '%') A , USER_CONS_COLUMNS B WHERE B.TABLE_NAME(+) = A.TABLE_NAME AND B.COLUMN_NAME(+) = A.COLUMN_NAME ) X WHERE X.RN = 1 ORDER BY X.TABLE_NAME, X.COLUMN_ID;
테이블 생성일자 보기
SELECT SUBSTRB(OBJECT_NAME, 1, 15) AS OBJECT_NAME , CREATED , LAST_DDL_TIME , TIMESTAMP , STATUS FROM USER_OBJECTS WHERE OBJECT_NAME = UPPER('&테이블명') AND OBJECT_TYPE = 'TABLE';
CONSTRAINT 제약 사항 보기
SELECT DECODE(A.CONSTRAINT_TYPE, 'P', 'Primary Key', 'R', 'Foreign Key', 'C', 'Table Check', 'V', 'View Check', 'U', 'Unique', '?') AS "유형" , SUBSTRB(A.CONSTRAINT_NAME, 1, 25) AS CONSTRAINT_NAME , B.POSITION , SUBSTRB(B.COLUMN_NAME, 1, 25) AS COLUMN_NAME FROM DBA_CONSTRAINTS A , DBA_CONS_COLUMNS B WHERE A.CONSTRAINT_NAME = B.CONSTRAINT_NAME AND A.OWNER = 'E_LUCIS' AND A.TABLE_NAME = UPPER('&테이블명') ORDER BY 1, 2, 3;
테이블 사이즈 정보
테이블 용량 산정
데이터 용량 산정 방법: (컬럼 평균사이즈*로우스*(1 + 0.2(헤더값감안))) + 인덱스 사이즈 - 컬럼평균사이즈 = ROW 행에 대한 사이즈 평균 (LENGTHB 를 통해 구해도 됨) - 인덱스별로 + 18바이트 (rowid) + a
테이블의 크기 및 블록 보기
SELECT SUBSTR(SEGMENT_NAME, 1, 20), BYTES, BLOCKS FROM USER_SEGMENTS WHERE SEGMENT_NAME = UPPER('&테이블명');
테이블 사이즈 조사
SELECT A.OWNER , A.SEGMENT_NAME , A.SEGMENT_TYPE , ROUND(SUM(A.BYTES)/1024/1024) "SIZE_MB" FROM DBA_SEGMENTS A , DBA_TABLES B WHERE A.SEGMENT_NAME = B.TABLE_NAME AND A.SEGMENT_TYPE IN ('TABLE','TABLE PARTITION') AND A.OWNER = B.OWNER -- AND A.OWNER = '유저아이디' AND EXISTS (SELECT 1 FROM MIG_TABLES C WHERE C.TABLE_NAME = B.TABLE_NAME AND C.OWNER = B.OWNER AND C.SYSTEM_CODE = 'LC1' AND C.USE_YN = 'Y' ) GROUP BY A.OWNER , A.SEGMENT_NAME , A.SEGMENT_TYPE ;
테이블별(인덱스+LOB+테이블) 사이즈
SELECT owner, table_name, TRUNC (SUM (bytes) / 1024 / 1024 / 1024) GB FROM (SELECT segment_name table_name, owner, bytes FROM dba_segments WHERE segment_type IN ('TABLE', 'TABLE PARTITION') UNION ALL SELECT i.table_name, i.owner, s.bytes FROM dba_indexes i, dba_segments s WHERE s.segment_name = i.index_name AND s.owner = i.owner AND s.segment_type IN ('INDEX', 'INDEX PARTITION') UNION ALL SELECT l.table_name, l.owner, s.bytes FROM dba_lobs l, dba_segments s WHERE s.segment_name = l.segment_name AND s.owner = l.owner AND s.segment_type IN ('LOBSEGMENT', 'LOB PARTITION') UNION ALL SELECT l.table_name, l.owner, s.bytes FROM dba_lobs l, dba_segments s WHERE s.segment_name = l.index_name AND s.owner = l.owner AND s.segment_type = 'LOBINDEX') ---WHERE owner in UPPER('&owner') GROUP BY table_name, owner HAVING SUM (bytes) / 1024 / 1024 > 10 /* Ignore really small tables */ ORDER BY SUM (bytes) DESC
테이블 사이즈 1기가 이상
SELECT segment_name, segment_type, SUM(bytes)/1024/1024/1024 GBytes FROM dba_segments WHERE OWNER IN ('OYSTDBA','OYHQDBA') -- schema owners AND segment_type IN ('TABLE') GROUP BY segment_name, segment_type HAVING SUM(bytes)/1024/1024/1024 > 1;
컬럼
상호 DB간에 컬럼 이름 비교
/* 양쪽 DB에서 사용하는 테이블 중에서 컬럼 이름 다른 항목을 찾는다. */ SELECT A.TABLE_NAME , A.COLUMN_NAME , A.COLUMN_ID , A.DATA_TYPE || '(' || A.DATA_LENGTH || ')' DATA_TYPE FROM USER_TAB_COLUMNS@LINK_ESTDB A WHERE A.TABLE_NAME =:IN_TABLE_NAME AND NOT EXISTS (SELECT 'X' FROM USER_TAB_COLUMNS B WHERE B.TABLE_NAME = A.TABLE_NAME AND B.COLUMN_NAME = A.COLUMN_NAME);
테이블 간의 비교
SELECT A.TABLE_NAME, A.COLUMN_NAME, A.COLUMN_ID FROM USER_TAB_COLUMNS@LINK_ESTDB A WHERE A.TABLE_NAME =:IN_TABLE_NAME MINUS SELECT A.TABLE_NAME, A.COLUMN_NAME, A.COLUMN_ID FROM USER_TAB_COLUMNS A WHERE A.TABLE_NAME =:IN_TABLE_NAME
컬럼 추가
컬럼 변경
ALTER TABLE TB_EMP RENAME 컬럼 TO 컬럼2;
컬럼 삭제
ALTER TABLE TB_EMP DROP COLUMN 컬럼명;
PK 컬럼 추가/삭제
컬럼 PK추가
ALTER TABLE TB_EMP ADD CONSTRAINT PK명 PRIMARY KEY (컬럼1,컬럼2,...);
PK 삭제
ALTER TABLE TB_EMP DROP CONSTRAINT PK명;
PK 사용 DISABLE
-- 방법 1 ALTER TABLE TB_EMP DISABLE PRIMMARY KEY; -- 방법 2 ALTER TABLE TB_EMP DISABLE CONSTRAINT PK명;
PK 사용 ENABLE
-- 방법 1 ALTER TABLE TB_EMP ENABLE PRIMMARY KEY; -- 방법 2 ALTER TABLE TB_EMP ENABLE CONSTRAINT PK명;
PK RENAME
ALTER TABLE SCOTT.TB_EMP RENAME CONSTRAINT PK_EMP TO PK_EMP_NEW ;
파티셔닝 테이블
파티션 테이블 쿼리 추출 자동생성 스크립트
-- MIG_ADM.MIG_TABLES 은 사용자가 만든 임시테이블임
SELECT 'SELECT dbms_metadata.get_ddl(''TABLE'','''||A.TABLE_NAME||''','''||A.OWNER||''') DDL_QUERY from dual;' FROM MIG_ADM.MIG_TABLES A WHERE A.SYSTEM_CODE = 'LC1' AND A.PARTITION_YN = 'Y';
파티션 테이블 생성
CREATE TABLE TB_SALE ( SALE_DATE VARCHAR2(8 BYTE) NOT NULL , SALE_TIME VARCHAR2(6 BYTE) NOT NULL , CUST_NO VARCHAR2(10 BYTE) NOT NULL , SALE_AMT NUMBER , INPUT_DATE DATE ) TABLESPACE TS_DATA PARTITION BY RANGE (SALE_DATE) ( PARTITION PR_TB_SALE_201801 VALUES LESS THAN ('20180201') , PARTITION PR_TB_SALE_201802 VALUES LESS THAN ('20180301') , PARTITION PR_TB_SALE_201803 VALUES LESS THAN ('20180401') , PARTITION PR_TB_SALE_201804 VALUES LESS THAN ('20180501') , PARTITION PR_TB_SALE_201805 VALUES LESS THAN ('20180601') , PARTITION PR_TB_SALE_201806 VALUES LESS THAN ('20180701') , PARTITION PR_TB_SALE_201807 VALUES LESS THAN ('20180801') , PARTITION PR_TB_SALE_201808 VALUES LESS THAN ('20180901') , PARTITION PR_TB_SALE_201809 VALUES LESS THAN ('20181001') , PARTITION PR_TB_SALE_201810 VALUES LESS THAN ('20181101') , PARTITION PR_TB_SALE_201811 VALUES LESS THAN ('20181201') , PARTITION PR_TB_SALE_201812 VALUES LESS THAN ('20190101') , PARTITION PR_TB_SALE_201901 VALUES LESS THAN ('20190201') , PARTITION PR_TB_SALE_201902 VALUES LESS THAN ('20190301') , PARTITION PR_TB_SALE_201903 VALUES LESS THAN ('20190401') , PARTITION PR_TB_SALE_201904 VALUES LESS THAN ('20190501') , PARTITION PR_TB_SALE_201905 VALUES LESS THAN ('20190601') , PARTITION PR_TB_SALE_201906 VALUES LESS THAN ('20190701') , PARTITION PR_TB_SALE_201907 VALUES LESS THAN ('20190801') , PARTITION PR_TB_SALE_201908 VALUES LESS THAN ('20190901') , PARTITION PR_TB_SALE_201909 VALUES LESS THAN ('20191001') , PARTITION PR_TB_SALE_201910 VALUES LESS THAN ('20191101') , PARTITION PR_TB_SALE_201911 VALUES LESS THAN ('20191201') , PARTITION PR_TB_SALE_201912 VALUES LESS THAN ('20200101') -- PARTITION PR_TB_SALE_MAX VALUES LESS THAN (MAXVALUE) ) ; -- PK 생성 CREATE UNIQUE INDEX PK_TB_SALE ON TB_SALE (SALE_DATE, SALE_TIME, CUST_NO) TABLESPACE TS_INDEX LOCAL ; ALTER TABLE TB_SALE ADD CONSTRAINT PK_TB_SALE PRIMARY KEY (SALE_DATE, SALE_TIME, CUST_NO); -- 코멘트 COMMENT ON COLUMN TB_SALE.SALE_DATE IS '매출일자'; COMMENT ON COLUMN TB_SALE.SALE_TIME IS '매출시간'; COMMENT ON COLUMN TB_SALE.CUST_NO IS '고객번호'; COMMENT ON COLUMN TB_SALE.SALE_AMT IS '매출 금액'; COMMENT ON TABLE TB_SALE IS '고객 매출내역';
파티션 구성 시 마지막에 MAXVALUE 를 주석으로 막은 이유는
분할해 둔 파티션의 마지막이 임박해오는 경우 SPLIT 보다 파티션 추가가 간편하기 때문
물론 예기치 않은 데이터가 들어오는 경우 MAXVALUE 를 지정해두는것이 안정적이긴 합니다.
파티션 키 컬럼 조회
SELECT * FROM DBA_PART_KEY_COLUMNS WHERE OWNER= 'SCOTT' ;
파티션 추가
ALTER TABLE TB_SALE ADD PARTITION PR_TB_SALE_202001 VALUES LESS THAN ('20200201' ) TABLESPACE TS_INDEX ;
파티션 삭제
ALTER TABLE TB_SALE DROP PARTITION PR_TB_SALE_202001 ;
파티션 분할 (MAXVALUE 파티션 분할) =
ALTER TABLE TB_SALE SPLIT PARTITION PR_TB_SALE_MAX AT ( '20200201' ) INTO ( PARTITION PR_TB_SALE_202001 , PARTITION PR_TB_SALE_MAX ) ;
MAXVALUE 로 잡혀있던 PR_TB_SALE_MAX 파티션을 2020년 02월 01일 이전 데이터가 입력될 파티션으로 분리
파티션 TRUNCATE
ALTER TABLE TB_SALE TRUNCATE PARTITION PR_TB_SALE_201801 ;
파티션 테이블 인덱스 생성
CREATE UNIQUE INDEX PK_TB_SALE ON TB_SALE (SALE_DATE, SALE_TIME, CUST_NO) TABLESPACE TS_INDEX LOCAL ;
파티션 테이블을 생성할 때 INDEX 설정 시 주의 사항
RANGE 파티션을 가진 테이블을 월별로 파티션을 분리한다고 했을 때
- 테이블 전체에 INDEX 를 구성하는 것 보다 각각의 파티션 별로 INDEX 를 가지고 있어야 대용량의 테이블을 조회할 때 더 효과적
INDEX 지정 시 LOCAL INDEX 가 아닌 default 나 GLOBAL INDEX 로 설정할 경우
- 파티션기준이 아닌 전체 테이블을 기준으로 INDEX 가 만들어지니 주의
- 파티션 테이블이 GLOBAL INDEX 로 생성될 경우 테이블의 중간중간 데이터가 삭제되거나 변경된다면
전체 테이블 기준으로 최적화된 INDEX 가 뒤죽박죽 될 수 있으나 LOCAL 로 생성되는 경우에는 다른 파티션의 INDEX 에는 영향이 가지 않으니 INDEX 를 사용하는 SQL 인 경우 더 빠른 실행계획을 세울 수 있게 됩니다.
- 파티션 변경(추가/삭제) 시 GLOBAL INDEX가 IU(Index Unusable) 로 변경되면서 인덱스를 사용할수 없게됨.
파티션 테이블의 파티션 범위 보기
SELECT TABLE_NAME , SUBSTRB(PARTITION_NAME, 1, 30) AS PARTITION_NAME -- 파티셔닝 명 , SUBSTRB(TABLESPACE_NAME, 1, 30) AS TABLESPACE_NAME -- 테이블스페이스명 , HIGH_VALUE FROM USER_TAB_PARTITIONS WHERE TABLE_NAME = UPPER('&테이블명');