Cubrid는 어떤 쿼리를 동일한 쿼리로 판단할까?
질의시 하드파싱된 쿼리는 PlanCache에 저장된다. 저장 후 동일 한 질의시 하드파싱 부하를 줄이기 위해서 저장하는데
CUBRID는 어떤 쿼리를 동일한 쿼리로 판단할까?
우선 PlanCache에 저장된 값 확인 가능하게 서버 실행 통계정보 누적하여 볼 수 있게 세팅한다.
서버 실행 통계 정보 수집
Csql 사용하여 세팅 Csql>;set communication_histogram=yes Csql>;.hist on
아래 명령으로 이제 누적된 실행 통계 정보를 확인할 수 있다. $> cubrid statdump demodb |
질의 수행에 따른 PlanCache 변화를 보고 동일 쿼리인지 확인 한다.
1. SELECT * FROM athlete |
*** SERVER EXECUTION STATISTICS *** Num_plan_cache_add = 1 Num_plan_cache_lookup = 2 Num_plan_cache_hit = 0 Num_plan_cache_miss = 2
|
한개의 쿼리가 PlanCache에 추가 되었다.
2. SELECT * FROM athlete |
*** SERVER EXECUTION STATISTICS *** Num_plan_cache_add = 1 Num_plan_cache_lookup = 3 Num_plan_cache_hit = 1 Num_plan_cache_miss = 2 |
SELECT * 이후 띄어쓰기 하였는데 같은 질의로 보고 하드파싱 하지 않고 hit되었다.
3. SELECT * FROM ATHLETE |
*** SERVER EXECUTION STATISTICS *** Num_plan_cache_add = 2 Num_plan_cache_lookup = 5 Num_plan_cache_hit = 1 Num_plan_cache_miss = 4 |
Table를 대문자로 변경하였는데 새로운 쿼리로 인식하고 PlanCache에 추가되었다.
4. select * from athlete |
*** SERVER EXECUTION STATISTICS *** Num_plan_cache_add = 2 Num_plan_cache_lookup = 6 Num_plan_cache_hit = 2 Num_plan_cache_miss = 4 |
Table은 대소문자로 구분하여 PlanCache에 추가 하였는데 selete문장은 대소문자를 구분하지 않고 hit 되었다.
5. select * from athlete where nation_code = ‘KOR’ |
*** SERVER EXECUTION STATISTICS *** Num_plan_cache_add = 3 Num_plan_cache_lookup = 8 Num_plan_cache_hit = 2 Num_plan_cache_miss = 6 |
새로운 쿼리인 만큼 PlanCache에 추가 되었다.
6. select * from athlete where nation_code = ‘JPY’ |
*** SERVER EXECUTION STATISTICS *** Num_plan_cache_add = 3 Num_plan_cache_lookup = 9 Num_plan_cache_hit = 3 Num_plan_cache_miss = 6 |
조건 값만 변경할 경우 hit 되었다.
7. select * from athlete where nation_code = ? Bind ‘KOR’ |
*** SERVER EXECUTION STATISTICS *** Num_plan_cache_add = 3 Num_plan_cache_lookup = 10 Num_plan_cache_hit = 4 Num_plan_cache_miss = 6 |
조건 값을 Bind 처리 하여 질의하여 hit 되었다.
바인드는 처음 사용하는데 기존 쿼리 조건값이 바인드 변수가 아니여도 같은 쿼리로 인식 일관성 있게 hit하고 있다.
8. select * from athlete where nation_code = ? Bind ‘JPY’ |
*** SERVER EXECUTION STATISTICS *** Num_plan_cache_add = 3 Num_plan_cache_lookup = 11 Num_plan_cache_hit = 5 Num_plan_cache_miss = 6 |
이조건은 누구나 예상하듯 hit 한다.
결론
띄어쓰기 무시, 예약어의 대소문자 미구분, 조건값 및 Bind 값 변경에 대하여 하나의 쿼리로 인지하고 있다.
이는 PlanCache Hit률을 높여 하드파싱 부하를 최소화 하고자 하는 CUBRID의 PlanCache 운용 방법을 알 수 있다.