1. 시퀀스 (SEQUENCE)
기본 개념
시퀀스는 고유한 숫자 값을 자동으로 생성하기 위한 객체다. 보통 PK(기본키) 값 자동 증가에 많이 사용한다.
CREATE SEQUENCE seq_product_id
START WITH 1
INCREMENT BY 1
CACHE 20
NOCYCLE;
- START WITH 1 → 시작값 지정
- INCREMENT BY 1 → 1씩 증가
- CACHE 20 → 메모리에 20개 미리 로드해두고 빠르게 제공
- NOCYCLE → 최댓값 도달 시 다시 1로 돌아가지 않음
CACHE vs NOCACHE
- CACHE : 속도 ↑ (미리 번호 확보) / 단, DB 비정상 종료 시 일부 번호 건너뛸 수 있음
- NOCACHE : 항상 디스크에서 번호 가져옴 → 안정적이지만 느림
2. 트리거 (TRIGGER)
개념
트리거는 특정 이벤트(INSERT, UPDATE, DELETE)가 발생할 때 자동 실행되는 코드 블록이다.
예제: 상품 가격 변경 시 로그 기록
CREATE OR REPLACE TRIGGER trg_product_price_log
AFTER UPDATE OF unit_price ON cy_product
FOR EACH ROW
BEGIN
INSERT INTO cy_product_log (product_id, old_price, new_price, changed_at)
VALUES (:OLD.product_id, :OLD.unit_price, :NEW.unit_price, SYSDATE);
END;
- AFTER UPDATE → 가격 수정 후 실행
- :OLD, :NEW → 변경 전/후 값 참조 가능
- FOR EACH ROW → 각 행 단위로 실행
실무에서 자주 쓰이는 패턴: 변경 이력 테이블 관리
3. 프로시저 (PROCEDURE)
개념
프로시저는 일련의 SQL 작업을 묶어 재사용 가능한 형태로 만든 코드다. 함수와 달리 RETURN 값이 없어도 된다.
예제: 재고 입고 처리 프로시저
CREATE OR REPLACE PROCEDURE add_stock(
p_product_id IN NUMBER,
p_wh_id IN VARCHAR2,
p_qty IN NUMBER
) AS
BEGIN
INSERT INTO cy_stock_io (product_id, wh_id, qty, io_type, io_date)
VALUES (p_product_id, p_wh_id, p_qty, 'IN', SYSDATE);
UPDATE cy_inventory
SET quantity = quantity + p_qty
WHERE product_id = p_product_id
AND wh_id = p_wh_id;
END;
장점: 재고 추가 로직을 하나로 묶어 호출만 하면 됨
4. 함수 (FUNCTION)
개념
함수는 반드시 하나의 값을 RETURN 해야 한다. SELECT 문 안에서도 호출 가능하다.
예제: 금액 계산 함수
CREATE OR REPLACE FUNCTION calc_total_price(
p_unit_price IN NUMBER,
p_qty IN NUMBER
) RETURN NUMBER IS
BEGIN
RETURN p_unit_price * p_qty;
END;
사용 예시:
SELECT product_id, calc_total_price(unit_price, 10) AS total
FROM cy_product;
함수는 SELECT 문에서 호출 가능하다는 점이 프로시저와 가장 큰 차이
5. 인덱스 (INDEX)
개념
인덱스는 테이블 검색 속도를 높이는 자료구조(B*Tree 구조).
CREATE INDEX idx_product_name ON cy_product(product_name);
- 장점: 검색 속도 향상
- 단점: INSERT/UPDATE/DELETE 시 인덱스 갱신 비용 발생
복합 인덱스
CREATE INDEX idx_product_vendor ON cy_product(vendor_id, product_name);
자주 쓰는 컬럼 조합에 걸면 효과적
6. 실행계획 (Execution Plan)
EXPLAIN PLAN 예제
EXPLAIN PLAN FOR
SELECT * FROM cy_product WHERE product_name = 'TV';
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
- TABLE ACCESS FULL → 테이블 전체 스캔
- INDEX RANGE SCAN → 인덱스를 통해 범위 검색
- INDEX UNIQUE SCAN → 고유 인덱스를 통한 빠른 검색
실행계획을 보고 인덱스 필요 여부, 조인 방식(NESTED LOOP, HASH JOIN 등)을 확인할 수 있다.
7. 실무에서 묶어 쓰는 패턴
- 시퀀스 + 트리거
→ INSERT 시 PK 자동 채번 - 트리거 + 로그 테이블
→ 변경 이력 관리 - 프로시저로 CRUD 캡슐화
→ 복잡한 로직을 DB 내부에서 처리 - 함수로 계산식 통일
→ 금액 계산, 상태 코드 변환 등에 활용 - 인덱스 + 실행계획 확인
→ 성능 튜닝의 핵심
- 시퀀스: 고유 번호 생성 (CACHE 옵션 주의)
- 트리거: 이벤트 발생 시 자동 실행 (로그 관리, 제약조건 강화)
- 프로시저: 여러 SQL 로직을 묶어 재사용
- 함수: 반드시 RETURN, SELECT 안에서도 호출 가능
- 인덱스: 검색 성능 개선 (삽입·수정 시 오버헤드 주의)
- 실행계획: 쿼리 성능 분석 필수
'DB' 카테고리의 다른 글
| ORA- 01841 년은 -4713 과 +4713 사이의 값으로 지정해주세요 (0) | 2025.09.01 |
|---|---|
| SQL 오라클 자동증가 방법 (0) | 2025.08.29 |
| MySQL Oracle 조건문 /Insert 문/TOP N 행 / 집계문자열 정리 (1) | 2025.08.11 |
| MySQL 과 Oracle NULL 처리 – IFNULL vs NVL (1) | 2025.08.11 |
| MySQL 과 Oracle 자동 증가(PK) 구현 차이/ LIMIT vs ROWNUM – 결과 제한 처리 (0) | 2025.08.11 |