Tôi có một câu hỏi về cách tiếp cận tốt nhất. Tôi không chắc cách tiếp cận nào là tốt nhất khi dữ liệu được coi là có thể thay đổi kích thước.
Hãy xem xét 3 BẢNG sau:
NHÂN VIÊN
EMPLOYEE_ID, EMP_NAME
DỰ ÁN
PRO DỰ_ID, PROJ_NAME
EMP_PROJ (nhiều đến nhiều trong hai bảng trên)
EMPLOYEE_ID, PRO DỰ_ID
Vấn đề : Đưa ra một EmployeeID, tìm TẤT CẢ các nhân viên của TẤT CẢ các dự án mà Nhân viên này được liên kết.
Tôi đã thử điều này theo hai cách .. cả hai cách tiếp cận chỉ khác nhau vài mili giây cho dù kích thước của dữ liệu được sử dụng là bao nhiêu.
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)
đi
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
Cho đến bây giờ, tôi mong đợi khoảng 5000 nhân viên và dự án mỗi người .. nhưng không biết về mối quan hệ nhiều-nhiều loại tồn tại. Phương pháp nào bạn muốn giới thiệu? cảm ơn!
EDIT: Kế hoạch thực hiện phương pháp 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)"
Kế hoạch thực hiện phương pháp 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)"
Vì vậy, có vẻ như kế hoạch Thực hiện của Cách tiếp cận 2 tốt hơn một chút, vì 'chi phí' là 60 so với 85 của phương pháp 1. Đó có phải là cách đúng để phân tích điều này?
Làm thế nào để người ta biết nó sẽ đúng ngay cả đối với tất cả các loại kết hợp nhiều?
explain analyze
có thể tiết lộ nhiều sự khác biệt giữa các kế hoạch