바인딩 변수를 쓰면서 강제로 하드파싱을 시킬 수 있나요? 0 3 1,777

by 손님 [어플리케이션관련] 바인딩 변수 하드파싱 PreparedStatement [2009.10.29 09:45:32]


안녕하세요. 일단 질문 자체가 좀 말이 안되긴 합니다만 상황이 애매합니다.

현재 공공기관쪽의 SI를 하고 있습니다.

그런데 국정원의 권고사항에서 sql 인젝션등의 보안 이슈로 인해서 PrepredStatement(자바에서 바인딩 변수를 사용할 수 있는 클래스)를 사용하도록 권고하고 있습니다.

그래서 모든 쿼리가 PreparedSatement를 사용하고 있는데요.

쿼리 중에서 상당 부분이 통계성쿼리인데 데이터의 분포도가 매우 비대칭적인 경우가 많습니다.

그래서 하드파싱하면 1초도 안되서 끝날 쿼리가 20초에서 몇분까지 걸리는 경우가 자주 발생하고 있습니다. 힌트를 사용해서 쿼리마다 튜닝해주기도 어렵습니다.(허접한 실력이라서...)

물론 PrepredStatement를 안쓰면 되지만 이게 권고사항이라 제 맘대로 사용할 수가 없네요.

혹시 PrepredStatement나 오라클 힌트중에서 강제로 하드 파싱을 하도록 할 수 있는 옵션이 있나요?

구글링으로도 쉽지가 않네요.

조그마한 힌트라도 주세요 ~

by 현 [2009.10.29 10:08:15]
데이터의 분포도가 비대칭 일경우 바인드 변수를 사용했을때 곤란하시죠..
그럴때 카디널리티가 높지 않다면 쿼리를 분리 하는 방법이 있습니다.
해당 컬럼에 인덱스를 타야 할 경우와 안타야 할 경우를 분리하여 sql을 만드시면 됩니다.

by 발로차는새 [2009.10.29 11:10:45]
저흰 이런식으로 대응하고 있습니다

select * from 테이블 where 분포도짱조건
union all
select * from 테이블 where 분포도꽝조건

by 글쓴이 [2009.10.29 18:07:31]
현님 답변감사합니다.
지금 실제 적용될 디비의 카디널리티를 정확히 알지 못하기 때문에 sql을 분리하기는 어려울 것 같습니다.

발로차는새님 답변 감사합니다.
지금 테스트 디비인 관계로 사정상 실제 디비의 분포도를 정확히 알 수 없습니다.

일단 꼭 필요한 곳만 Statement를 사용하면서 sql 인젝션에 대비해서 변수를 잘 걸러내는 방법을 사용해봐야겠습니다.

의견주신 두 분께 정말 감사드립니다.^^
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입