본문 바로가기

DEV LOGS

[MSSQL] T-SQL(Transact SQL) VS Stored Procedure

일반 SQL VS 저장 프로시저

일반 SQL에 비해 저장 프로시저의 속도가 더 빠르다.

- 저장 프로시저는 일반 SQL에 비해 컴파일 및 최적화 하는 횟수가 적다.


(예시 1)

1
2
3
SELECT * FROM userTbl WHERE id = 'LSG';
SELECT * FROM userTbl WHERE id = 'KBS';
SELECT * FROM userTbl WHERE id = 'KKH';
cs

- 위의 3개의 쿼리문은 모두 다른 쿼리문으로 인식하여 한 줄의 쿼리문을 사용할 때마다 컴파일과 최적화 과정을 거친다.

1
2
3
4
5
6
7
8
9
10
-- 저장 프로시저 생성
CREATE PROCEDURE usp_id
    @id NVARCHAR(10)
AS 
    SELECT * FROM userTbl WHERE userID = @id
 
-- 저장 프로시저 
EXECUTE usp_id 'LSG';
EXECUTE usp_id 'KBS';
EXECUTE usp_id 'KKH';
cs

- 앞에 사용했던 3개의 쿼리문과 같은 작동을 하지만 최초로 저장 프로시저를 사용 할 때 한 번만 컴파일 및 최적화 과정이 발생한다.

이 후 2번의 저장 프로시저 사용시 컴파일 및 최적화 과정이 생략된다.


(예시 2)

1
2
SELECT * FROM userTbl WHERE id = 'LSG';
sELECT * FROM userTbl WHERE id = 'LSG';        -- SELECT 맨 앞 알파벳만 소문자이다.
cs

- 위의 2개의 쿼리문은 논리적으로 같으며,  같은 결과를 보여준다. 하지만 맨 앞 알파벳 's'가 다르기 때문에 다른 쿼리문으로 인식하여 컴파일과 최적화 과정이 각각 발생한다.


일반 SQL의 처리 과정

(1) 최초 실행시

(2) 같은 쿼리 실행시


- 구문 분석 : SELECT, FROM 등의 단어에 오류가 없는지 분석, 예약어가 아니거나 오타일 경우에는 여기서 오류 발생하여 더 이상 진행하지 않는다.

- 개체 이름 확인 : 데이터베이스에 테이블이 존재하는지 확인, 존재 한다면 열이 있는지를 확인한다.

- 사용권한 확인 : 현재 사용자가 접근할 권한이 있는지 확인한다.

- 최적화 : 구문을 가장 좋은 성능을 낼 수 있는 경로를 결정한다. 주로 인덱스 사용 여부를 결정한다고 생각하면 된다. (테이블 스캔 or 인덱스 찾기)

- 컴파일 및 실행계획 등록 : 최적화된 결과를 컴파일한다. 그리고 그 결과(실행 계획)를 메모리(캐시)에 등록한다.


저장 프로시저 처리 과정

(1) 최초 실행시

(2) 이미 실행한 저장 프로시저 실행시

- 개체 이름 확인 : 관련 카탈로그 뷰를 통해 저장 프로시저가 존재 하는지 확인

- 사용권한 확인 : 현재 사용자가 접근할 권한이 있는지 확인한다.

- 최적화 : 구문을 가장 좋은 성능을 낼 수 있는 경로를 결정한다. 주로 인덱스 사용 여부를 결정한다고 생각하면 된다. (테이블 스캔 or 인덱스 찾기)

- 컴파일 및 실행계획 등록 : 최적화된 결과를 컴파일한다. 그리고 그 결과(실행 계획)를 메모리(캐시)에 등록한다.


저장 프로시저 생성 과정

- 구문 분석 : 일반 T-SQL과 마찬가지로 해당 구문의 오류 등을 파악, 오류 발생시 더 이상 진행하지 않는다.

- 지연된 이름 확인 : 저장 프로시저의 특징으로 저장프로시저를 정의하는 시점에서 해당 개체(주로 테이블)가 없어도 관계가 없다는 의미이다.

                           그렇지만 이미 테이블이 있다면, 개체를 확인하므로 사용하는 열 이름이 틀리면 안된다. (틀리면 오류 발생)

- 사용권한 확인 : 현재 사용자가 저장 프로시저를 생성할 권한이 있는지 확인한다.

- 시스템 테이블 등록 : 저장 프로시저의 이름 및 코드가 관련 시스템 테이블에 등록된다.




참고문헌


우재남, 『뇌를 자극하는 SQL Server 2012』 한빛미디어 (2013-03-02 초판발행)