안녕하세요 :)
동일한 결과를 출력하는 2개의 MySQL 쿼리문의 실행계획을 분석하여 어떤 쿼리문의 성능이 좋은지 결론을 도출하고자 하는데, 제가 분석한 내용이 올바른지 도움을 요청하기 위해 게시글을 올리게 되었습니다.
아래 2개의 SQL 쿼리문(ex1, ex2)과 첨부드린 2개의 이미지 파일(test.PNG, ex1_ex2_실행계획.PNG)를 참고해주시면 감사드리겠습니다.
-- ex1 SELECT col_1 FROM Table_A WHERE col_2 = ’A’ UNION ALL SELECT col_3 FROM Table_B WHERE col_4 = ‘B’;
-- ex2 SELECT CASE WHEN col_2=’A’ THEN col_1 WHEN col_2=’B’ THEN col_1 END AS col_1 FROM(SELECT col_1, col_2 FROM Table_A UNION SELECT col_3, col_4 FROM Table_B) TMP;
제가 원하는 출력 형태는 test.PNG 이미지를 보시면, Table_A 및 Table_B 테이블로부터 우측에 원하는 결과 테이블과 같이 출력하는 것입니다. 이를 2가지 SQL문(ex1, ex2)으로 구현할 때, 각 SQL 구문에 대한 실행계획 비교를 통해 쿼리 성능을 평가하려고 합니다.
ex1_ex2_실행계획.PNG를 보시면, 위에서부터 ex1, ex2 각 쿼리문에 대한 실행계획이 출력된 모습니다. 저는 다음과 같이 각 실행계획을 분석했습니다.
1) ex1 쿼리문의 실행계획 분석
- 최초 Table_A 테이블을 선택하여 WHERE 조건에 부합하는 테이블 풀 스캔을 수행하고, 이후에 Table_B 테이블을 선택하여 WHERE 조건에 부합하는 테이블 풀 스캔을 수행하여 이후에 UNION을 수행하하는 SQL문이라고 해석했습니다.
2) ex2 쿼리문의 실행계획 분석
- Table_A 테이블에 대한 테이블 풀 스캔을 수행하여 임시(파생) 테이블로 생성하고, 이후에 Table_B 테이블에 대한 테이블 풀 스캔을 수행하여 UNION을 수행합니다. 마지막으로, UNION 결과를 담아두는 임시 테이블을 생성하는 SQL문이라고 해석했습니다.
위 두 가지 실행계획을 비교해봤을 때, ex2 쿼리문의 경우에는 굳이 임시(파생) 테이블을 생성하여 메모리를 소요하기 때문에 성능이 좋지 않다고 볼 수 있을까요?
또한, 제가 실행계획을 올바로 분석한 것인지, 틀린 부분이 있는지, 혹은 추가로 알고 있어야 하는 사항이 있을까요?
긴 글이지만, 전문가분들의 도움을 받고 싶습니다.
감사합니다 :)