최선의 접근 방식에 대한 질문이 있습니다. 데이터 크기가 가변적이라고 생각 될 때 어떤 접근법이 최선인지 잘 모르겠습니다.
다음 3 개의 표를 고려하십시오.
종업원
EMPLOYEE_ID, EMP_NAME
계획
PROJECT_ID, PROJ_NAME
EMP_PROJ (위의 두 테이블 중 다수에서 다수)
EMPLOYEE_ID, PROJECT_ID
문제점 : 직원 ID가 주어지면이 직원과 연관된 모든 프로젝트의 모든 직원을 찾으십시오.
나는 두 가지 방법으로 이것을 시도했다. 어떤 방법을 사용하든 두 가지 접근 방식은 몇 밀리 초 만 다르다.
SELECT EMP_NAME FROM EMPLOYEE
WHERE EMPLOYEE_ID IN (
SELECT EMPLOYEE_ID FROM EMP_PROJ
WHERE PROJECT_ID IN (
SELECT PROJECT_ID FROM EMP_PROJ p, EMPLOYEE e
WHERE p.EMPLOYEE_ID = E.EMPLOYEE_ID
AND E.EMPLOYEE_ID = 123)
가다
select c.EMP_NAME FROM
(SELECT PROJECT_ID FROM EMP_PROJ
WHERE EMPLOYEE_ID = 123) a
JOIN
EMP_PROJ b
ON a.PROJECT_ID = b.PROJECT_ID
JOIN
EMPLOYEE c
ON b.EMPLOYEE_ID = c.EMPLOYEE_ID
현재, 나는 약 5000 명의 직원과 프로젝트를 기대하지만, 많은 관계가 존재하는지 전혀 모른다. 어떤 접근법을 추천 하시겠습니까? 감사!
편집 : 접근법 1의 실행 계획
"Hash Join (cost=86.55..106.11 rows=200 width=98)"
" Hash Cond: (employee.employee_id = emp_proj.employee_id)"
" -> Seq Scan on employee (cost=0.00..16.10 rows=610 width=102)"
" -> Hash (cost=85.07..85.07 rows=118 width=4)"
" -> HashAggregate (cost=83.89..85.07 rows=118 width=4)"
" -> Hash Semi Join (cost=45.27..83.60 rows=118 width=4)"
" Hash Cond: (emp_proj.project_id = p.project_id)"
" -> Seq Scan on emp_proj (cost=0.00..31.40 rows=2140 width=8)"
" -> Hash (cost=45.13..45.13 rows=11 width=4)"
" -> Nested Loop (cost=0.00..45.13 rows=11 width=4)"
" -> Index Scan using employee_pkey on employee e (cost=0.00..8.27 rows=1 width=4)"
" Index Cond: (employee_id = 123)"
" -> Seq Scan on emp_proj p (cost=0.00..36.75 rows=11 width=8)"
" Filter: (p.employee_id = 123)"
접근법 2의 실행 계획 :
"Nested Loop (cost=60.61..112.29 rows=118 width=98)"
" -> Index Scan using employee_pkey on employee e (cost=0.00..8.27 rows=1 width=4)"
" Index Cond: (employee_id = 123)"
" -> Hash Join (cost=60.61..102.84 rows=118 width=102)"
" Hash Cond: (b.employee_id = c.employee_id)"
" -> Hash Join (cost=36.89..77.49 rows=118 width=8)"
" Hash Cond: (b.project_id = p.project_id)"
" -> Seq Scan on emp_proj b (cost=0.00..31.40 rows=2140 width=8)"
" -> Hash (cost=36.75..36.75 rows=11 width=8)"
" -> Seq Scan on emp_proj p (cost=0.00..36.75 rows=11 width=8)"
" Filter: (employee_id = 123)"
" -> Hash (cost=16.10..16.10 rows=610 width=102)"
" -> Seq Scan on employee c (cost=0.00..16.10 rows=610 width=102)"
따라서 접근법 2의 실행 계획은 접근 방식 1의 85가 아니라 '비용'이 60이기 때문에 약간 더 나은 것처럼 보입니다. 이것이 이것을 분석하는 올바른 방법입니까?
모든 종류의 많은 조합에서도 그렇다는 것을 어떻게 알 수 있습니까?
explain analyze
더 계획의 차이 밝힐 수