안녕하세요 현재 postgresql 로 개발을 하던 중 전체테이블 데이터(통계)를 뿌릴려고하는데 union all 을 사용하여 데이터를 하나씩 붙여버리니 쿼리가 너무 길어질 것 같아서
혹시 대응 방안이 있을까 하고 여쭈어 봅니다... 더 나은 방법이 있을까요? 테이블이 대략 16~18 개정도 되는데 이것을 한번에 union all 로 불러오는 것이 맞는것인지.. 선배님들 조언 부탁드리겠습니다... 감사합니다!
select data_type ,(select table_kor from com_data_status where table_eng='pop_hdong_month_wk_end_inflow_in_visit') ,data_source ,data_interval ,(select count(*) from pop_hdong_month_wk_end_inflow_in_visit) as 적재건수_총 ,(select count(*) FROM pop_hdong_month_wk_end_inflow_in_visit group by (base_yr::text ||'/'|| base_mm::Text) order by 1 limit 1) as 적재건수_최근 ,(select base_yr ::text ||'/'|| base_mm ::text FROM pop_hdong_month_wk_end_inflow_in_visit group by (base_yr::text ||'/'|| base_mm::text) order by 1 desc limit 1) as 최근갱신일 FROM com_data_status where table_eng='pop_hdong_month_wk_end_inflow_in_visit' union all select data_type ,(select table_kor from com_data_status where table_eng='pop_hdong_month_wk_end_sex_age_visit') ,data_source ,data_interval ,(select count(*) from pop_hdong_month_wk_end_sex_age_visit) as 적재건수_총 ,(select count(*) FROM pop_hdong_month_wk_end_sex_age_visit group by (base_yr::text ||'/'|| base_mm::Text) order by 1 limit 1) as 적재건수_최근 ,(select base_yr ::text ||'/'|| base_mm ::text FROM pop_hdong_month_wk_end_sex_age_visit group by (base_yr::text ||'/'|| base_mm::text) order by 1 desc limit 1) as 최근갱신일 FROM com_data_status where table_eng='pop_hdong_month_wk_end_sex_age_visit' union all select data_type ,(select table_kor from com_data_status where table_eng='pop_hdong_day_visit') ,data_source ,data_interval ,(select count(*) from pop_hdong_day_visit) as 적재건수_총 ,(select count(*) from pop_hdong_day_visit group by (base_yr::text ||'/'|| base_mm::text )order by 1 limit 1)as 적재건수_최근 ,(select base_yr ::text || '/' ||base_mm ::text from pop_hdong_day_visit group by(base_yr::text ||'/'||base_mm::text)order by 1 desc limit 1)as 최근갱신일 from com_data_status where table_eng='pop_hdong_day_visit' union all select data_type ,(select table_kor from com_data_status where table_eng='pop_hdong_month_foreign_visit') ,data_source ,data_interval ,(select count(*) from pop_hdong_month_foreign_visit)as 적재건수_총 ,(select count(*) from pop_hdong_month_foreign_visit group by (base_yr::text ||'/'|| base_mm::text)order by 1 limit 1)as 적재건수_최근 ,(select base_yr::text||'/'|| base_mm::text from pop_hdong_month_foreign_visit group by(base_yr::text ||'/'||base_mm::text )order by 1 desc limit 1)as 최근갱신일 from com_data_status where table_eng='pop_hdong_month_foreign_visit'
최근 자료 구하는 서브쿼리가 맞는 쿼리인지 의문입니다.
이 부분 수정 및 개선이 필요할 듯 하네요.
각 테이블마다 base_yr, base_mm 이 숫자형으로 존재하는 듯 하네요.
이렇게 년월이 두개 항목으로 분리되어 있으면 최근 자료 구하기 까다롭습니다.
두개를 엮어서 처리해야 하는데 숫자형이라 문자 처리시 가변 길이라 또 문제입니다.
2022/2 와 2022/10 을 문자 비교하면 2022/2 가 더 최신이 되는 오류가 발생됩니다.
차라리 년월 또는 년월일 또는 Date 형태의 하나의 항목으로 관리되어야 최적화가 가능합니다.
각 테이블이 원본 테이블이라기보다는
특정 주기별도 취합된 통계성 테이블인 듯 합니다.
첨부된 이미지를 보면 최근월이 다 동일한 것으로 보입니다. 2022/2
그렇다면 최근월을 쿼리에서 직접 구하지 말고
별도 쿼리로 최근월을 구해와서 상수값으로 조건처리하는 것이 좋을 듯 합니다.
모든 테이블의 최근월이 다 동일하다고 가정하면 한번만 구하면 되겠네요.