8.9.4 준비된 문 및 저장 프로그램 캐시
세션 중에 클라이언트가 여러 번 수행 할 수있는 특정 문에 대해 서버는 문을 내부 구조로 변환 런타임에 그 구조가 사용되도록 캐시합니다. 캐시는 세션 동안 그것이 다시 필요할 때 문을 다시 변환하는 오버 헤드를 피할 수 있기 때문에 서버가보다 효율적으로 실행할 수 있습니다. 변환과 캐시는 다음 문에 이루어집니다.
SQL 레벨에서 처리되는 (
PREPARE
문을 사용하여)와 바이너리 클라이언트 / 서버 프로토콜을 사용하여 처리되는 (mysql_stmt_prepare()
C API 함수를 사용하여) 모두 준비된 문.max_prepared_stmt_count
시스템 변수는 서버가 캐시 문의 총 수를 제어합니다. (모든 세션에서 준비된 명령문의 총 수)저장 프로그램 (저장 프로 시저 및 함수, 트리거 및 이벤트) 이 경우 서버는 프로그램 본체 전체를 변환하고 캐시합니다.
stored_program_cache
시스템 변수는 서버가 세션 당 캐시 저장 프로그램의 대략적인 수를 나타냅니다.
서버는 세션별로 준비된 문 및 저장 프로그램의 캐시를 유지합니다. 하나의 세션에서 캐시 된 문은 다른 세션에서 액세스 할 수 없습니다. 세션이 종료하면 서버는이를 위해 캐시 된 모든 문을 파기합니다.
서버가 캐시 된 내부 문 구조를 사용하는 경우 구조가 오래되지 않은 점에 유의해야합니다. 문에 의해 사용되는 오브젝트 메타 데이터의 변경이 현재의 객체 정의 및 내부 문 구조로 표현되는 정의에 불일치가 발생할 수 있습니다. 메타 데이터 변경 테이블 생성, 삭제, 이름 변경, 잘라내는 DDL 문이나 테이블 분석, 최적화, 복구 할 DDL 문 등에 대해 발생합니다. 테이블의 내용의 변경 ( INSERT
나 UPDATE
등에 의한)에서는 메타 데이터가 변경되지 않고 SELECT
문도 변경되지 않습니다.
다음이 문제를 설명합니다. 클라이언트가이 문을 준비합니다.
PREPARE s1 FROM 'SELECT * FROM t1';
SELECT *
내부 구조에서 테이블의 컬럼들을 확장합니다. 테이블의 컬럼 세트가 ALTER TABLE
에 의해 변경되는 경우 준비된 문이 오래됩니다. 다음에 클라이언트가 s1
을 실행하면 서버가이 변화를 감지하지 않는 경우, 준비된 문은 잘못된 결과를 반환합니다.
준비된 문에서 참조되는 테이블이나 뷰의 메타 데이터의 변경에 원인이있는 문제를 피하기 위해 서버는 이러한 변화를 감지하고 다음 실행시에 문을 자동으로 다시 준비합니다. 즉, 서버는 문을 재분석하고 내부 구조를 재 구축합니다. 재분석은 캐시에 새 항목을위한 공간을 만들기 위해 암시 적으로 또는 FLUSH TABLES
에 의해 명시 적으로 참조되는 테이블이나 뷰가 테이블 정의 캐시에서 플러시 된 뒤에도 이루어집니다 .
마찬가지로 저장 프로그램에서 사용되는 개체에 변경이 발생한 경우, 서버는 프로그램의 영향을받는 문을 재분석합니다. (MySQL 5.6.6 이전에는, 서버는 저장 프로그램에 영향을주는 메타 데이터의 변경을 감지하지 못하기 때문에 이러한 변경으로 인해 잘못된 결과 또는 오류가 발생할 수 있습니다.)
서버는 식의 오브젝트 메타 데이터의 변경 탐지합니다. 이들은 DECLARE CURSOR
등의 저장 프로그램에 고유의 문과 IF
, CASE
및 RETURN
등의 흐름 제어 문에서 사용할 수 있습니다.
저장 프로그램 전체의 재 해석을 피하기 위해 서버는 필요에 따라 프로그램의 영향이있는 문장 혹은 표현만을 재분석합니다. 예 :
테이블 또는 뷰의 메타 데이터가 변경되어 있다고합니다. 재분석은 테이블이나 뷰에 액세스하는 프로그램에서
SELECT *
에 대해 수행되지만 테이블이나 뷰에 액세스하지SELECT *
에서는 수행되지 않습니다.문이 영향을받는 경우 서버는 가능한 한 부분적으로 만 그것을 다시 분석합니다. 이
CASE
문을 고려합니다.CASE
case_expr
WHENwhen_expr1
... WHENwhen_expr2
... WHENwhen_expr3
... ... END CASE메타 데이터의 변경이
WHEN
에만 영향을주는 경우식이 재분석됩니다.when_expr3
case_expr
및 기타WHEN
식은 재 해석되지 않습니다.
재분석은 원래 내부 형식으로 변환 유효했던 기본 데이터베이스와 SQL 모드가 사용됩니다.
서버는 최대 3 회 다시 해석을 시도합니다. 모든 시도가 실패하면 오류가 발생합니다.
재분석는 자동이지만, 그것이 행해진 경우 준비 진술과 저장 프로그램의 성능이 저하됩니다.
준비된 명령문의 경우 Com_stmt_reprepare
상태 변수가 다시 준비의 수를 추적합니다.