본문 바로가기

개발/DB

[DB] 인덱스를 내 의도대로 설정하자 옵티마이저는 SQL의 실행계획을 만들어주는 Database의 핵심 엔진이다. 이 옵티마이저를 통해 우리는 조회 시, 최적의 속도로 결과를 얻을 수 있게 되는데, 종종 이 옵티마이저가 우리의 의도대로 동작하지 않는 경우가 있다. 예를들어 특정 select 쿼리를 수행하기 위해 analyze를 실행했다고 하자(MariaDB 기준) 분명히 사용 가능한 키가 있음에도 테이블 full scan이 발생하고 있는 것을 확인할 수 있고, 조회 대상인 row도 1만이 넘어가고 있다. 이럴 때 강제로 사용가능한 index를 수행하도록 지정할 수 있는데, 이를 Index Hint 라고 한다. Index Hint 특정 인덱스를 사용하지 않길 원하면 ignore 를, 사용하길 원하면 use 또는 force 를 사용할 수 있다... 더보기
[DB] 사용자에 따라 다른 Timezone 결과 조회하기(MariaDB) 글로벌 서비스를 지향하는 솔루션이라면, 언제나 피해갈 수 없는 것이 Timezone 문제일 것이다. 일반적으로 타임존을 다룰때는, 서버의 시간대를 사용하거나, UTC를 사용할 것이다. 하지만 사용자별로 Timezone을 Optional 하게 가져갈 수 있고, 설정한 타임존에 맞게 쿼리의 결과를 보여주어야 한다면 어떻게 하는것이 좋을까? 다양한 케이스와 환경의 차이가 있겠지만, 여기서는 내가 경험한 제한된 상황 그 환경 안에서 해결했던 방법을 적어보고자 한다. 직면한 환경과 제약사항은 아래과 같았다. RDBMS를 사용하고 있다. (MariaDB) MariaDB의 System 타임존은 UTC이다 (+00:00) 초당 데이터가 누적되고 있다. (unix timestamp 기준) 분, 시, 일 단위로 주기적으로.. 더보기
[DB] Entity에 catalog 옵션이 있을 경우 실무 환경에서 설계를 하다보면, DB 스키마가 분리되어 있는 경우가 있다. 특히 JPA를 사용하는 환경에서 스키마가 분리되는 경우는 그다지 권장되지는 않는 듯 하지만, 어쩔수 없는 경우도 있으니까.. @Entity @Table(name = "my_entity", catalog = "second_schema") public class MyEntity {...} 메인 스키마가 있는 경우 다른 스키마에 테이블이 있는 경우 Entity의 Table 어노테이션에 catalog 옵션을 주어 JPA 테이블이 해당 엔티티를 바라보도록 설정할 수 있었다. 문제는 테스트코드 작성시 H2 Database를 사용하고 있었는데, 기본 설정만으로는 해당 테이블을 인식하지 못해 테스트를 통과하지 못하고 있다는 것이다. 이 때 테스.. 더보기
[MySQL] 내가 원하는 순서대로 Order by 조건을 주자 최근 회사에서 FE에서 특정 필드의 순서를 담아 API 요청을 하고, 그 순서대로 json 형태로 return을 해야하는 케이스가 발생했다. 결국 깔끔하게 가져오려면 API에서 조건 반복을 돌리기보다는 DB의 쿼리로 조건을 뽑아내고 싶었다. 하지만 일반적인 경우 order by 조건은 특정 컬럼을 기준으로 오름(내림)차순만 가능했다. 하지만 아래와 같이 'FIELD' 값으로 컬럼을 지정하고 순서를 입력하게 된다면. 내가 원하는 순서대로 조회가 가능했다. SELECT VALUE FROM TABLE ORDER BY FIELD(VALUE, 'val3', 'val1', 'val2'); 하지만, 문제는 DB단에서 처리한다고는 했지만, 실제로는 QueryDSL을 사용하여 조회 쿼리를 수행하고 있었다는 것이다. 이에.. 더보기
[DB]격리수준(Isolation Level) 실제 운영중인 시스템에서, 데이터베이스에 의도하지 않은 값이 들어가거나, 중간에 엉뚱한 Insert 또는 Update 쿼리로 인해 데드락이 발생하는 경우가 있었다.(심지어 Select 임에도 불구하고...) 왜 Select중에 교착상태가 발생하는 것일까...? 의문을 가지게 되면서 데이터베이스의 격리수준에 대해 공부하게 되었다. 데이터베이스의 격리 수준은 대표적으로 4가지로 나뉘어진다.(아래로 갈수록 격리 수준 ↑, 성능 ↓) 1. READ UNCOMMITTED 2. READ COMMITTED 3. REPEATABLE READ 4. SERIALIZABLE 하나씩 살펴보자면 1. READ UNCOMMITTED Commit 되지 않은 데이터를 읽을 수 있다. 즉 하나의 트랜잭션에서 Insert나 Update.. 더보기