[MSSQL] 프로시저, 트리거, 뷰, 사용자 정의함수(스칼라, 테이블반환) 한번에 비교하기
프로시저 (Stored Procedure)
개념
미리 저장된 SQL 문들의 집합으로, 반복적으로 수행하는 작업을 재사용 가능하게 만들어줌.
파라미터를 받아 복잡한 작업을 수행할 수 있음.
주요 특징
실행 방식 | EXEC 또는 sp_executesql로 호출 |
입력/출력 | IN, OUT, INOUT 파라미터 가능 (OUTPUT 사용) |
트랜잭션 | 트랜잭션 내에서 수행하거나, 내부에서 시작할 수 있음 |
로직 | 조건문, 반복문, 에러 처리 등 T-SQL의 모든 로직 사용 가능 |
컴파일 | 최초 실행 시 컴파일되어 캐시에 저장됨 |
장점
복잡한 로직을 DB에 저장해서 비즈니스 로직 분산 가능
재사용 가능하고, 보안성 향상 (권한 제어 가능)
파라미터를 이용한 동적 쿼리 가능
단점
유지보수가 어려워질 수 있음 (버전 관리 문제)
함수보다 결과 반환이 자유롭지만, SELECT 내에서 직접 호출 불가
성능
한 번 컴파일된 실행계획을 프로시저 캐시에 저장하여 재사용
하지만 매개변수 스니핑(Parameter Sniffing) 문제로 성능 저하 가능성 있음
트리거 (Trigger)
개념
INSERT, UPDATE, DELETE 등의 DML 작업이 일어날 때 자동으로 실행되는 객체
주요 특징
실행 시점 | AFTER, INSTEAD OF 트리거 존재 |
트랜잭션 | 트리거는 원자성 보장을 위해 부모 트랜잭션과 함께 실행됨 |
가시성 | 자동 실행되므로 개발자가 직접 호출하지 않음 |
대상 | 테이블 또는 뷰 |
장점
데이터 무결성 보장 (자동 체크 및 로깅 등 가능)
복잡한 트랜잭션 로직을 자동화 가능
단점
숨겨진 로직으로 인해 디버깅 어려움
다단 트리거 호출 시 성능 저하 및 무한루프 가능성 있음
대량 DML 작업 시 성능에 큰 영향을 줄 수 있음
성능
DML과 함께 실행되기 때문에 성능 민감
가볍고 단순하게 구성해야 함
로깅, 감사 용도로는 유용하지만 데이터 가공에는 부적절
뷰 (View)
개념
하나 이상의 테이블을 조합한 가상의 테이블. 실제 데이터를 저장하지 않음 (일반 뷰 기준)
주요 특징
데이터 저장 | 일반 뷰는 저장 X, 인덱싱된 뷰(Indexed View)는 저장 O |
사용 방식 | 테이블처럼 SELECT * FROM ViewName 으로 조회 |
업데이트 | 단순한 뷰는 UPDATE/INSERT/DELETE 가능 (제약 있음) |
보안 | 특정 컬럼만 노출 가능하여 보안 측면에 유리 |
장점
쿼리 복잡도를 낮추고 재사용성 증가
사용자에게 복잡한 구조를 숨김
보안 레이어로 활용 가능 (Role-Based 접근 제어)
단점
복잡한 조인/서브쿼리 뷰는 성능 이슈 발생 가능
인덱스가 없으면 큰 테이블일수록 성능 저하
성능
일반 뷰는 실행 시점에 쿼리 수행 → 실행계획 캐시에 의존
인덱싱된 뷰(Materialized View 비슷) 사용 시 성능 향상 가능하지만 제약 조건 많음
사용자 정의 함수 (User Defined Function, UDF)
개념
반복적인 작업을 함수로 정의하여 사용. 결과 반환이 명확하고, 쿼리 내부에서 사용 가능
유형
스칼라 함수: 단일 값 반환
테이블 반환 함수: 하나 이상의 행 반환
Inline (가장 빠름)
Multi-statement (성능 저하 가능성 있음)
주요 특징
사용 위치 | SELECT, WHERE, JOIN, ORDER BY 등에서 사용 가능 |
부작용 없음 | 트랜잭션 조작 불가 (데이터 변경 불가) |
반환 | RETURNS 키워드로 단일 값 또는 테이블 반환 |
입력 | 매개변수 사용 가능 (IN만 가능) |
장점
재사용성 우수
쿼리 내에서 직접 사용 가능 (다양한 위치에서)
특정 계산식, 포맷, 조건 등에 유용
단점
복잡할 경우 실행계획 분리로 인해 성능 저하 발생 가능
스칼라 함수는 특히 비효율적인 루프 연산을 일으키기 쉬움
성능
Inline Table-Valued Function (iTVF) 은 성능 우수
Scalar 함수 또는 Multi-Statement 함수는 쿼리 옵티마이저가 병렬처리 못함 → 성능 저하
가급적 복잡한 로직은 프로시저나 iTVF로 분리