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