저장프로시저

면접 답변

  • 저장 프로시저는 DB 내부에 저장된 일련의 SQL 명령문들을 하나의 함수처럼 실행하기 위한 쿼리의 집합입니다. 저장프로시저를 사용하면, 두번째 실행부터는 캐시(메모리)에 있는 것을 가져와서 사용하므로 속도가 빨라지며, 여러개의 쿼리를 한번에 실행할 수 있다는 장점이 있습니다. 또한, 직접 SQL문을 호출하지 않고 저장 프로시저의 이름을 호출하도록 설정하면, 수정이 필요할 때 SP파일만 변경하면 되기 때문에 유지보수가 유리합니다.

    반면 단점으로는 DB확장이 어렵고, 프로시저가 여러 곳에서 사용될 경우 수정했을 때 영향이 어렵다는 점이 있습니다.

개념 정리

일반 쿼리

작동 방식

  • 일반 쿼리문은 파싱, 최적화, 컴파일 및 실행계획 등록, 실행 등 많은 과정을 매번 거쳐야함

Image
  • 구문분석

    • 구문 자체에 오류가 없는지 분석함

    • 구문 분석 트리 생성

    • 오류가 있으면 구문 오류 반환

  • 개체 이름 확인

    • 해당 테이블이 현재 db에 있는지 확인, 만약 있다면 그 안에 해당 열이 있는지 확인

  • 사용 권한 확인

    • 해당 테이블에 현재 사용자가 접근 권한이 있는지 확인

  • 최적화

    • 쿼리 옵티마이저가 최적의 실행 계획을 생성함 → 비용기반 혹은 규칙기반으로 작동

    • 인덱스 사용 여부, 조인 순서 (Join Order), 필터 조건 최적화를 고려하여 가장 효율적인 방법 선택

    • ex) 전체 데이터를 가져오는 쿼리의 경우 테이블 스캔이나 클러스터 인덱스 스캔을 사용

  • 컴파일 및 실행 계획 등록: 해당 실행 결과를 메모리에 등록

  • 실행

저장 프로시저

정의

Image
  • 지연된 이름 확인: 저장 프로시저를 정하는 시점에서 해당 개체(ex. 테이블)가 존재하지 않아도 상관없음

    • 프로시저 실행 당시에 테이블이 존재하는지를 확인함

    • 없는 테이블이 프로시저 정의에 사용되지 않았는지 실수를 주의해야함

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

  • 시스템 테이블 등록: 저장 프로시저의 이름 및 코드가 시스템 테이블에 등록

첫 저장 프로시저 실행

Image
  • 구문 분석 단계를 제외하고 일반 쿼리문과 동일함

  • 지연된 이름 확인에서 미루어 두었던 해당 개체 존재 유무를 개체 이름 확인을 통해 수행함

  • MySQL: 저장 프로시저 실행 계획 캐시 안함

    • 매번 실행할때마다 새로 최적화되고 실행됨

  • MSSQL: 생성된 실행 계획을 캐시(Plan cache)에 등록함

동일한 저장 프로시저가 다시 실행될 경우, 새로 최적화할 필요 없이 기존 계획을 재사용

이후 저장 프로시저 실행

  • MySQL: stored procedure의 코드를 compile하여 메모리 영역에 캐시로 저장한 후 stored procedure를 실행함

    • 동일한 session에서 같은 stored procedure를 재호출 하면 MySQL은 기존에 있는 캐시로 실행

  • MSSQL: 플랜 캐시를 먼저 확인:

    • 동일한 입력 파라미터일 경우: 기존의 실행 계획을 바로 사용

    • 다른 입력 파라미터인 경우: 파라미터화된 계획 (Parameterized Plan)이 존재하면 그대로 사용

    • 새로운 계획 생성이 필요할 경우 새로 컴파일됨(캐시미스)

장점

  • SQL Server의 성능 향상

    • 여러개의 쿼리를 한번에 실행

    • 캐시에 있는 것을 가져와 사용하므로 속도가 빨라짐

    • 쿼리를 쓸 때마다 옵티마이저가 구문을 분석하고 실행 가능한 코드로 바꿀려면 많은 비용이 드는데, 이 비용을 없앨 수 있음

  • 유지보수 및 재활용 측면

    • 개발 언어에 비의존적: 저장 프로시저는 DBMS 내에서 직접 실행됨

    • 응용프로그램에서 직접 SQL문을 호출하지 않고 SP를 호줄하도록 설정하여 사용하는 경우가 많음 → SP 파일만 수정하면 되기 때문에 유지보수에 유리함

  • 보안 강화

    • 사용자 별로 테이블에 권한을 주지 않고, SP에만 접근 권한을 주는 방식

  • 네트워크 부하 줄일 수 있음

    • 클라이언트에서 서버로 쿼리의 모든 텍스트가 전송될 경우 네트워크에는 큰 부하가 발생

    • 저장 프로시저를 사용하면 저장프로시저의 이름, 매개변수 등 몇글자만 전송하면 되기 때문에 부하를 크게 줄일 수 있음

단점

  • DB확장 어려움

    • 서버의 수를 늘려야할 때, DB의 수를 늘리는 것이 어려움

    • DB 교체는 거의 불가능함

  • 데이터 분석의 어려움

    • 개발된 프로시저가 여러 곳에서 사용 될 경우 수정했을 때 영향의 분석이 어려움(별도의 Description 사용)

    • 배포, 버전 관리 등에 대한 이력 관리가 힘듦

    • APP에서 SP를 호출하여 사용하는 경우 문제가 생겨도 해당 이슈에 대한 추적이 힘듦(별도의 에러 테이블 사용)

  • 낮은 처리 성능

    • 문자, 숫자열 연산에 SP를 사용하면 오히려 c, java보다 느린 성능을 보일 수 있음

꼬리 질문

  • 저장 프로시저 내에서 저장 프로시저를 호출할 수 있나요?

  • 저장 프로시저에서 트랜잭션을 제어할 때 주의할점은?

출처

https://eunsun-zizone-zzang.tistory.com/52

https://fourierdev.medium.com/mysql-stored-procedure-알아보기-in-mysql-1fdd342b661aarrow-up-right

Last updated