Inflearn brand logo image

인프런 커뮤니티 질문&답변

Anfield님의 프로필 이미지
Anfield

작성한 질문수

업무에 바로 쓰는 SQL 튜닝

4-3. 조인 알고리즘(Hash)

BNL Join 사용

작성

·

80

0

SELECT EMP.emp_id, EMP.first_name, EMP.last_name, GRADE.grade_name

FROM GRADE, EMP; -- 카테시안 곱

 

mariadb로 실습을 진행했는데

 

hash join이 쓰이는게 아니라

flat, BNL join을 사용한다고 되어 있네요?

BNL Join은 MySQL이 인덱스가 없거나 사용할 수 없는 상황에서 기본적으로 사용하는 비효율적인 조인 알고리즘이라는데 원인이 무엇일까요?

grade 테이블을 hash join table로 사용하지 않네요?

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.
Anfield님,

BNL(블록 내스트-루프) 조인은 인덱스를 사용할 수 없거나 인덱스가 없는 경우 MySQL에서 기본적으로 사용하는 조인 알고리즘입니다. 이 알고리즘은 두 테이블을 모두 읽어서 각 행을 비교하여 매칭하는 방식으로 동작합니다. 이는 테이블 크기가 클수록 비효율적일 수 있습니다.

MariaDB나 MySQL에서 Hash Join이 아닌 BNL Join이 사용될 수 있는 이유는 다음과 같습니다:

  1. 인덱스 부재: 인덱스가 존재하지 않거나, 쿼리에서 인덱스를 사용하지 못할 때 BNL Join이 선택될 수 있습니다. 인덱스가 없으면 테이블 내의 모든 행을 직접 비교하여 매칭해야 하므로 BNL Join이 더 적합한 옵션이 됩니다.

  2. 큐브 관리 및 설정: 데이터베이스 설정이나 버전 차이에 따라 특정 조인 방식이 강제로 선택될 수도 있습니다. 예를 들어, 특정 MariaDB 설정에서는 Hash Join을 지원하지 않거나 기본적으로 비활성화되어 있을 수 있습니다.

  3. 테이블 크기: 조인 순서나 테이블의 상대적 크기에 따라 상대적으로 작은 테이블을 드라이빙 테이블로 선택하는 것이 더 효율적일 수 있습니다. 하지만 BNL Join은 모든 경우에 비효율적일 수 있으므로, 가능한 경우 인덱스를 생성하거나 쿼리 최적화를 통해 다른 조인 전략을 활용해야 합니다.

SQL 튜닝을 통해 쿼리 성능을 향상시키기 위해서는 인덱스를 적절히 배치하고, 쿼리 플랜을 분석하여 효율적인 조인 방식을 선택하는 것이 중요합니다.

더 많은 정보를 원하시면 MariaDB 조인 최적화 문서를 참고하시면 좋을 것 같습니다.

Anfield님의 프로필 이미지
Anfield

작성한 질문수

질문하기