Background Image

FORUM

?

단축키

Prev이전 문서

Next다음 문서

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

* 질문 등록 시 다음의 내용을 꼭 기입하여 주세요.
OS
centOS6.9_x86
CUBRID Ver.
8.4.1.32003
CUBRID TOOL Ver.
CUBRID Manager 10.1.0.0004  (32bit)
응용 환경(API)
java

* CUBRID 응용 오류, SQL 오류 또는 SQL 튜닝 관련된 문의는 반드시 다음의 내용을 추가해 주세요. 비밀글이나 비밀 댓글도 가능합니다.
* 저희가 상황을 이해하고, 재현이 가능해야 알 수 있는 문제들이 많습니다. 가능한 정보/정황들을 부탁합니다.
에러 내용 및 재현 방법 재현 가능한 Source와 SQL
관련 테이블(인덱스, 키정보 포함) 정보 CUBRID 홈 디렉토리 아래 log 디렉토리 압축


-------------- 아래에 질문 사항을 기입해 주세요. ------------------------------------------------------------------------
궁금한 게 있습니다. 만약


SELECT *

FROM A

INNER JOIN B ON A.key = B.key

LEFT JOIN C ON A.key = C.key

AND C.id = "test"


로 질의 실행계획을 봤을 때 (각 테이블의 key 와 C.id 는 인덱스 등록되어있음) A, B 와 index join 하고  그 결과를 C 와 index join 합니다.


하지만 


SELECT *

FROM A

INNER JOIN B ON A.key = B.key

LEFT JOIN C ON B.key = C.key

AND C.id = "test"


로 질의 실행계획을 봤을 때 A, B 와 index join 하고  그 결과를 C 와 sort-merge join 합니다.


코스트는 후자가 더 적습니다.


