cost 더 낮은데, 실제로는 더 느리게 동작하네요.. 0 2 2,376

by 쿼리초보 [MySQL] [2023.06.14 11:47:06]


A 테이블 - 데이터 10만건

B 테이블 - 데이터 20만건

C 테이블 - 데이터 22만건

 

기존 쿼리)

SELECT 필요한컬럼

   FROM A

   LEFT OUTER JOIN B ON A.A컬럼 = B.A컬럼 AND A.B컬럼 = B.B컬럼

    INNER JOIN C ON B.C컬럼 = C.C컬럼 AND B.D컬럼 = C.D컬럼

 

변경 쿼리)

SELECT 필요한컬럼

   FROM A

LEFT OUTER JOIN (SELECT 필요한 컬럼 FROM B WHERE 수를 줄이기 위한 조건) 

ON A.A컬럼 = B.A컬럼 AND A.B컬럼 = B.B컬럼

    INNER JOIN C ON B.C컬럼 = C.C컬럼 AND B.D컬럼 = C.D컬럼

 

기존 쿼리 실행계획을 실행 시켜보니, B 테이블이 type ALL로 풀스캔 하고 있어 인터넷에 검색해 보니,

테이블내 필요한 데이터만 가져와서 조인 하는 방법 + 인덱스 생성 후, 인덱스를 태울 수 있는 조건을 걸라고 하셔서

두개의 조언을 참고하여 추가하니 cost가 확실히 줄었는데, 실제 쿼리 속도는 400ms정도 늦어졌습니다..

혹시 왜 그런지 알 수 있을까요??

 

DB는 MYSQL 사용중입니다~

 

 

by pajama [2023.06.14 21:55:38]

mysql도 통계정보가 있어서 쿼리 플랜에 영향이 있을텐데요.

현재 통계정보 상태를 보시는게 좋을 것 같습니다.


by 제로벅 [2023.06.22 14:15:17]

B테이블에 인덱스만 만들고, 

기존 쿼리를 실행해 보세요. 

드라이빙 테이블에서 데이터 검색량을 줄이는 게 중요합니다. 

아웃터 조인은 데이터 범위를 줄인다고 성능 항샹이 안 될 겁니다. 

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