프로그래밍/자바(java) 융합개발자 2차

[자바 기초] 11일차 일지 1 - TRIGGER(트리거) / INDEX(인덱스)

aSpring 2020. 12. 29. 11:04
728x90
728x90

 

트리거(-> 방아쇠) : 자동 실행, DB에서 많이 씀

  - 원래 우리가 Select ~ ~~ 작성한 다음 Ctrl + Enter를 해서 실행을 시켜주거나 실행문 작성해야 하는데

    자동으로 시간마다 작동되는 그런 느낌

  ex) 장비   온도 측정 시 -> 3분 마다 측정(app에서 측정)한다고 치면 온도가 계속 바뀔거고 DB도 계속 Update가 될 것

     dev 1   24.4 > 24.3 > .. > 24.0

     dev 2   23.5

     dev 3   17.7  

   -> 이건 변한 결과 현재 값만 나오게 됨 -> 근데 나는 변화 이력을 남기고 싶다? -> History를 기록할 테이블을 하나 더 만든다

 

 History 테이블

  1   dev 1   24.4  -> 복합키로 잡아 줌

  2   dev 1   23.5

  3   dev 1   17.7  

 

-> 이 테이블에는 update될 때 마다 로그 남기는 것처럼 기록이 된다.

 

=> 트리거는 Update가 발생 시(when, if) 쿼리를 날린다 -> 여기서는 History 테이블에 insert 쿼리를 날린다(발동한다)

                  insert

                  delete -> 요 세개에서 많이 쓰고

                  select : ex) 누가 내 계좌를 조회했다. 언제, 누가 조회 했는지 이력을 남기는 등

 

cf) 시퀀스 : 자동 순번 생성


4. TRIGGER(트리거) [생략]

  • 서브 프로그램 단위의 하나인 TRIGGER는 테이블, , 스키마 또는 데이터베이스에 관련된 PL/SQL 블록(또는 프로시저)으로 관련된 특정 사건(Event)이 발생될 때마다 묵시적(자동)으로 해당 PL/SQL 블록이 실행됩니다
  • TRIGGER는 데이터베이스 내에 오브젝트로서 저장되어 관리됩니다.
  • 그리고 TRIGGER 자체는 사용자가 지정해서 실행을 할 수 없으며, 오직 TRIGGER 생성시 정의한 특정 사건(Event)에 의해서만 묵시적인 자동실행(Fire)이 이루어집니다
  • TRIGGER 를 생성하려면 CREATE TRIGGER, 수정하려면 ALTER TRIGGER, 삭제하려면 DROP TRIGGER 의 권한이 필요합니다. 또한 DATABASE 전체의 TRIGGER 조작은 ADMINISTER DATABASE TRIGGER 시스템 권한이 필요합니다.
  • TRIGGER 에 대한 정보는 USER_OBJECTS, USER_TRIGGERS, USER_ERRORS 딕셔너리들을 조회하면 알 수 있습니다.
  • TRIGGER를 이루는 TRIGGER 몸체(실행부) TCL 명령,  COMMIT, ROLLBACK, SAVEPOINT 명령이 포함될 수 없다는 점도 꼭 기억하셔야 합니다.

2) 주요 TRIGGER 유형

 

ex) 온도라는 것에 24.8이 저장되어 있었다.

24.8        25.0

old   ->   new  : 이렇게 값이 변하면 다른 곳에 담아 뒀다가 old 24.8을 이력을 남길 테이블에 기록하고 new인 25.0를 기존 온도에 저장(덮어씀)

 

(1) 단순 DML TRIGGER

- BEFORE TRIGGER

  : 테이블에서 DML 이벤트를 TRIGGER하기 전에 TRIGGER 본문을 실행합니다

- AFTER TRIGGER

  : 테이블에서 DML 이벤트를 TRIGGER한 후에 TRIGGER 본문을 실행합니다

- INSTEAD OF TRIGGER

  : TRIGGER문 대신 TRIGGER 본문을 실행하며, 다른 방법으로는 수정이 불가능한 뷰에 사용됩니다

 

- 문장 TRIGGER / TRIGGER

문장 TRIGGER는 영향을 받는 행이 전혀 없더라도 TRIGGER가 한 번은 실행됩니다. 문장 TRIGGERTRIGGER 작업이 영향을 받는 행의 데이터 또는 TRIGGER 이벤트 자체에서 제공하는 데이터에 종속되지 않은 경우에 유용합니다.

 

