2021년 11월 13일 토요일

오라클 대용량 테이블 컬럼 삭제(Oracle Set Unused)

 

오라클 대용량 테이블 컬럼 삭제(Oracle Set Unused)


대용량 테이블의 큰 사이즈를 가지는  칼럼은 경우 서비스중 삭제 하기에는 시스템에 부담이 되어 미래에 삭제하기 위해 사용 안 한다고 표시하는 것으로 한번 UNUSED로 지정된 칼럼은 다시 사용한다고 되돌리기는 불가능하고 DESC 명령어로 칼럼이 나타나지 않으며 DML 사용시 해당 칼럼은 사용 불가능 합니다. SET UNUSED 구문은 오라클 8i 이후 사용 가능 합니다.


[기본형식]

ALTER TABLE table_name SET UNUSED (column_name)


SET UNUSED를 이용하는 것을 컬럼의 논리적 삭제logical delete라고 하고 ALTER TABLE ~ DROP COLUMN을 이용하는 것은 컬럼의 물리적 삭제 physical delete라고 합니다.


SET UNUSED로 컬럼을 사용안한다고 표시 후 DROP UNUSED COLUMNS 구문으로 UNUSED된 컬럼을 물리적으로 삭제할 수 있습니다. 


EMP10 테이블을 생성하고 ename 컬럼을 UNUSED 컬럼으로 변경 후 딕셔너리 뷰를 통해 일반 컬럼 및 UNUSED된 컬럼(히든 컬럼hidden column)을 조회해 보고 히든 컬럼을 물리적으로 삭제하는 실습을 해보겠습니다.

실습


실습을 위해 EMP10 테이블을 생성 합니다.


다음과 같은 조건으로 EMP10 테이블을 생성하세요.


  • 사번(empno) number, primary key(table level constraints)

  • 성명(ename) varchar2(50)


CREATE TABLE EMP10 (

     EMPNO NUMBER ,                                          

     ENAME VARCHAR2(50) ,

     CONSTRAINTS PK_EMP10 PRIMARY KEY(EMPNO)

);



<실행결과>

Table EMP10이(가) 생성되었습니다.


EMP10이 대용량 테이블이라고 가정을 하고 ename 칼럼을 삭제하고 싶은데 낮에 DB에 사용자들의 접속이 많은 시간에는 삭제 하기가 어려워 SET UNUSED로 사용하지 않음을 표시하고 추후 사용자들의 접속이 뜸한 시점에 DROP UNUSED COLUMN으로 삭제를 하려고 합니다.


ename 컬럼을 사용안하는 컬럼으로 변경하세요.


ALTER TABLE EMP10 SET UNUSED(ENAME); 


<실행결과>

Table EMP10이(가) 변경되었습니다.


UNUSED된 컬럼의 개수는 USER_UNUSED_COL_TABS 딕셔너리 뷰에서 조회할 수 있습니다.


USER_UNUSED_COL_TABS 딕셔너리 뷰에서 EMP10 테이블을 조회합니다.


SELECT * 

FROM  USER_UNUSED_COL_TABS

WHERE TABLE_NAME = 'EMP10';


<실행결과>

 

TABLE_NAME

COUNT

1

EMP10

1


USER_TAB_COLS 딕셔너리 뷰는 현재 사용자가 소유 한 테이블, 뷰의 컬럼의 정보를 제공 합니다.SET UNUSED된 히든 컬럼hidden column이 보인다는 점에서 USER_TAB_COLUMNS와 다릅니다. 


EMP10 테이블의 모든 컬럼 정보를 USER_TAB_COLS 뷰를 통해 확인 합니다.


SELECT COLUMN_NAME

             , DATA_TYPE

             , DATA_LENGTH

             , HIDDEN_COLUMN

FROM    USER_TAB_COLS

WHERE TABLE_NAME = 'EMP10';




<실행결과>

 

COLUMN_NAME

DATA_TYPE

DATA_LENGTH

HIDDEN_COLUMN

1

EMPNO

NUMBER

22

NO

2

SYS_C00002_20122715:56:54$

VARCHAR2

50

YES


USER_TAB_COLS 뷰는 UNUSED된 히든 컬럼, 가상컬럼 등을 모두 표시 합니다.

ename 컬럼은 컬럼명이 “SYS_C00002_20122715:56:54$”으로 변경되어 있고 HIDDEN_COLUMN의 값이 YES로 설정 되어 있는 것을 확인 할 수 있습니다.



USER_TAB_COLUMNS 뷰를 통해 조회하면 히든 컬럼은 조회되지 않습니다.


EMP10 테이블의  컬럼 정보를 USER_TAB_COLUMNS 뷰를 통해 확인 합니다.


SELECT COLUMN_NAME

             , DATA_TYPE

FROM    USER_TAB_COLUMNS

WHERE TABLE_NAME = 'EMP10';


<실행결과>

 

COLUMN_NAME

DATA_TYPE

1

EMPNO

NUMBER


SET UNUSED된 ename 컬럼은 조회되지 않습니다.


UNUSED된 ename 컬럼을 물리적으로 삭제 하세요.


ALTER TABLE EMP10 DROP UNUSED COLUMNS;


<실행결과>

Table EMP10이(가) 변경되었습니다.

 

#칼럼삭제, #컬럼삭제, #오라클컬럼삭제, #오라클칼럼삭제, #setunused, #ORACLE교육, #ORACLE강좌​

오라클 가상컬럼(Oracle Virtual Columns)

 

오라클 가상컬럼(Oracle Virtual Columns)


오라클 11g에서 새로 소개된 가상 컬럼(Virtual Column)은 다른 컬럼 값 또는 다른 표현식을 사용하여 값이 자동으로 계산되는 테이블의 가상 컬럼 입니다. 다른 컬럼의 값들을 이용하여 새로운 값을 만들어 내는 경우에 유용하게 사용될 수 있습니다.


