업무를 하면서 개인적으로 느낀 점을 서술하겠습니다. 틀린 내용이 있을 수도 있다는 점에서 유의 부탁드립니다. 1. 불필요한 CASE WHEN THEN예시나쁜 케이스SELECT emp_id, CASE WHEN salary >= 5000 THEN 'HIGH' ELSE 'LOW' END AS salary_grade, CASE WHEN dept_id = 10 THEN 'HR' WHEN dept_id = 20 THEN 'SALES' ELSE 'OTHER' END AS dept_name, CASE WHEN job_title LIKE '%Manager%' THEN 'MANAGER' ELSE 'STAFF' END AS job_level, -- 추가적인 C..
DB관련
쿼리를 열심히 짜고 보니 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를 사용해서 해결하였다..

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..