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으로 유도한 것으로 판단됩니다.

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

List of Articles
번호 제목 글쓴이 날짜 조회 수
공지 SQLGate for CUBRID를 사용해 보시기 바랍니다!!! file admin 2019.07.31 235
2932 아무리 생각해도 이건 버그 같습니다. 3 안지민 2009.03.06 11384
2931 왜 컬럼이름이 안붙나요...... 1 file 안지민 2009.03.06 12040
2930 테이블 파티셔닝은 1 홍서기 2009.03.07 14983
2929 DB 로그인시 에러 1 file 이석희 2009.03.12 11638
2928 저장 프로시져 질문 3 file 이석희 2009.03.12 16338
2927 초보 질문드립니다^^:(인스턴스 갱신) 1 박동진 2009.03.12 10883
2926 mysql에서 limit와 같은 기능이 있나요? 1 홍서기 2009.03.14 16250
2925 [질문] APC_Install-tools 1.4 사용시 ~ 2 file 야매코더 2009.03.17 10899
2924 에러 코드 관련 다시 질문 드립니다 1 kkckc 2009.03.18 11453
2923 데이타베이스 복구에 관한 질문. 1 김우람 2009.03.18 10893
2922 질의가 무한 루프로 발생시 대처법 질문 1 이석희 2009.03.18 12615
2921 백업파일을 이용하여 데이터베이스가 없는 다른 서버에서 복구하는 방법 질문. 1 김우람 2009.03.19 12742
2920 유니크한 값 얻어오기 있나요? 2 이승훈 2009.03.19 13087
2919 큐브리드 deb 패키징중... 8 강분도 2009.03.19 20493
2918 TIME 포맷 관련 질문 입니다. 1 이승훈 2009.03.19 12034
2917 broker서버가 시작되지 않습니다.. 2 platanus 2009.03.21 23379
2916 CCI 예제 프로그램이 실행이 안되요;; 5 file 나동호 2009.03.21 14964
2915 [쌩초보]내컴퓨터 서버만들기는 성공 했습니다.그후 1 왕초보 2009.03.21 18473
2914 CCI 프로그램을 하려면 어떻게 해야하나요? 2 나동호 2009.03.22 10650
2913 Cubrid 2008 R 1.3 설치중 에러메시지 3 동진 2009.03.23 10909
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 11 ... 153 Next
/ 153

Contact Cubrid

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