MySQL 실행계획을 올바로 분석하고, 결론을 도출한 것인지 궁금합니다. 0 3 581

by 이동희 [MySQL] MySQL 실행계획 [2020.01.29 10:31:26]


test.PNG (12,229Bytes)

안녕하세요 :)
동일한 결과를 출력하는 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 쿼리문의 경우에는 굳이 임시(파생) 테이블을 생성하여 메모리를 소요하기 때문에 성능이 좋지 않다고 볼 수 있을까요?
또한, 제가 실행계획을 올바로 분석한 것인지, 틀린 부분이 있는지, 혹은 추가로 알고 있어야 하는 사항이 있을까요?

긴 글이지만, 전문가분들의 도움을 받고 싶습니다.
감사합니다 :)

by 마농 [2020.01.29 12:49:38]

굳이 실행계획을 볼 필요도 없이 2번 쿼리는 비효율이 너무 많이 보이는데요?
1번 쿼리가 깔끔한데 2번쿼리는 너무 복잡하고 억지스러운 쿼리네요.


by jkson [2020.01.29 15:57:21]

비효율보다도 두 쿼리의 결과가 다를텐데요. A, B 값 외에 다른 값이 있다면..


by 우리집아찌 [2020.01.29 16:15:28]

2번 쿼리는 결과도 틀리고 테이블에 데이터가 많으면 치명적이겠는데요

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입