item테이블과 item_tag테이블이 있고
SELECT a.site, a.facility, b.UPDATE_time
, MAX(case when tag_type = 'dust' then VALUE ELSE '-' END) AS dust
, MAX(case when tag_type = 'nox' then VALUE ELSE '-' END) AS nox
, MAX(case when tag_type = 'sox' then VALUE ELSE '-' END) AS sox
, MAX(case when tag_type = 'co' then VALUE ELSE '-' END) AS co
, MAX(case when tag_type = 'hcl' then VALUE ELSE '-' END) AS hcl
, MAX(case when tag_type = 'oxygen' then VALUE ELSE '-' END) AS oxygen
, MAX(case when tag_type = 'flux' then VALUE ELSE '-' END) AS flux
, MAX(case when tag_type = 'incinerator_temp' then VALUE ELSE '-' END) AS incinerator_temp
, MAX(case when tag_type = 'chimney_temp' then VALUE ELSE '-' END) AS chimney_temp
, MAX(b.created_date) AS createdDate
FROM item_taga
JOIN item b
ON a.tag = b.name
WHERE b.update_time >= '2023-02-08 00:00:00'
AND b.update_time <= '2023-02-08 23:59:59'
group by a.site, a.facility, b.update_time
ORDER BY a.site, a.facility, b.update_time
;
위와 같이 피벗형식으로 조회를 하고 싶은데...
몇만개 정도까지는 가능한데 item테이블에 데이터가 최소 분당 30개씩 쌓여서 테스트를 하기 위해 300만개(첨부한 item.sql에서 update_date, create_date정도만 계속 달라지며, create_date는 now(), update_date는 상대가 전달주는 시간 값입니다.)정도 넣고 돌려보면 엄청나게 느려지네요.. 그냥 로컬 DB로 돌릴때도 20초 이상 걸리긴 하는데 따로 서버에 있는 DB를 호출하면 쿼리가 끝날 생각을 하지 않습니다.
혹시 인덱스나 쿼리 개선 방면으로 도와 주실 수 있으신 부분이 있다면... 도움 주시면 매우 감사하겠습니다.
Comment 2
-
지영아빠
2023.02.26 00:34
-
ProjectUnknown
2023.02.27 09:02
조언 감사드립니다. 인덱스는 기존에 있던 인덱스(name, update_time, created_date)말고도 추가해보라는 말씀이신 것 같아 한번 테스트 해보겠습니다.
결과행수는 하루치 기준 전달하는 쪽에서 분당 30개 정도라고 해서 아마 말씀하신 수량의 절반정도 될 거 같습니다.
시간분할은.. 고려해보긴 해야겠네요.. 검색 시작일, 종료일로 하루만 검색하는 게 아니라 며칠치의 데이터를 검색할 수 있어서..
현재의 쿼리로는 인덱스를 하나 추가를 해야 할 것 같습니다.
그런데 결과행수가 대략 518400 일거 같은데 맞는 건지 확인해보셔야 할 것 같습니다.
60초 * 60분 * 24시간 * 3(item_tag.site) * 2(item_tag.facility) = 518400 (rows)
데이터가 많으면 시간 분할해서 쿼리한 결과를 다시 sum하는 작업을 해보셔야 할 것 같으네요/