Background Image
조회 수 15700 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

쿼리에서 binding하는 구문(? 가 들어가서 이 부분이 place holder로서 작용하는 부분)이 있을 시 범위 질의에서 플랜이 달라지는 경우가 발생한다. 플랜이 하나로 될 수 있음에도 둘로 갈라지면서 성능이 느려질 수 있는 부분이 있다.

위의 경우에 대해서 아래 3가지를 비교하면서 그 차이를 설명한다
.
 
1.Where
절에 조건을 상수로 준 경우 => range plan 1
  String sql = "select nation_code from participant where host_year >= 2004 and host_year <= 2008";

plan : Join graph segments (f indicates final):
seg[0]: [0]
seg[1]: nation_code[0] (f)
seg[2]: host_year[0]
Join graph nodes:
node[0]: participant participant(916/16) (sargs 0)
Join graph terms:
term[0]: participant.host_year range (2004 ge_le 2008) (sel 0.0588235) (rank 2) (sarg term) (not-join eligible) (indexable host_year[0]) (loc 0)


2.Where
절에 조건을 “?+상수로 준 경우 => range plan 2
  String sql = "select nation_code from participant where host_year >= ?+4 and host_year <= ?+8";

plan : Join graph segments (f indicates final):
seg[0]: [0]
seg[1]: nation_code[0] (f)
seg[2]: host_year[0]
Join graph nodes:
node[0]: participant participant(916/16) (sargs 0 1)
Join graph terms:
term[0]: participant.host_year range (min inf_le 2008) (sel 1) (rank 2) (sarg term) (not-join eligible) (indexable host_year[0]) (loc 0)
term[1]: participant.host_year range (2004 ge_inf max) (sel 0.0588235) (rank 2) (sarg term) (not-join eligible) (indexable host_year[0]) (loc 0)


3.Where
조건을 “?”로 준 경우 => range plan 1, 1.의 경우와 같음.
  String sql = "select nation_code from participant where host_year >= ? and host_year <= ?";

plan : Join graph segments (f indicates final):
seg[0]: [0]
seg[1]: nation_code[0] (f)
seg[2]: host_year[0]
Join graph nodes:
node[0]: participant participant(916/16) (sargs 0)
Join graph terms:
term[0]: participant.host_year range (2004 ge_le 2008) (sel 0.0588235) (rank 2) (sarg term) (not-join eligible) (indexable host_year[0]) (loc 0)



1
3의 경우 > < 의 범위질의를 하나로 처리하는 모습이 보인다. participant.host_year range (2004 ge_le 2008)
2
이와 달리participant.host_year range (min inf_le 2008) participant.host_year range (2004 ge_inf max) 의 두 가지로 범위질의를 나누어 처리하게 된다
.

이 결과에 따르면 플랜은 처음 작성된 쿼리 문장 자체를 가지고 작성하게 된다. 따라서, ? 부분이 binding 되기 이전에 플랜을 작성하는 것이므로 이렇게 다르게 플랜이 나오는 것은 그 동작이 자연스러운 결과라 할 수 있다
.

쿼리를 작성할 때 좀더 최적화된 형태를 고려한다면, ? binding 되는 부분이 연산된 결과의 값으로 작성하는 것이 유리하다 하겠다. 요약하면, ?+ 상수 형태로 값을 넘기는 것 보다는 값을 미리 계산한 결과값을 ?에 전달하는 것이 최적화된 쿼리라 하겠다
.

,

select nation_code from participant where host_year >= ?+4 and host_year <= ?+8
보다
select nation_code from participant where host_year >= ? and host_year <= ?
이 더 최적화된 쿼리라 할 수 있다.




  1. 용량이 큰 데이터를 질의로 저장하는 방법

  2. 윈도우 환경에서 PHP 모듈 로드를 못 할 경우 해결법

  3. CUBRID에서 제약조건(PK,FK,UNIQUE),index 설정 시 주의 사항

  4. MySQL의 Blob타입을 CUBRID로 변환하기

  5. CUBRID에서 데이터가 있는 칼럼의 도메인 변경 시 조치방법

  6. cubrid.conf파일 적용의 우선 순위와 HOST적용 우선 순위

  7. CUBRID에서 응용프로그램 쿼리 binding 구문이 있을 경우 plan의 차이

  8. CUBRID의 Statement pooling기능

  9. CUBRID Manager에서 character set 변경하기[R2.0]

  10. Window서버 cmd창에서 CUBRID 구동 후 cmd창을 닫을 시 DB서비스 중단 조치방법

  11. CUBRID DB 내의 auto_increment 값을 초기화 하자.

  12. CUBRID의OLE DB 드라이버 설치 방법.

  13. Java SP사용시 JNI_CreateJavaVM 에러메시지 해결 방법

  14. 그루비로 큐브리드 함수(or 프로시저) 만들기 by 행복개발자(cyberuls)

  15. JDBC 커넥션 스트링에 UTF-8 명시하는법

  16. weblogic 8.1 에 CUBRID Connection Pool, DataSource 설정 방법

  17. CUBRID JDBC Driver 빌드 방법

  18. JDBC 사용시 SQL 로깅 - p6spy 사용

  19. 임의의 컬럼을 rownum 으로 업데이트 하기

  20. 중복데이터 제거 방법

Board Pagination Prev 1 ... 5 6 7 8 9 10 11 12 13 14 Next
/ 14

Contact Cubrid

대표전화 070-4077-2110 / 기술문의 070-4077-2113 / 영업문의 070-4077-2112 / Email. contact_at_cubrid.com
Contact Sales