TRIGGER는 테이블이 TRIGGER 이벤트의 영향을 받을 때마다 실행되고, TRIGGER 이벤트의 영향을 받는 행이 없을 경우에는 실행되지 않습니다. TRIGGER는 영향을 받는 행의 데이터나 TRIGGER 이벤트 자체에서 제공하는 데이터에 TRIGGER 작업이 종속될 경우에 유용합니다.

TRIGGER 로 생성하려면 FOR EACH ROW 라는 구절을 사용하면 됩니다.

 

create sequence ID_SEQUENCE
START WITH 1
INCREMENT BY 1;


create or replace ID_SEQUENCE_TRIGGER
BEFORE INSERT
ON CONTENTS_TABLE
REFERENCING NEW AS NEW
FOR EACH ROW
BEGIN
SELECT ID_SEQUENCE.nextval INTO :NEW.CONTENTS_ID FROM dual;
END;
/


DROP TRIGGER CON_STORAGE_STATUS_TRG;


CREATE OR REPLACE TRIGGER CON_STORAGE_STATUS_TRG

AFTER INSERT OR UPDATE

ON CON_STORAGE_STATUS FOR EACH ROW

BEGIN

      INSERT INTO CON_STORAGE_HISTORY(
									CON_ID,                                   
                                    TEMP_THIS,                                    
                                    TEMP_SET,                                    
                                    DEFROST_TIME,                                    
                                    DEFROST_CYCLE,                                    
                                    TEMP_GAP,                                    
                                    TEMP_SUB,                                    
                                    PRESSURE_HIGH,                                    
                                    PRESSURE_LOW,                                    
                                    POWER_ON,                                    
                                    LAMP_ON,                                    
                                    MANUAL_DEFROST_ON,                                    
                                    NATURAL_DEFROST_ON,                                    
                                    DEFROST_TYPE,                                    
                                    WRITE_TIME  
                                     )
                                     
                                     VALUES
                                     
                                     (
                                     :NEW.CON_ID,                                     
                                     :NEW.TEMP_THIS,
                                     :NEW.TEMP_SET,
                                     :NEW.DEFROST_TIME,
                                     :NEW.DEFROST_CYCLE,
                                     :NEW.TEMP_GAP,
                                     :NEW.TEMP_SUB,
                                     :NEW.PRESSURE_HIGH,
                                     :NEW.PRESSURE_LOW,
                                     :NEW.POWER_ON,
                                     :NEW.LAMP_ON,
                                     :NEW.MANUAL_DEFROST_ON,
                                     :NEW.NATURAL_DEFROST_ON,
                                     :NEW.DEFROST_TYPE,
                                     :NEW.WRITE_TIME
                                     
                                      );

END;
                            

출처 : https://cafe.naver.com/busanit2018db

 

(2) 혼합 TRIGGER (11g 부터 추가됨)

혼합 TRIGGER는 여러 가지 TRIGGER를 하나로 만든 것으로 마치 PL/SQL

패키지와 비슷한 개념입니다

 

  1. 혼합 TRIGGERDML TRIGGER여야 하며 테이블이나 뷰에 정의해야 합니다.
  2. 혼합 TRIGGER의 본문은 PL/SQL에서 작성한 혼합 TRIGGER 블록이어야 합니다.
  3. 혼합 TRIGGER 본문에는 초기화 블록이 포함될 수 없으므로 예외 섹션이 있을 수 없습니다.
  4. 한 섹션에서 발생하는 예외는 해당 섹션에서 처리되어야 합니다. 다른 섹션에서 처리하도록 권한을 이전할 수 없습니다.
  5. : OLD :NEW는 선언, BEFORE STATEMENT 또는 AFTER STATEMENT 섹션에 나타날 수 없습니다.
  6. BEFORE EACH ROW 섹션만 :NEW 값을 변경할 수 있습니다.
  7. FOLLOWS 절을 사용하지 않으면 혼합 TRIGGER의 실행 순서가 일정하지 않습니다.

(3) DML이 아닌 TRIGGER

- DDL 이벤트 TRIGGER

