2014-06-14 3 views
0

공통된 진언은 입니다.Statement을 초과하여 PreparedStatement을 선호합니다. 이는 SQL 주입으로부터 보호하고 성능에서 (중요한) 이득을 얻기 때문입니다.PreparedStatements를 재사용하지 않을 경우 성능에 영향이 있습니까?

그러나 내 코드가 제대로 다시 사용하지 않고 동일한 PreparedStatement을 반복해서 다시 작성하면 어떻게됩니까?

Statement을 사용하는 것보다 성능상의 이점이 있습니까? 아니면 문자열 매개 변수에 대해 중량급 따옴표 이스케이프 엔진을 사용하고 있습니까?

답변

1

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 문으로 클라이언트를 계속해서 다시 작성했는지는 중요하지 않습니다.

+0

"단순한"쿼리의 캐시 적중 횟수를 늘리기 위해 Oracle에서 쿼리의 리터럴을 필터링하지 않는 이유가 궁금합니다. 왜 이것이 매개 변수화 된 쿼리와 같은 캐싱 결과를 산출하지 않는지에 대한 설명이 누구에게 있습니까? – Timo

+0

최신 버전 일 수 있습니다. 필자의 경험은 Oracle 7부터 11까지입니다. 이후 릴리스에서는 리터럴을 필터링하는 것과 유사한 작업을 수행하는 것으로 보이는 CURSOR_SHARING이라는 서버 구성 옵션이 있었지만 기본값이 아니며 다른 효과가있었습니다. 우리는 여전히 캐시를 확인하고 준비된 선언문으로 작성되지 않은 진술과 관련하여 앱 개발자에게 돌아 왔습니다. – Glenn

관련 문제