안녕하세요.
일시(분단위 까지)로 통계 데이터가 들어가져 있고, 조회시 합계(sum)이나 평균값(avg)로 데이터를 뽑아옵니다.
근데 조회 시, 분단위 전체 조회가 아닌 조건에 따른 일단위, 월단위의 어느 기간의 데이터들을 group by 하여 조회합니다.
이 경우,
(인덱스 설정 가정 하)
일시에 대한 컬럼을 date 타입 단일컬럼이 효율적일지, 아니면 varchar(혹은 int)타입의 year, month, day, hour, minute 컬럼을 따로 두어 조회하는게 효율적일지가 궁금합니다!
예제를 좀 보여주세요.
일단 날짜값은 date 컬럼을 가져가는게 맞습니다.
항목을 나누는 것은 권장하지 않습니다.
제가 경험한 대부분의 프로젝트는 시간데이터가 필요 없는 경우는 varcar2(8)로 설정해서 일자 데이터 까지만 관리 하더군요.
시간데이터를 사용하지 않는다면 굳이 date 형태에 인덱스를 설정하는거보다 varchar 형태의 일자 데이터에 인덱스 설정을 하는게 불필요한 자원의 사용을 줄이는 길이라고 생각합니다.
날짜 속성 컬럼은 char 나 varchar 쓰는것보다 date type 으로 사용하는것이 맞습니다.
예전에는 char(8), varchar(8) 이렇게도 사용하곤 했는데 데이터 이행(varchar -> date) 하다보면
틀린 날짜가 꽤 나옵니다.
날짜를 문자형으로 사용하게 되면 데이터 무결성이 가장 큰 문제일겁니다.
https://dataonair.or.kr/db-tech-reference/d-lounge/expert-column/?mod=document&uid=52968
하나 더 말하자면 date type은 7byte , varchar2(8) 은 8byte 이겠네요.
관성처럼 varchar2 형태로 개발하는 것이 익숙해졌는지도 모르겠네요.
예전 프로젝트의 date 형 index 생성에 수정항목의 속도문제가 있었는데, date 형태에 일자 데이터만 입력 처리하는 방식은 생각을 못했네요.
역시 이런 의견의 공유가 큰 도움이 되는거 같습니다.
집계에 있어 일시로 월 일 시 분 에 대한 그룹핑으로 아래와 같이 컬럼을 나누고 인덱스를 거는 것이 효율적이지 않을까 생각했는데
| year | month | day | hour | minute | 집계테이터1 | 집계데이터2 |
ex) 시간 단위 집계 > select year, month, day, hour sum(집계데이터1), avg(집계데이터2) from TABLE group by year, month, day, hour;
그냥 DATETIME 의 형태로 가져가야겠네요
답변 정말정말 감사드립니다!!