DML TRIGGER와 거의 동일하지만 TRIGGER 를 활용하여 DDL 작업을 하는 것만 다릅니다.

 

데이터베이스 이벤트 TRIGGER

데이터베이스 이벤트 TRIGGER란 데이터베이스 내에서 생기는 일들을 관리하기 위해서 생성하는 TRIGGER 입니다. 사용자 관련 이벤트가 있고 시스템 관련 이벤트가 있으며 아래와 같습니다.

 

- 유저 이벤트 TRIGGER:

  사용자가 발생시키는 작업에 TRIGGER를 생성합니다.

  CREATE, ALTER 또는 DROP

  로그온 또는 로그오프

 

- 데이터베이스 또는 시스템 이벤트 TRIGGER:

  데이터베이스 전체에 영향을 주는 작업에 TRIGGER를 생성합니다.

  데이터베이스 종료 또는 시작

  발생한 특정 오류 (또는 임의의 오류)

 

4) TRIGGER 생성

CREATE [OR REPLACE] TRIGGER trigger_name
timing
   event1 [ OR event2 OR event3 … ]
ON {table_name|view_name|SCHEMA|DATABASE}
[REFERENCING OLD AS old | NEW AS new]
[FOR EACH ROW [WHEN ( condition ) ] ]
   trigger_body

 

5) TRIGGER 관리

- 활성화/비활성화 하기

ALTER TRIGGER trigger_name DISABLE | ENABLE ;

- 특정 테이블에 속한 TRIGGER의 활성화/비활성화

ALTER TABLE table_name DISABLE | ENABLE ALL TRIGGERS ;

- TRIGGER 수정 후 다시 컴파일하기

ALTER TRIGGER trigger_name COMPILE ;

- TRIGGER 삭제

DROP TRIGGER trigger_name ;

- TRIGGER 조회하기

USER_TRIGGERS 를 조회하면 됩니다.

 

- TRIGGER 관련 권한들

 

스키마에서 TRIGGER를 생성, 변경 및 삭제할 수 있는 권한:

GRANT CREATE TRIGGER TO SCOTT ;

GRANT ALTER ANY TRIGGER TO SCOTT;

GRANT DROP ANY TRIGGER TO SCOTT ;

 

데이터베이스에서 TRIGGER를 생성할 수 있는 권한:

GRANT ADMINISTER DATABASE TRIGGER TO SCOTT ;

 

EXECUTE 권한 (TRIGGER가 실행하는 스키마에 포함되지 않은 객체를 참조하는 경우)

 

6) Trigger 예제 : 교재 참고

 


8장. INDEX(인덱스)

- INDEX는 특정 column에 대해서 오름차순, 내림차순 등으로 정렬해서 눈에 보이지 않지만 1, 2, 3, .. 숫자를 붙이는 것

- 오라클은 B - TREE 구조로 이루어져 있다

 

(1) UNIQUE INDEX

     ㄴ> 만들 때 유의

ID같은 곳에는 붙일 수 있으나 name 이런 데는 붙일 수 없다. -> 동일값이 올 수 없기 때문(동명이인 있을 수 있으므로 이름에는 안됨) -> 기본키나 중복을 가지지 못하는 열에서는 붙일 수 있다.

 

가능하면 UNIQUE INDEX를 붙인다 -> 속도가 더 빠르기 때문!

 

 

(2) NON-UNIQUE INDEX

ex) 이름으로 검색할 때 등, 많이 쓰임

 

(3) Function Based INDEX(FBI – 함수기반 인덱스)

* INDEX Suppressing Error ?

 

(4) DESCENDING INDEX (내림차순 인덱스)

 

(5) 결합 인덱스 (Composite INDEX)

                                                                                    ename, sex -> 복합인덱스 -> 복합키

                                                                                    기본키 일땐 순서가 필요 없는데 이 경우

                                                                                    순서가 필요

 

CASE1(sex, name)으로 했을 때와 CASE2(name, sex)로 했을 때가 다르다.

where name =     and sex =       

 

ex) 100개의 데이터가 있다.

CASE1

남자 / 여자로 거른다 -> 50명으로 걸러짐 -> 거기서 Smith를 찾는다 -> 2명 나옴

 

CASE2

이름으로 검색 -> 2명으로 걸러짐 -> 성별로 거름 -> 2명 나옴

