PostgresDB에서 SQL 작업하면서 삽질한 경험을 공유합니다🙂
독자분들도 SQL작업하면서 의도대로 데이터가 나오지 않았다거나, 성능 개선, 기막힌 방법 등을 알아내신 게 있으시다면 댓글로 공유 부탁드립니다 !
- postgresql에서 count함수는 null값을 집계하지 않는다.- 따라서, count(*)를 사용하거나, count({not null이 보장된 필드})를 사용해야 한다.
- 특정 enum(String)이 아닌 테이블을 조회할때는이런식으로 null값을 고려해야한다. null이 있는 테이블을 다룰때는 is null or is not null 을 생각하자. aTable.B ≠ ‘특정필드’ and aTable.B is null
- join을 할때, on에 해당하는 조인 조건은 조인을 당하는 테이블만의 식이 들어가서는 안된다. join하려는 테이블의 조건이기 때문에 필터링되거나 조건이 적용되지 않는다.
- 복잡한 테이블은 WITH new_table AS (select ~~) 이런식으로 CTE를 활용해 가상테이블을 선언해서 만들자. 이경우는 querydsl를 사용못하기 때문에 유지보수가 힘들다. 대신 조회시 오래걸리는 거나 복잡한 통계성 조회 기능을 만들때 유용하다. 로그성 데이터 테이블의 셀프조인이 2개인경우 cte를 사용해서 join을 분리하면 성능에 이점이 있다. 이밖에도 정렬이나 페이지네이션의 경우 필요한 테이블만 조인해서 데이터셋을 만들어서 정렬, 페이지네이션 후에 필요한 데이터에 해당하는 테이블을 다시 가져오면 좋다.
- 로그성 테이블은 self 조인해서 원하는 값을 사용한다. ⇒ left join과 null값을 활용
- 성능을 개선하려면 index를 설정하고 row를 줄일 수 있는테이블 먼저 join해야한다. 테이블을 만드는 방법도 있는데 이는 중복된 데이터 칼럼의 일관성을 생각하며 분리된 테이블을 만들어야한다.
- SELECT COALESCE(칼럼1, 칼럼2, 칼럼3, ... , 칼럼 N, ...) FROM table; 을 사용해서 컬럼 값이 null값일 경우 다음 칼럼값을 취하도록 할 수 있다.
PostgresDB에서 SQL 작업하면서 삽질한 경험을 공유합니다🙂
독자분들도 SQL작업하면서 의도대로 데이터가 나오지 않았다거나, 성능 개선, 기막힌 방법 등을 알아내신 게 있으시다면 댓글로 공유 부탁드립니다 !
- postgresql에서 count함수는 null값을 집계하지 않는다.- 따라서, count(*)를 사용하거나, count({not null이 보장된 필드})를 사용해야 한다.
- 특정 enum(String)이 아닌 테이블을 조회할때는이런식으로 null값을 고려해야한다. null이 있는 테이블을 다룰때는 is null or is not null 을 생각하자. aTable.B ≠ ‘특정필드’ and aTable.B is null
- join을 할때, on에 해당하는 조인 조건은 조인을 당하는 테이블만의 식이 들어가서는 안된다. join하려는 테이블의 조건이기 때문에 필터링되거나 조건이 적용되지 않는다.
- 복잡한 테이블은 WITH new_table AS (select ~~) 이런식으로 CTE를 활용해 가상테이블을 선언해서 만들자. 이경우는 querydsl를 사용못하기 때문에 유지보수가 힘들다. 대신 조회시 오래걸리는 거나 복잡한 통계성 조회 기능을 만들때 유용하다. 로그성 데이터 테이블의 셀프조인이 2개인경우 cte를 사용해서 join을 분리하면 성능에 이점이 있다. 이밖에도 정렬이나 페이지네이션의 경우 필요한 테이블만 조인해서 데이터셋을 만들어서 정렬, 페이지네이션 후에 필요한 데이터에 해당하는 테이블을 다시 가져오면 좋다.
- 로그성 테이블은 self 조인해서 원하는 값을 사용한다. ⇒ left join과 null값을 활용
- 성능을 개선하려면 index를 설정하고 row를 줄일 수 있는테이블 먼저 join해야한다. 테이블을 만드는 방법도 있는데 이는 중복된 데이터 칼럼의 일관성을 생각하며 분리된 테이블을 만들어야한다.
- SELECT COALESCE(칼럼1, 칼럼2, 칼럼3, ... , 칼럼 N, ...) FROM table; 을 사용해서 컬럼 값이 null값일 경우 다음 칼럼값을 취하도록 할 수 있다.