[기본형식]

COLUMN_NAME [DATATYPE] [GENERATED ALWAYS] AS [EXPRESSION] [VIRTUAL]


  • COLUMN_NAME : 가상 컬럼의 이름

  • DATATYPE: 가상 컬럼의 데이터 유형을 지정합니다. 생략하면 가상 컬럼은 표현식 결과의 데이터 유형을 사용합니다.

  • AS EXPRESSION: AS 키워드뒤에 표현식을 기술 합니다. 이 식의 값이 가상컬럼에 대입됩니다.

  • GENERATED ALWAYS, VIRTUAL : 구문의 명확성을 위해 기술 합니다. 생략가능


일반 컬럼과 유사하지만 다음과 같은 차이가 있습니다.

- 표현식등에 의해 정의.(사원 테이블에서 급여와 수당 컬럼을 이용하여 연봉을 계산)

- DB에 저장되지는 않으며 실행 중에 계산됩니다..

- UPDATE, DELETE의 WHERE절에 나타날 수 있지만 컬럼값 자체에 대한 변경은 불가능 합니다.


실습


가상컬럼을 이용하여 테이블을 생성하고 생성된 가상칼럼을 확인해 보겠습니다.


다음과 같은 조건으로 EMP10 테이블을 생성하세요.


  • 사번(empno) number, primary key

  • 성명(ename) varchar2(50)

  • 급여(pay) number

  • 연봉(annaul_income) : pay * 10 표현식을 기반으로 가상컬럼으로.


CREATE TABLE EMP10 (

  EMPNO NUMBER CONSTRAINTS PK_EMP10 PRIMARY KEY,

  ENAME VARCHAR2(50),

  PAY NUMBER,

  ANNUAL_INCOME NUMBER GENERATED ALWAYS AS (PAY * 12) VIRTUAL

);


<실행결과>

Table EMP10이(가) 생성되었습니다.


생성된 EMP10 테이블의 컬럼들을 조회해 보겠습니다.


SELECT  COLUMN_NAME

              , DATA_TYPE

              , DATA_LENGTH

              , DATA_DEFAULT

              , VIRTUAL_COLUMN

 FROM    USER_TAB_COLS

 WHERE TABLE_NAME = 'EMP10';


\<실행결과>

 

COLUMN_NAME

DATA_TYPE

DATA_LENGTH

DATA_DEFAULT

VIRTUAL_COLUMN

1

EMPNO

NUMBER

22


NO

2

ENAME

VARCHAR2

50


NO

3

PAY

NUMBER

22


NO

4

ANNUAL_INCOME

NUMBER

22

PAY*12

YES


실습


생성한 EMP10 테이블에 EMP 테이블의 컬럼 및 데이터를 근간으로 값을 입력합니다. 단 annual_income 컬럼에는 값을 입력하지 않습니다. 다른 컬럼값(pay)에 의해 자동으로 생성되니까요. INSERT 후 EMP10 테이블의 데이터를 조회 합니다.


EMP10 테이블에 데이터를 입력합니다. EMP 테이블의 empno, ename, sal 컬럼을 EMP10 테이블의 empmno, ename, pay 컬럼으로 입력 합니다.


 INSERT INTO EMP10 (EMPNO, ENAME, PAY)

 SELECT EMPNO, ENAME, SAL FROM EMP;


<실행결과>

14개 행 이(가) 삽입되었습니다.


EMP10 테이블의 전체 데이터를 조회 합니다. annual_income 컬럼에 값이 생성 되어 있는것을 확인 하세요.


SELECT * FROM EMP10;


<실행결과>

 

EMPNO

ENAME

PAY

ANNUAL_INCOME

1

7369

SMITH

800

9600

...

...

...

...

...

13

7902

FORD

3000

36000

14

7934

MILLER

1300

15600



실습

EMP10 테이블에 가상컬럼을 추가해 보겠습니다. 컬럼명 뒤에 AS 온다는 사실 항상 기억하세요. 가상컬럼의 데이터타입은 별도로 가술하지 않으면 표현식의 데이터타입을 따라갑니다.


EMP10 테이블에 급여등급(grade) 칼럼을 가상컬럼으로 추가 하세요.

pay<= 1190 dlaus ‘Low’, pay> 1200 AND pay<= 2500 이면 ‘Normal’, pay> 2500 이면 ‘High’ 값을 갖는 컬럼 입니다. 


ALTER TABLE EMP10 ADD

(

    GRADE AS (

            CASE 

                WHEN PAY <= 1190 THEN 'Low' 

                WHEN PAY > 1200 AND PAY <= 2500 THEN 'Normal'

                WHEN PAY > 2500 THEN 'High'

            END)

);


<실행결과>

Table EMP10이(가) 변경되었습니다.


EMP10 테이블의 전체 데이터를 조회 합니다. grade컬럼의 값을 확인 하세요.


SELECT * FROM EMP10;


<실행결과>

 

EMPNO

ENAME

PAY

ANNUAL_INCOME

GRADE

1

7369

SMITH

800

9600

Low

...

...

...

...

...


13

7902

FORD

3000

36000

High

14

7934

MILLER

1300

15600

Normal


 

#가상컬럼, #가상칼럼, #Virtual컬럼, #VirtualColumn, #Oracle강좌, #ORACLE교육

(C#교육동영상)C# ADO.NET 실습 ODP.NET/ODAC 설치 오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원

  (C#교육동영상)C# ADO.NET 실습  ODP.NET/ODAC 설치  오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원 https://www.youtube.com/watch?v=qIPU85yAlzc&list=PLxU-i...