explain analyze 명령으로 쿼리의 실행계획과 단계별 소요된 시간을 확인할 수 있다는 내용을 공부하는 중임.
책에서 설명한 예시가 아래의 쿼리임.
EXPLAIN ANALYZE SELECT e.emp_no, avg(s.salary) FROM employees e INNER JOIN salaries s ON s.emp_no=e.emp_no AND s.salary>50000 AND s.from_date<='1990-01-01' AND s.to_date>'1990-01-01' WHERE e.first_name='Matt' GROUP BY e.hire_date;그리고 위 쿼리의 결과가 다음과 같음.A) -> Table scan on <temporary> (actual time=0.001..0.004 rows=48 loops=1) B) -> Aggregate using temporary table (actual time=3.799. .3.808 rows=48 loops=1) C) -> Nested loop inner join (cost=685.24 rows=135) (actual time=0.367..3.602 rows=48 loops=1) D) -> Index lookup on e using ix_firstname (first_name='Matt') (cost=215.08 rows=233) (actual time 0.348..1.046 rows=233 loops=1) E) -> Filter: ((s.salary > 50000) and (s.from_date <= DATE' 1990-01-01') and (s.to_date > DATE' 1990-01-01')) (cost=0.98 rows=1) (actual time 0.009..0.011 rows=0 loops=233) F) -> Index lookup on s using PRIMARY (emp_no=e.emp_no) (cost=0.98 rows=10) (actual time=0.007..0.009 rows=10 loops=233)
책에서 위와 같은 Tree 형식의 실행계획의 순서를 파악할 때의 규칙은 다음과 같대. 1. 들여쓰기가 같은 레벨에서는 상단에 위치한 라인이 먼저 실행.
2. 들여쓰기가 다른 레벨에서는 가장 안쪽에 위치한 라인이 먼저 실행.
내 생각에 위 규칙대로라면 실행 순서는 F -> E -> D -> C -> B -> A 여야 한다고 생각하는데,
책에서는 실행 순서가 D -> F -> E -> C -> B -> A 라고 함.
규칙에서는 들여쓰기가 다른 레벨에서는 가장 안쪽에 위치한 라인이 먼저 실행된다고 하는데, 왜 가장 안쪽의 F 보다 D가 먼저 실행된다는 건지 이해가 안 감.
이유를 아는 사람 설명 부탁해.
dfs postorder traversal이네
그리고 또 추가적으로 궁금한 것이 맨 위에 제시한 sql 쿼리가 문법적으로 올바른 쿼리임? 내가 sql초보라서. group by를 사용한 select에는 집계함수 혹은 group by에 명시한 칼럼만 적을 수 있는거 아님?
니말이 맞음 ㅇㅇ e.emp_no에 group by하는게 맞아보인다 - dc App
쓸수있음. 쿼리설정으로 못쓰게할수도있고. 쓸수있게하면 튀어나오는값은 일반적으로 정렬상 첫번째이긴한데, 문서상으로는 임의의 arbitrary 값이 나온다고이야기함
오 그렇군 ㄱㅅㄱㅅ
실제 순서도 맞고 플랜보는법에 대한 설명도 맞는데 저 보기의 A B C D E F 순서가 잘못된거같은데 - dc App
아니다 텍스트로 잘안봐서 모르겠다 시각화해서 볼수있는 ide쓰셈 편함 - dc App
일단 책에서 얘기하는 DFECBA순은 맞음 실행계획 텍스트 보니까 - dc App
가장 안쪽에 있는 것 먼저라는 설명인데 F보다 D 먼저 하는 이유가 뭔가요?? - dc App