두 쿼리의 어떤 점 때문에 이런 차이가 발생하나요? 만약 AND조건을 빼면 둘 다 index join을 하고 코스트는 서로 같습니다.



  • ?
    김창휘 2018.12.24 14:44
    안녕하세요.

    상세한 실행계획 및 인덱스 내용을 확인할 수 없어 올려주신 내용을 기반으로 가정하여(소설..) 제 의견을 드리면 아래와 같습니다.

    일단 AND C.id = "test" 조건이 코스트가 적게 나오는 것은 해당 Query상에 유일한 변수 조건이면서 인덱스가 존재하고(단일인지 복합 인덱스인지는 현재 정보로는 알 수는 없지만..) 범위를 줄여주는 조건으로 판단하지만 해당 조건이 없는 경우에는 A와 B에 대해서 조인 키로 = 조건에 해당하는 모든 데이터를 IDX-JOIN으로 수행하기에 C.id가 있는 경우가 시작시점과 함께 범위를 줄여주는 조건으로 Cost가 적게 나오는 것으로 판단하는 것 같습니다. 제 판단이 맞을지는 모르겠지만 각 테이블의 KEY보다는 ID 컬럼이 Unique성을 나타날 것 같습니다.

    그리고, C가 LEFT OUTER JOIN이 아니면 C를 Driving Table로 하는 조인순서를 변경하고 IDX-JOIN으로 하면 좋겠지만 순서를 바꿀 수 없기 때문에 A와 B를 IDX JOIN하고 C를 C.id 변수 조건으로 필터링 한 후(조인 데이터 량을 줄임.) Sort Merge Join을 수행하는 것 같습니다.

    인덱스 구성 및 데이터 카디널리티등 다양한 환경에 따라 달라지는 부분으로 질문해주신 내용과 부합하지 않을 수 있으며 해당 내용을 참고하여 종합적으로 판단하는 것이 좋을 것 같습니다.

    감사합니다.
  • ?
    신비로운입 2018.12.24 15:03
    안녕하세요! 빠른 답변 감사합니다.

    말씀하시는 게 맞습니다. C.id 조건으로 검색 범위를 줄여서 sort-merge join 을 하는게 index join 을 하는 것보다 코스트가 적기에 index join 을 한다고 생각합니다.
    다만 제가 궁금한건, C 테이블과 조인하는 조건을
    (1) LEFT JOIN C ON A.key = C.key 로 할 때와 (2) LEFT JOIN C ON B.key = C.key 로 할 때 내부적으로 어떠한 차이가 있기에 (1) 은 옵티마이저가 sort-merge join 을 고려하지 않는 것인지입니다.

    문서를 살펴보았지만 이에 대한 설명은 따로 없는 것 같아서 여쭤봅니다!
  • ?
    김창휘 2018.12.24 15:25
    안녕하세요.

    제가 올려 주신 SQL 구문의 JOIN 순서를 정확하게 확인하지 못했네요..

    첫 번째는 A INNER JOIN B --> A LEFT OUTER JOIN C 순서로 통상적인 JOIN 유형으로 인덱스 존재시 IDX-JOIN을 사용할 수 있는 형태이고

    두 번째는 A INER JOIN B --> B LEFT OUTER JOIN C 순서로 일반적인 작성 규칙과 다르게 JOIN 구문을 작성했습니다.

    내부적으로 첫 번째와 같은 결과를 얻기 위해(FROM절 앞에 있는 테이블을 기준 테이블임) A,B를 INNER JOIN 후 결과를 C와 SORT-MERGE JOIN 방식을 선택하여 수행한 것 같습니다.
  • ?
    신비로운입 2018.12.24 16:15
    빠른 답변 정말 감사합니다!

    IDX-JOIN 으로 하는 게 통상적이지만 두 번째의 경우 일반적인 규칙에서 벗어나 어쩔 수 없이 SORT-MERGE JOIN 한다는 말씀이신가요?

    하지만 두 번째의 경우 필터조건인 AND C.id = "test" 을 빼면 IDX-JOIN 을 실행합니다. (첫 번째와 동일함) 그리고 IDX-JOIN 보다 SORT-MERGE JOIN 이 더 코스트가 적습니다.

    그래서 저는 어떠한 이유에서든 옵티마이저가 두 번째 케이스는 SORT-MERGE JOIN, IDX-JOIN 둘 다 고려하지만 첫 번째 케이스는 IDX-JOIN 만을 고려한다고 판단했습니다.

    혹시 제가 잘못판단한건가요...?
  • ?
    김창휘 2018.12.24 16:31
    답변 드립니다.

    첫 번째 답변에도 언급해 드렸듯이 다양한 정보와 실제 데이터를 직접 확인하지 못하는 상황에 질문주신 부분에 대해서 답변을 드리고 있어 정확히 문의하시는 내용에 부합되지 않을 수 있습니다. Sort-Merge Join Cost에 대해서는 첫 번째에 대한 답변으로 대체하면 될 것 같고 C.id 조건을 빼면 동일하게 IDX-JOIN으로 수행되는 것은 사용자의 잘못된 작성 의도를 옵티마이저가 수정하는 것으로 판단되며, C.id 컬럼의 경우 인덱스가 존재하고 범위를 줄여줄 수 있는 Unique한 데이터 특성을 가진 변수 조건인데 Left-Outer Join이라 Driving 순서를 바꿀 수 없는 상황에서 Sort-Merge Join으로 유도한 것으로 판단됩니다.

    다시 언급해드리지만 보다 상세한 정보와 실제 데이터를 확인하면서 답변을 드리는 것이 아니라 질문을 주신 내용에 대해서 이럴 것이다라는 가정을 더해 답변을 드리는 내용이라는 점 이해 부탁드립니다. 제가 답변을 드리는 부분이 정답이라고 할 수 없으며 답변을 올려 주신 님의 결과가 정답일 수도 있는 부분으로 관련 내용을 종합적으로 파악하여 판단하시는 것이 맞을 듯 합니다.

  1. CUBRID 사용자를 위한 DBeaver 도구 출시 안내

    Date2024.04.23 Byadmin Views51
    read more
  2. SQLGate for CUBRID 영구 무료 라이선스 제공

    Date2020.04.09 Byadmin Views4458
    read more
  3. cubrid loaddb 문의

    Date2017.02.17 By나무천사 Views10042
    Read More
  4. connot cennect to a broker...

    Date2013.08.29 By나아가나가 Views10045
    Read More
  5. no 컬럼명을 사용해선 안되나요?

    Date2010.11.03 By코딩셔틀 Views10045
    Read More
  6. DBCP 관련 문제 때문에 질문 드립니다.

    Date2011.04.04 By피아오 Views10049
    Read More
  7. 큐브리드매니저에서 한글은 어떻게?

    Date2010.07.12 By초짜큐브 Views10050
    Read More
  8. 데이터베이스 최적화 기능 관련

    Date2009.05.30 By회오리 Views10055
    Read More
  9. CUBRID 4.0 64bit & SULinux 2.0 64Bit service start 시 manager fail 발생합니다..

    Date2011.07.02 By반짝이 Views10058
    Read More
  10. CUBRID ODBC DB Connection DataSet 오류

    Date2013.01.24 Byabeans Views10059
    Read More
  11. CUBRIDResultSetMetaData 에 관한 질문..

    Date2009.10.06 By눈꽃 Views10061
    Read More
  12. 버전업 될때마다 지우고..

    Date2009.05.27 By엔가 Views10063
    Read More
  13. 백업 된 파일 버전 확인하기

    Date2013.03.05 Bysw엔지니어 Views10068
    Read More
  14. 오라클 -> cubrid 마이그레이션 시....

    Date2013.09.10 Byagkim Views10071
    Read More
  15. 큐브리드를 지원하는 모델링 툴이 있나요??

    Date2009.12.10 By십칠미리 Views10071
    Read More
  16. 엄청난 DB 생성 소요 시간

    Date2010.01.16 By쭈난 Views10071
    Read More
  17. CUBRID unloaddb 와 스케줄러(Crontab)

    Date2012.11.30 Bycubrid 초보 Views10086
    Read More
  18. cubridprovider.dll 배포 질문 드립니다

    Date2011.03.10 By유니콘 Views10090
    Read More
  19. 프로시저 사용시

    Date2009.08.03 By경아 Views10095
    Read More
  20. BLOB에 대한 자바 타입변환 문제..

    Date2013.01.28 Byㅇㅇ Views10099
    Read More
  21. DATABASE 간 상호 table 참조가능한가요

    Date2013.08.28 By관리자 Views10100
    Read More
  22. java function을 이용한 Query 수행속도 문의

    Date2013.03.26 By김상윤 Views10105
    Read More
Board Pagination Prev 1 ... 137 138 139 140 141 142 143 144 145 146 ... 200 Next
/ 200

Contact Cubrid

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