PSD( Private-Self-Development )

저장 프로시저(Stored Procedure) 란? 본문

Backend/DB

저장 프로시저(Stored Procedure) 란?

chjysm 2023. 2. 7. 14:24

저장 프로시저?

 

쿼리문을 메서드 형식으로 만들고 어떠한 동작을 일괄적으로 처리하도록 각 DBMS 에서 지원하는 기능

여러 컬럼과 테이블을 조인하고 조회 조건을 거는 등

이러한 긴 쿼리문을 그때그때 사용하는 것이 아닌, 프로시저 로 저장 해 놓고 이를 호출하는 것이 효율적이다.

 

장점 

  • 하나의 요청으로 여러 sql 문 실행 가능( 네트워크 소요시간 최소화 )
  • DB 와 백엔드 를 구분해 개발 할 수 있다. 
  • 성능 향상
    • 저장 프로시저를 처음에 실행하면, 최적화, 컴파일 단계를 거쳐 그 결과가 캐시(메모리) 에 저장되고, 이후에 해당 저장 프로시저를 실행하면 캐시에서 데이터를 읽어와 성능 개선이 된다.
  • 보안 강화
    • 사용자 별로 테이블에 대한 접근 권한이 아닌, 프로시저에 접근 권한을 주는 방식으로 보안을 강화 할 수 있다.

 

단점

  • 처리 성능이 낮다.(문자나 숫자 연산이 있을 경우)
  • 디버깅이 어렵다.
  • DB에 부담이 된다 또한 DB는 확장이 어렵다.

 

일반적인 SQL 문 실행 과 프로시저 실행의 동작 방식 비교

일반 SQL 문 실행

  1. 구문분석
    • 해당 구문이 오류가 없는지 확인
  2. 개체 이름 확인
    • 테이블 이 존재하는지, 테이블에 해당 컬럼이 존재하는지 확인
  3. 사용 권한 확인
  4. 최적화
    • 가장 좋은 성능을 낼 수 있는 경로를 결정
  5. 컴파일 및 실행 계획 등록 
    • 최적화 결과를 바탕으로 컴파일 및 실행 계획을 메모리(캐시) 에 등록
  6. 컴파일 결과 실행

 

이후 동일 SQL(한 글자도 틀리지 않고 같아야 한다) 실행 시 

  1.  메모리(캐시) 확인
  2.  메모리(캐시) 에서 실행 계획 추출
  3. 실행 

 

프로시저 실행

  1. 개체 이름 확인
  2. 사용 권한 확인
  3. 최적화
  4. 컴파일 및 실행 계획 등록
  5. 컴파일 결과 실행

와 같이 첫 실행 시 구문 분석이 빠진 것( 프로시저 생성 시 확인 ) 말고는 동일하다.

이후 동일 SQL 실행 시에도 동일하다.

 

하지만 차이점이 존재하는데,

동일 쿼리임을 판단하는 기준이 다르다.

/* 일반 sql : 다 다르게 인식 */
SELECT * FROM TB WHERE NAME = 'A';
SELECT * FROM TB WHERE NAME = 'B';
SELECT * FROM TB WHERE NAME = 'C';

/* 프로시저 : 처음 한번을 이후는 동일하게 인식 */
EXEC TB_SELECT 'A';
EXEC TB_SELECT 'B';
EXEC TB_SELECT 'C';

 

이러한 특징으로 인해 처음 한번 을 제외하고는 

성능 최적화가 이루어진다. 

 

다만 최적화 단계를 처음 한번 만 수행하므로 성능 문제가 생긴다(인덱스 문제)는 단점이 있다.

즉 사용하는데 주의가 필요하다.

 

 


 

참조: 

https://runcoding.tistory.com/31

 

[DB] Procedure 프로시저 개요 및 장단점

저장 프로시저 (Stored Procedure) 프로시저란 SQL Server에서 제공하는 프로그래밍 기능입니다. 쿼리문을 마치 하나의 메서드 형식으로 만들고 어떠한 동작을 일괄적으로 처리하는 용도로 사용됩니다.

runcoding.tistory.com

https://devkingdom.tistory.com/323

 

[MSSQL] 저장 프로시저 (Stored Procedure) 란?

실무에서는 프로그램에서 만들어 놓은 SQL문을 저장해 놓고, 필요할 때마다 호출해서 사용하는 방식으로 프로그램을 만든다. 저장 프로시저 (Stroed Procedure) 저장 프로시저는 이러한 방식이 가능

devkingdom.tistory.com

 

'Backend > DB' 카테고리의 다른 글

[MYSQL] InnoDB VS MyISAM  (0) 2023.03.06