Left Outer Join에서 order by 로 인한 속도 저하 문제 0 3 6,052

by 비연 [MySQL] join mysql order by [2018.01.18 19:50:22]


안녕하세요.

미세먼지에 모두 건강 조심하시기 바랍니다.

제목 그대로  left join으로 여러개의 테이블을 조인해서 데이터를 가져옵니다.(검색조건이 너무 다양해서)

쿼리는 아래와 같은데, 아래 쿼리에서 맨 마지막 ORDER BY date_created desc  이 부분을 지우면 속도가 빠른데 저 부분을 넣으면 속도가 현저하게 떨어집니다.

select에서 select로 감싸고 left join을 걸어야 하는건지 저 상황에서 속도가 빠를수 있는 방법이 없는지요.

 

SELECT  DISTINCT  f.csr_no, csr_title , csr_customer_cd, fn_customer_nm(csr_customer_cd, 'ko') as csr_customer_nm ,
csr_customer_member, fn_member_nm(f.csr_customer_member, 'ko') as csr_customer_member_nm , 
csr_reqtype_cd, fn_code_filter_nm('MC1009', 1, f.csr_reqtype_cd, 'ko') as csr_reqtype_nm , 
csr_reqmethod_cd, fn_code_filter_nm('MC1018', 1, f.csr_reqmethod_cd, 'ko') as csr_reqmethod_nm , 
csr_reqdiv_cd, fn_code_filter_nm('MC1019', 1, f.csr_reqdiv_cd, 'ko') as csr_reqdiv_nm , csr_impdev_cd, 
fn_code_filter_nm('MC1020', 1, f.csr_impdev_cd, 'ko') as csr_impdev_nm , csr_impdev_detail , csr_req_date, 
csr_req_member, fn_member_nm(f.csr_req_member, 'ko') as csr_req_member_nm , csr_req_content ,csr_status, 
fn_code_filter_nm('MC1011', 1, f.csr_status, 'ko') as csr_status_nm , csr_company_cd, fn_code_filter_nm('MC1002', 1, f.csr_company_cd, 'ko') as csr_company_nm , 
csr_company_member, fn_member_nm(f.csr_company_member, 'ko') as csr_company_member_nm , 
csr_trans_company_cd, csr_trans_company_member, csr_trans_date , csr_receipt_date,csr_receipt_member, 
fn_member_nm(f.csr_receipt_member, 'ko') as csr_receipt_member_nm , 
csr_file_group , f.date_created, f.date_updated, f.creator, f.updater , 
date_format(f.date_updated, '%Y.%m.%d') as date_updated1 , fn_member_nm(f.updater, 'ko') as updater_nm 
-- , e.csr_model_cd
, (select x.category_nm from sy_prod_category_master x where x.category_cd = e.csr_model_cd limit 1) as csr_model_nm 
FROM cs_csr f
   left outer JOIN cs_csr_faildef b ON f.csr_no = b.csr_no 
   left outer JOIN cs_rma_result_capa c ON f.csr_no = c.csr_no 
   left outer JOIN cs_csr_failsymp d ON f.csr_no = d.csr_no 
left  JOIN cs_csr_prod e ON f.csr_no = e.csr_no 
WHERE  f.csr_reqtype_cd NOT IN ('05') AND f.customer_div_cd = '1110'  ORDER BY date_created desc  LIMIT 0, 30  

by 마농 [2018.01.18 20:07:53]

1. DISTINCT 사용이 적절한가요?
   - 잘못 작성한 쿼리에서 중복이 발생되어 중복 제거용으로사용한 것은 아닌지?
   - 일반적으로 Distinct 가 필요한 경우는 극히 드믑니다.
2. 가공후 정렬하는 것 보다는 정렬 후 가공하는 것이 좋습니다.
   - 우선 (함수 사용 후 정렬 ==> 정렬 후 함수 사용)으로 바꿔보세요.
   - 테이블 관계에 따라서 조인 또한 마찬가지로 순서를 바꿀 수 있습니다.(조인 후 정렬 ==> 정렬 후 조인)
   - 단 테이블 관계가 확실해야 합니다.(1:1(O), m:1(O), 1:m(X))
3. 아우터 조인되는 테이블이
   - 사용되고 있기는 한건가요?
   - 조인 구문 이외에는 b., c., d. 의 흔적이 전혀 보이질 않네요?
   - 조인이 필요한것인지 의문이네요?


by 비연 [2018.01.18 20:39:00]

1. Distinct는 중복방지용으로 사용을 한것입니다.

   메인테이블은 cs_csr 테이블은 1하나의 레코드인데 관련 아우터 조인 테이블중에는 1개이상의 레코드가 있습니다.

2. 정렬후 함수 사용이라는 부분이 이해가 잘 되지 않습니다. 테이블관계는 조건에 만족하는 상태입니다.

3. 아우터 조인되는 테이블은 검색조건값들이 뒤에 붙을 예정입니다. 

 

 


by 마농 [2018.01.18 20:53:49]

1. 중복방지용 으로 사용되는 Distinct 는 바람직하지 않습니다.
  진짜로 중복이 발생될수밖에 없는 특수한 상황이 맞는지?
  보통의 경우 중복은 발생되지 않습니다.
  조인조건을 누락하거나 하는 사람의 실수로 인해 발생되는 중복자료는
  쿼리를 정확하게 바꿔서 해결해야지 Distinct 로 해결해서는 안됩니다.
2. 정렬 후 함수 사용
  - 변경전 : SELECT a, b, 함수(c), 함수(d) ORDER BY a LIMIT 30;
  - 변경후 : SELECT a, b, 함수(c), 함수(d) FROM (SELECT a, b, c, d ORDER BY a LIMIT 30) a;

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