쿼리를 열심히 짜고 보니 5 / 10어떤 집계 개수 / 총 개수 이런 로직이 있고 ROUND( 5 / 10 , 1) 이렇게 소수점 한 자리까지 가공하는 SQL이 존재했다. 테스트 데이터를 모두 지우고 운영에 반영하려고 할 때 문제가 발생했다. 1 / 0 , 0 / 0 -> 모두 Sql에서 에러가 튀어나왔다... 0으로 나눌 수 없다는 에러였다. 대충 어떤 쿼리인지 설명을 해보자면 SELECT NVL(COUNT(ABC), 0) / NVL(COUNT(TOTAL), 0)FROM TEST_TABLEGROUP BY ~~; 나름 NULL의 경우를 커버한다고 설정해두었지만, 저 경우에는 NULL로 나눠야 해결이 가능한 문제였다. 0으로 나눌 수 없고, NULL로는 나눌 수 있다. NULLIF를 사용해서 해결하였다..
DB관련
create table grades ( id serial primary key, g int, name text ); insert into grades (g, name ) select random()*100, substring(md5(random()::text ),0,floor(random()*31)::int) from generate_series(0, 12141215); CREATE INDEX g_idx ON grades (g); id : row_id g : grade name : name 실습1 explain select * from grades; Seq Scan : 쿼리 계획 (Sequential Scan == Full Scan) 힙(heap) 영역으로 바로 가서 가져올 것이다. 순차적으로! cost..
100만개의 행을 가지고 있는 employees을 생성하였다. id(row_id)와 name(이름) 1000001개의 행 ID : Integer | NOT NULL | auto increment (인덱스 가지고 있음) Name : 랜덤으로 만들어진 이름 실행계획과 쿼리의 수행 시간을 확인할 수 있는 postgre 의 명령어 explain analyze [쿼리] 실습1 인덱스가 존재하는 컬럼을 조회(Scan) explain analyze select id from employees where id = 2000; Index Only Scan using employees_pkey on employees ~~ :인덱스를 활용하여 스캔을 진행 Heap Fetches : 0 -> Heap영역에 접근할 필요 없음(w..
준비물 docker postgre 시작 create table temp(t int); insert into temp(t) select random() * 100 from generate_series(0, 1000000); select t from temp limit 10; 백만건의 데이터를 생성!
저장소 개념 Table Row_id Page IO Heap data structure Index data structure b-tree Table EMPLOYEE_ID (Row_id) 특정 행을 고유하게 식별 Postgres : 튜플 ID Page Storage Model(row vs column store)에 따라 행은 논리적 페이지에 저장되고 읽혀진다. 데이터베이스는 단일 행을 읽는 것이 아니라, 단일 IO에서 한 페이지 이상을 읽으며, 해당 IO에서 많은 행을 얻는다. 우리 눈에는 두개의 행만 골라서 읽어온 것처럼 보이지만, 페이지 단위로 저장되어 있는 전체 영역을 스캔하며 필요한 행을 가지고 온 것. Page Size는 DB마다 다르다. (e.g. 8KB in postgres, 16KB in My..
이기종 마이그레이션을 진행할 일이 생겼다. 여러 방법을 찾아봤는데, FlyWay https://flywaydb.org/ Homepage - Flyway Version control for your database. Robust schema evolution across all your environments. With ease, pleasure, and plain SQL. flywaydb.org 장점으로는 내가 좋아하는 Spring Boot에서 쓸 수 있다. 하지만 운영 소스 코드를 건드려야 하는데 그건 못하기 때문에 탈락 Flyway Desktop이라고 이관을 해주는 툴이 있는데 결국은 변환된 Script가 필요하다. DDL만 수행해주는 것이기 때문에 탈락 직접 해봤고, 테이블 이관은 해주는데 데이터 ..