"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > SQL 조인 내부

SQL 조인 내부

2024-11-07에 게시됨
검색:255

Inside SQL Joins

SQL 조인은 데이터베이스 쿼리의 기본이므로 사용자는 지정된 조건에 따라 여러 테이블의 데이터를 결합할 수 있습니다. 조인은 논리적 조인과 물리적 조인이라는 두 가지 주요 유형으로 분류됩니다. 논리적 조인은 테이블의 데이터가 결합되는 개념적 방식을 나타내는 반면, 물리적 조인은 RDS(관계형 데이터베이스 서비스) 또는 기타 SQL 서버와 같은 데이터베이스 시스템 내에서 이러한 조인의 실제 구현을 나타냅니다. 오늘 블로그 게시물에서는 SQL 조인의 미스터리를 풀어보겠습니다.

뛰어들자!

논리적 조인

SQL에는 다양한 유형의 논리적 조인이 있습니다. 가장 일반적인 두 가지는 내부 조인과 외부 조인입니다. 테이블에서 데이터를 검색해야 할 때 이러한 조인을 사용합니다.

물리적 결합

물리적 조인은 RDS 내부에서 구현됩니다. 사용자는 논리적 조인을 사용하여 쿼리를 작성하고 RDS는 물리적 조인을 사용하여 조인 작업을 수행합니다.
와 같은 다양한 유형의 물리적 조인이 있습니다. 1. 중첩 루프 조인
2. 해시 조인
3. 병합 조인 등

중첩된 루프 조인

이것은 더 적은 수의 레코드가 있는 더 작은 테이블을 선택하고 일치하는 항목을 찾을 때까지 다른 테이블을 반복하는 조인 유형입니다. 이러한 유형의 조인은 MySQL, Postgres 및 SQL 서버에서도 사용할 수 있습니다. 그러나 대규모 테이블의 경우 확장 가능한 옵션이 아닙니다. 조인 연산자가 동등성을 사용하지 않는 경우에 주로 사용됩니다.

예를 들어, 지리 공간 쿼리: 지리 데이터를 처리할 때 다른 지점과 특정 거리 내에 있는 지점을 찾고 싶을 수 있습니다. 여기에는 중첩 루프 조인(Nested Loop Join)을 통해 달성할 수 있는 모든 점 조합 간의 거리를 비교하는 작업이 포함될 수 있습니다.

SELECT *
FROM cities
JOIN landmarks ON distance(cities.location, landmarks.location) 



해시 조인

해시 조인은 해시 테이블을 이용하여 조인을 실행하여 일치 기록을 찾는 방법입니다. 해시 테이블이 메모리에 생성됩니다. 데이터의 양이 많고 이를 저장할 메모리가 충분하지 않으면 디스크에 기록됩니다. 해시 조인은 중첩 루프 조인보다 효율적입니다. 실행 중에 RDS는 조인 속성을 키로 사용하여 조인 테이블의 행이 저장되는 메모리 내 해시 테이블을 구축합니다. 실행 후 서버는 다른 테이블의 행을 읽기 시작하고 해시 테이블에서 해당 행을 찾습니다. 이 방법은 조인 연산자가 같음을 사용할 때 일반적으로 사용됩니다.

ID, 이름, 부서 ID와 같은 직원 세부 정보가 포함된 "Employee" 테이블과 ID, 이름과 같은 부서 세부 정보가 포함된 "Department" 테이블이 있다고 가정합니다. 각 직원이 속한 부서를 얻기 위해 이 테이블을 조인하려고 합니다.

SELECT *
FROM Employee
JOIN Department ON Employee.department_id = Department.department_id;

이 예에서 조인 조건은 열 간의 동등성을 기반으로 하므로 해시 조인에 적합합니다. 이 방법은 해시 테이블을 사용하여 레코드를 빠르게 일치시킬 수 있으므로 특히 대규모 데이터 세트를 처리할 때 효율적입니다. 그러나 모든 조인 방법과 마찬가지로 최적의 성능을 보장하려면 데이터 세트의 크기와 사용 가능한 메모리를 고려하는 것이 중요합니다.

병합 조인

병합 조인(Merge Join)은 조인 조건이 등호 연산자를 사용하고 조인의 양쪽이 큰 경우 SQL 쿼리 실행에 사용되는 방법입니다. 이 기술은 정렬된 데이터 입력에 의존합니다. 조인 컬럼에 사용된 표현식에 인덱스가 있으면 이를 활용하여 효율적으로 정렬된 데이터를 얻을 수 있다. 그러나 서버가 데이터를 명시적으로 정렬해야 하는 경우 인덱스를 분석하고 성능 향상을 위해 최적화하는 것이 중요합니다.

예:
판매 ID, 고객 ID, 판매 금액 등 판매 거래가 포함된 "판매" 테이블과 고객 ID, 이름, 위치 등 고객 세부 정보가 포함된 "고객" 테이블이 포함된 시나리오를 생각해 보세요.

SELECT *
FROM Sales
JOIN Customers ON Sales.customer_id = Customers.customer_id;

이 경우 "Sales" 및 "Customers" 테이블이 모두 중요하며 조인 조건은 "customer_id" 열의 동등성에 의존합니다. 효율적인 병합 조인을 위해서는 두 입력 테이블 모두 조인 열("customer_id")을 기준으로 정렬되어야 합니다. "customer_id" 열에 기존 인덱스가 없는 경우 서버는 성능에 영향을 미칠 수 있는 추가 정렬 작업을 수행해야 할 수 있습니다.

병합 조인을 최적화하려면 두 테이블의 "customer_id" 열에 인덱스를 생성하거나 수정하는 것이 좋습니다. 이러한 인덱스를 적절하게 유지 관리하고 최적화하면 특히 "customer_id" 열을 기반으로 한 조인이 자주 포함되는 쿼리의 경우 쿼리 성능이 크게 향상될 수 있습니다.

인덱스를 효과적으로 활용하고 정렬된 데이터 입력을 보장함으로써 병합 조인은 동등 기반 조인 조건을 사용하여 대규모 테이블 간의 조인을 효율적으로 처리할 수 있어 쿼리 성능과 전반적인 시스템 효율성이 향상됩니다.

측면 중첩 루프 조인 해시 조인 병합 조인
조인 조건 비동등 평등 평등
입력 데이터 크기 소형~중형 중형~대형 크기가 큰
데이터 정렬 필요하지 않음 필요하지 않음 필수의
메모리 사용량 낮은 보통에서 높음 보통에서 높음
인덱스 활용도 주요 관심사 아님 유익한 색인에 의존
성능(대규모 데이터세트) 느리게 효율적인 효율적인
확장성 확장성이 낮음 확장 가능 확장 가능
일반적인 사용 사례 중소형 테이블 동일 조인이 포함된 대형 테이블 동일 조인이 포함된 대형 테이블
릴리스 선언문 이 글은 https://dev.to/balajisasi/inside-sql-joins-5h6b?1 에서 복제하였습니다. 침해 내용이 있는 경우, [email protected]으로 연락하여 삭제하시기 바랍니다.
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3