-
Rows Removed by Join Filter ??란 무엇인가?데이터베이스/postgresql 2024. 10. 21. 16:30728x90반응형
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반응형'데이터베이스 > postgresql' 카테고리의 다른 글
mysql 에서 for update를 통해 lock을 걸경우와 postgres에서 걸경우 같을까? (0) 2024.10.18 postgresql 에서 FSM 은 무엇인가? (0) 2024.10.14 postgresql 실행계획 - recheck cond - 수정중 (0) 2024.05.16 short query , long query 란 무엇인가? sql최적화 팁 - 수정중 (0) 2024.05.13 POSTGRES 테이블 인덱스 - 정리 (0) 2024.05.10