데이터 분석의 명암
최근에 들어서 데이터의 수집과 통계 자료를 통해서 현상을 파악하고 새로운 트렌트를 찾으려는 시도가 많아졌다. 많은 업체에서는 데이터를 기반으로 UX를 분석하기 위해 A/B 테스트를 도입하기도 하고 이를 회사의 장점으로 채용 공고에 소개하는 경우도 많이 있다. 그간 얼마나 주먹구구식의 의사결정이 있었는지는 모르겠지만,… 더 보기 »데이터 분석의 명암
최근에 들어서 데이터의 수집과 통계 자료를 통해서 현상을 파악하고 새로운 트렌트를 찾으려는 시도가 많아졌다. 많은 업체에서는 데이터를 기반으로 UX를 분석하기 위해 A/B 테스트를 도입하기도 하고 이를 회사의 장점으로 채용 공고에 소개하는 경우도 많이 있다. 그간 얼마나 주먹구구식의 의사결정이 있었는지는 모르겠지만,… 더 보기 »데이터 분석의 명암
데이터베이스별 용량 확인
1 2 3 4 5 6 7 8 |
select table_schema as "database name", sum(data_length + index_length) / 1024 / 1024as"size(MB)", sum(data_free) / 1024 / 1024as"free(MB)" from information_schema.TABLES group by table_schema; |
테이블별 용량 확인
1 2 3 4 5 6 7 8 9 10 11 |
select table_schema as "database name", table_name as "table name", sum(data_length + index_length) / 1024 / 1024as size, sum(data_free) / 1024 / 1024as"free(MB)" from information_schema.TABLES group by table_name order by size desc; |
테이블 정보 확인
1 2 |
show table status; select * from information_schema.TABLES; |
통계에서 사용하는 쿼리를 만들다보니, (약간은) 부득이 하게 JPA Query Method를 사용하지 않고 @Query annotation을 이용해서 아래처럼 구현하였다.
1 2 3 4 5 |
@Query(value = "SELECT COUNT(id) " + "FROM FooObject fooObject " + "WHERE {some_condition}") List<Integer> findCountByIdAndDateRangeGroupBySomeCondition( @Param("id") String id, @Param("localDate") LocalDate localDate); |
호출하는 쪽의 로직은 아래와 같다.
1 2 3 4 5 6 7 8 9 |
private void checkAllTypeIsAvailable(String id, LocalDate localDate) { List<Integer> counts = fooRepository.findCountByIdAndDateRangeGroupBySomeCondition(id, localDate); for (int count : counts) { // TODO by freeism: long -> int class cast exception if (count % 2 != 0) { throw new CustomException(ErrorCode.INVALID_PARAMETER); } } } |
자세한 로직은 회사 업무상 대외비이기 때문에 약간 이상한 네이밍인 점은 신경쓰지 않기로 하자. 어쨌거나 위의 로직을… 더 보기 »JPA에서 count()는 Long Type을 return 함
DB에 데이터를 저장할 때, 빈번하게 사용되는 로직중에 insert/update가 있다. 먼저 select 한 뒤, 데이터가 존재하지 않으면 insert, 데이터가 존재하면 update를 하도록 한다. (혹은 update를 먼저하고 exception이 발생하면 insert를 하도록 구현하는 경우도 있다) public void renewMemberInfo(Member member) { Member originMember = memberRepository.selectMember(member.getId()); if (originMember.isNotEmpty()) { memberRepository.update(member);… 더 보기 »upsert = insert + update를 처리하는 로직
DB담당자에게서 몇 가지 배운 것이 있어서 기록해본다. SELECT CONVERT(bigint, createDate) AS createDate FROM MEMBER WHERE memberId = ‘freeism’ AND memberSex = ‘male’ 위와 같은 예제 쿼리가 있다. 여기서 search할 때 where절에서 unique한… 더 보기 »SQL 쿼리 작성시 퍼포먼스를 올리는 팁