자주 사용하는 쿼리를 모듈화 시켜서 필요할때 호출하여 사용하도록 제작 한 것
하나의 개체로서 데이터베이스 내부에 저장됨
create procedure 프로시저 이름
as
쿼리
형식으로 생성하며
exec 프로시저 이름
형식으로 사용 함
수정은 alter procedure, 삭젠ㄴ drop procedure
실행 시 입력 매개변수 지정이 가능
@입력매개변수이름 데이터 형식 [ = 디폴트 값]
exec 프로시저 이름 [입력매개변수]
형식으로 사용 함
출력 매개변수 지정도 가능
@출력매개변수이름 데이터형식 OUTPUT(또는 OUT)
exec 프로시저 이름 @변수명 OUTPUT
형식으로 사용 함
프로시저 내부에서 sql 프로그래밍이 가능
exec sp_helptext 프로시저 이름
을 사용하면 프로시저 코드를 볼 수 있으며 프로시저 생성 시 with encryption 옵션을 주면 암호화가 되어 코드를 볼 수 없음
저장 프로시저를 사용하면 서버 성능을 향상시킬 수 있음
처음 프로시저를 실행하면 최적화, 컴파일 등의 과정을 거치고 그 결과가 메모리에 저장됨
다시 프로시저를 실행하면 메모리에 올라간 것을 사용하므로 최적화, 컴파일 과정이 생략 됨
쿼리를 저장 프로시저로 저장해 놓으면 쿼리 관리, 실행이 수월해짐
사용자에게 테이블 접근 권한을 주지 않고 프로시저 실행 권한만 주어 보안을 강화 할 수 있음
긴 쿼리를 저장 프로시저로 만들면 네트워크 전송량도 줄일 수 있어 네트워크 부하가 줄어듬
저장 프로시저의 종류
사용자 정의 프로시저
T-SQL 저장 프로시저
사용자가 직접 create proc 으로 생성한 프로시저
CLR 저장 프로시저
T-SQL 프로시저 보다 효율적이고 강력한 프로그래밍이 가능
.net framework 어셈블리 클래스에 공용의 정적 메소드로 구현되며, 사용자로부터 매개변수를 입력받아 결과를 반환하는 .net franework clr 메소드의 참조로 사용됨
시스템 저장 프로시저
시스템 관리를 위해 sql server에서 제공하는 프로시저
주로 sp_ 라는 접두어가 붙어있음
저장 프로시저의 작동
일반 T-SQL문을 실행하면 다음 순서에 따라 작동 됨
구문분석 : select, from 등 단어에 오류가 있는지 분석, 예약어나 오타를 체크
개체 이름 확인 : 테이블, 데이터베이스, 컬럼 등 이름이 정상적으로 있는지 확인
사용권한 확인 : 현 사용자가 접근 권한이 있는지 확인
최적화 : 쿼리의 가장 좋은 성능을 낼수있는 결로를 결정, 주로 인덱스 사용 여부를 결정
컴파일 및 실행계획 등록 : 최적화된 결과를 컴파일 하고 결과(실행계획)을 메모리에 등록
실행 : 컴파일된 결과를 실행
동일한 T-SQL문을 다시 실행하면 메모리에서 실행계획을 읽어와 바로 실행
동일한 쿼리의 조건은 대소문자 띄어쓰기 등이 완전 같아야 함 select와 Select 만 달라도 구문분석부터 시작 됨
저장 프로시저의 정의 순서는 다음과 같음
저장 프로시저 정의 (create proc)
구문 분석 : 구문의 오타나 문법 오류 등을 파악
지연된 이름 확인 : 프로시저를 정의 하는 시점에서 개체 (테이블 등)가 없어도 관계가 없음, 개체의 존재 여부는 프로시저 실행 시 확인하게 됨 (이미 있는 테이블의 컬럼 명이 다르면 안됨)
생성권한 확인 : 현 사용자가 저장프로시저를 생성할 권한이 있는지 확인
시스템 테이블에 등록 : 저장프로시저의 이름 및 코드가 시스템 테이블에 등록 됨 (sys.objects, sys.sql_modules 카탈로그 뷰로 확인 가능)
저장 프로시저를 정의한 후 최초 1회의 작동 방식은 다음과 같음
개체 이름 확인 → 사용권한 확인 → 최적화 → 컴파일 및 실행계획 등록 → 실행
프로시저 정의 시 진행한 구문 분석을 포함하면 일반 쿼리 실행 순서와 유사함
두번째 실행 시에는 메모리에 저장된 것을 그대로 사용
저장 프로시저의 재컴파일
첫 실행에서 최적화된 저장프로시저가 다시 실행될 때 다른 최적화 방식을 사용해야 할 때는 재컴파일 되어야 함
4가지 방법이 있음
-프로시저 실행 시 with recompile 옵션을 추가
-'sp_recompile 테이블 이름' 시스템 프로시저를 사용하면 해당 테이블과 관련된 프로시저를 다시 사용할 때 재컴파일 됨
-dbcc freeproccache 를 사용하면 메모리 프로시저 캐시 영역을 비우고 프로시저 사용시 재컴파일 함
-저장프로시저를 실행할 때마다 자동으로 재컴파일되도록 프로시저 작성
'MSSQL' 카테고리의 다른 글
블로킹과 교착상태 (0) | 2016.03.10 |
---|---|
트랜잭션과 잠금 (0) | 2016.03.10 |
인덱스 (0) | 2016.03.10 |
사용자정의 데이터 형식 (0) | 2016.02.23 |
WITH 절과 CTE (0) | 2016.02.23 |