postgresql UNIONALL 각각테이블의 데이터 개수 카운트 질문드립니다... 0 2 1,565

by 김성진 [DB 기타] 통계 카운트 유니온 [2022.05.06 11:51:44]


데이터현황.PNG (11,798Bytes)

안녕하세요 현재 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'
  
 

 

 

by pajama [2022.05.08 01:17:51]

xml 함수로 간결하게 될듯 합니다만 성능은 어떨지 모르겠네요.

https://stackoverflow.com/questions/2596670/how-do-you-find-the-row-count-for-all-your-tables-in-postgres


by 마농 [2022.05.09 10:05:43]

최근 자료 구하는 서브쿼리가 맞는 쿼리인지 의문입니다.
이 부분 수정 및 개선이 필요할 듯 하네요.


각 테이블마다 base_yr, base_mm 이 숫자형으로 존재하는 듯 하네요.
이렇게 년월이 두개 항목으로 분리되어 있으면 최근 자료 구하기 까다롭습니다.
두개를 엮어서 처리해야 하는데 숫자형이라 문자 처리시 가변 길이라 또 문제입니다.
2022/2 와 2022/10 을 문자 비교하면 2022/2 가 더 최신이 되는 오류가 발생됩니다.
차라리 년월 또는 년월일 또는 Date 형태의 하나의 항목으로 관리되어야 최적화가 가능합니다.


각 테이블이 원본 테이블이라기보다는
특정 주기별도 취합된 통계성 테이블인 듯 합니다.
첨부된 이미지를 보면 최근월이 다 동일한 것으로 보입니다. 2022/2
그렇다면 최근월을 쿼리에서 직접 구하지 말고
별도 쿼리로 최근월을 구해와서 상수값으로 조건처리하는 것이 좋을 듯 합니다.
모든 테이블의 최근월이 다 동일하다고 가정하면 한번만 구하면 되겠네요.

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