Statement를 통해 PreparedStatement를 다시 작성하면 여전히 이점이 있지만 공급 업체에 의존하게됩니다. 예를 들어, 오라클에서는 바인드 변수를 사용하는 것이 서버의 SQL 캐시를 파괴하지 않기위한 좋은 방법이었습니다.
Oracle 서버는 sql 문자열의 해시를 사용하여 Oracle 서버의 sql 캐시에 이미 있는지 확인합니다. 그렇다면 명령문에 대한 캐시 된 pcode를 다시 사용할 수 있습니다. 이 경우 구문 분석, 유효성 검사, 권한 부여 확인 등과 같은 많은 작업이 이미 완료되었으며 매개 변수 영역 만 업데이트해야합니다. 또한 새로운 명령문을 거기에 넣지 않아도되므로 SQL 캐시의 사용이 최소화됩니다. 는 SQL 캐시에 캐시 히트가 발생하지 것이다
SELECT wage FROM employee WHERE employee_id = 1
SELECT wage FROM employee WHERE employee_id = 2
SELECT wage FROM employee WHERE employee_id = 3
SELECT wage FROM employee WHERE employee_id = 4
명령문은 클라이언트로부터받은, 그래서 모든 구문 분석 작업 : 잘못 설계된 응용 프로그램에서
, 우리는 같은 문장의 전체 SQL 캐시를 볼 것입니다 다시 수행해야하고 새 명령문이 캐시에 추가되어야합니다. 문을 구문 분석하는 추가 작업이있을뿐만 아니라 캐시가이 항목으로 넘치므로 쓸모 없게되었습니다. 제대로 설계된 응용 프로그램에서는 응용 프로그램이 실행되는 모든 명령문이 예열되면 캐시에 저장되도록 SQL 캐시의 크기를 조정할 수 있습니다.
사전 공격자를 찾기 위해 유사한 접두어로 문장을 계산하고, 바인드 매개 변수를 사용하도록 응용 프로그램 코드를 얻습니다 (Java 코드 인 경우 개발자에게 PreparedStatements 사용을 요청). 그런 다음 캐시에 다음과 같은 문이 표시됩니다.
단일 명령문. 그리고 클라이언트가 같은 캐시 히트에 나왔다면 Prepared 문으로 클라이언트를 계속해서 다시 작성했는지는 중요하지 않습니다.
"단순한"쿼리의 캐시 적중 횟수를 늘리기 위해 Oracle에서 쿼리의 리터럴을 필터링하지 않는 이유가 궁금합니다. 왜 이것이 매개 변수화 된 쿼리와 같은 캐싱 결과를 산출하지 않는지에 대한 설명이 누구에게 있습니까? – Timo
최신 버전 일 수 있습니다. 필자의 경험은 Oracle 7부터 11까지입니다. 이후 릴리스에서는 리터럴을 필터링하는 것과 유사한 작업을 수행하는 것으로 보이는 CURSOR_SHARING이라는 서버 구성 옵션이 있었지만 기본값이 아니며 다른 효과가있었습니다. 우리는 여전히 캐시를 확인하고 준비된 선언문으로 작성되지 않은 진술과 관련하여 앱 개발자에게 돌아 왔습니다. – Glenn