-> 1단계에서 98개를 거를 수 있었으므로 이게 훨씬 낫다.

 

=> 많이 걸러지는 걸 앞에 두고 보편적인 것을 뒤에 둔다!

 

 

2) BITMAP INDEX(생략) -> 가장 빠르다

-> BINARY(이진) -> 흑백 (1, 0)으로 흑백을 나타내겠다.

    0~255로 색 농도 조절 -> 그레이스케일

CREATE BITMAP INDEX IDX_EMP_SEX_BIT
ON EMP(SEX) ;      -> 옵션(남, 녀)이 적을 수록 성능이 좋아진다.

데이터가 추가될 경우에는 ?

5. 인덱스의 주의사

 

1) DML에 취약하다

   (1) INSERT 작업 시 인덱스에 발생하는 현상 - INDEX Split 현상이 발생한다!  -> insert, update가 많으면 쓰면 안된다

   (2) Delete – Index 데이터는 지워지지 않는다 !

   (3) Update – Delete + Insert 현상이 발생한다

2) SQL 실행에 악영향을 줄 수 있 !

 


1) DML에 취약하다

(1) INSERT 작업 시 인덱스에 발생하는 현상

 

6. 인덱스 관리 방법

1) 인덱스 조회하기 [생략]

set line 200
col table_name for a10
col column_name for a10
col index_name for a20

SELECT table_name,column_name,index_name
FROM user_ind_columns
WHERE table_name='EMP2' ;

SELECT table_name, index_name
FROM user_indexes
WHERE table_name='DEPT2';

 

2) 사용 여부 모니터링 하기 -> 내가 만든 index를 사용하고 있는지 여부 확인

ALTER  INDEX   IDX_EMP_ENAME  MONITORING  USAGE ;  -- 모니터링 시작하기
ALTER  INDEX  IDX_EMP_ENAME  NOMONITORING USAGE ; -- 모니터링 중단하기
-- 사용 유무 확인하기
SELECT index_name, used
FROM v$object_usage
WHERE index_name='IDX_EMP_ENAME';

아무도 사용하지 않음..ㅠ

단 위 내용은 자신이 만든 인덱스만 확인 가능함.

전체 인덱스를 확인하려면 교재 P.393의 방법을 참고하세요

 

3) INDEX Rebuild 하기

DELETE된 자료가 있을 때 자리를 옮기지 않음(1234567 -> 12 67 ) -> Rebuild하면 (1234)로

DML 작업은 인덱스의 밸런싱 상태를 흩트려서 성능에 나쁜 영향을 줌.

주기적으로 점검해서 밸런싱 상태를 좋게 유지해야 함.

 

Index Rebuild 관련 실습은 교재 P.395를 참고

 

7. Invisible Index(인비저블 인덱스) - 11g New Feature

- 인덱스를 만들었는데 사용 중지를 하고싶다 -> Drop해서 지워도 되지만 지우지 않고 잠시 사용을 중지하는 것

[생략]

CREATE INDEX idx_emp_sal ON emp(sal) ;

Index created.

SELECT table_name,index_name,visibility
FROM user_indexes
WHERE table_name =  'EMP' ;

ALTER  INDEX  idx_emp_sal INVISIBLE ;

Index altered.

SELECT table_name, index_name, visibility
FROM user_indexes
WHERE table_name =  'EMP' ;

 

- 다시 상태를 VISIBLE로 변경해서 자동으로 사용하게 만들기

ename > '0'; -> 이름을 오름차순으로 정렬 (ename에 index가 걸려있어야 사용 가능)

= order by name(DB가 부담을 느낌)과 같은 효과지만 성능이 월등하게 높다

   ㄴ> 인덱스가 걸려있지 않으면 이걸 써야 함

 

소프트웨어에서는 가성비가 중요하다!

 

[SETP-UP 1] 다양한 인덱스 활용 방법들 [생략]

1) 인덱스를 활용하여 정렬한 효과를 내는 방법

2) 인덱스를 활용하여 최소값(MIN) / 최대값(MAX)을 구하는 방법

최소값 구하기
최대값 구하기

[ STEP-UP 2 ] ROWID 에 대해서 알아봅시다. [생략]

SELECT  ROWID, empno, ename
FROM  emp
WHERE  empno=7902 ;


 

728x90
728x90