ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Rows Removed by Join Filter ??란 무엇인가?
    데이터베이스/postgresql 2024. 10. 21. 16:30
    728x90
    반응형

    PostgreSQL의 EXPLAIN ANALYZE 결과에서 조인 과정 중 필터링된 레코드 수를 나타내는 항목입니다. 이는 조인 필터가 어떤 역할을 하는지를 보여주는 부분으로, 조인을 수행할 때 특정 조건을 만족하지 않아 제외된 레코드들의 수를 의미합니다.

    1. Join Filter란?

    Join Filter는 조인할 때 조인 조건 외에 추가적으로 필터링을 적용하는 조건을 의미합니다. 조인 시 두 테이블에서 조인 조건을 만족하는지 여부를 평가한 뒤, 그 조건 외의 추가 조건에 따라 데이터를 더 걸러낼 수 있습니다.

    • 조인 조건: 테이블 간의 관계를 설정하는 기본 조건입니다. 예를 들어 ON a.id = b.a_id는 두 테이블을 연결하는 조인 조건입니다.
    • 조인 필터: 조인 후에 추가로 레코드를 걸러내는 조건입니다. 예를 들어, ON a.id = b.a_id AND a.some_column > 100 같은 조건이 있을 때 a.some_column > 100은 조인 필터에 해당할 수 있습니다.

    조인 필터로 인해 제외된 레코드들이 많을수록 Rows Removed by Join Filter의 숫자가 커지게 됩니다. 이는 해당 레코드가 조인 시 추가적인 조건에 의해 제거되었음을 의미합니다.

    2. 예제

    아래에 Join Filter를 발생시키는 예제를 만들어 보겠습니다. 두 개의 테이블 employees와 departments를 사용해 보죠.

    테이블 생성 및 데이터 삽입

     

    -- 직원 테이블 생성 및 데이터 삽입
    CREATE TABLE employees (
        id SERIAL PRIMARY KEY,
        name TEXT,
        department_id INT,
        salary INT
    );
    
    INSERT INTO employees (name, department_id, salary)
    SELECT 'Employee ' || i, (i % 10) + 1, (i % 5) * 1000 + 2000
    FROM generate_series(1, 1000) AS s(i);
    
    -- 부서 테이블 생성 및 데이터 삽입
    CREATE TABLE departments (
        id SERIAL PRIMARY KEY,
        department_name TEXT
    );
    
    INSERT INTO departments (department_name)
    SELECT 'Department ' || i
    FROM generate_series(1, 10) AS s(i);

     

    • employees 테이블은 1,000개의 직원 레코드를 가지고 있으며, 각 직원은 10개의 부서 중 하나에 속합니다.
    • departments 테이블은 10개의 부서를 가지고 있습니다.

    조인 쿼리와 조인 필터

    이제 employees와 departments를 조인할 때 Join Filter가 작동하는 쿼리를 실행해 보겠습니다.

     

    EXPLAIN ANALYZE
    SELECT *
    FROM employees e
    JOIN departments d ON e.department_id = d.id
    WHERE e.salary > 3000;

     

    쿼리 설명

    • 조인 조건: ON e.department_id = d.id는 employees 테이블과 departments 테이블을 조인하는 기본 조건입니다.
    • 조인 필터: WHERE e.salary > 3000 조건이 조인된 결과에서 추가로 데이터를 걸러내는 역할을 합니다.

    EXPLAIN ANALYZE 결과에서의 의미

    • Rows Removed by Join Filter: 이 항목은 e.salary > 3000 조건에 의해 제외된 레코드 수를 나타냅니다.
    • e.department_id = d.id 조건에 의해 일단 매칭된 레코드들이 모두 조인된 후, e.salary > 3000 조건에 맞지 않는 레코드들은 제외됩니다.
    • 예를 들어, employees에 속한 직원들의 월급이 3,000 이하인 경우 이 필터에 의해 조인된 레코드에서 제외되며, 그 수가 Rows Removed by Join Filter로 표시됩니다.

    결과 분석

    만약 Rows Removed by Join Filter: 5184000와 같은 수치가 나온다면, 그만큼의 레코드가 조인 후 추가 필터링에 의해 제거되었다는 뜻입니다. 이는 조인 조건으로는 일치했지만, 추가 조건에서는 맞지 않아 결과에서 제외된 레코드 수입니다.

    Join Filter를 통해 조인의 효율성과 쿼리의 필터링 과정에서 얼마나 많은 데이터가 걸러지는지를 파악할 수 있습니다. 이를 통해 쿼리의 성능을 분석하고, 필요한 경우 인덱스를 추가하거나 조건을 최적화할 수 있습니다.

    728x90
    반응형
Designed by Tistory.