본문 바로가기
반응형

Database32

[PostgreSQL] 모든 View 의 접근 기록 테이블에 적재하기 (애플리케이션 변경 없이) View Table을 적극적으로 사용하는 시스템에서 View Table의 의존성을 줄이고자 할때가 있다. 이는 레거시 데이터베이스를 리팩토링 해야하는 경우인데, 보통 너무나 파편화된 데이터베이스 접근을 하나로 통합하고자 할때이다. 보통 ORM을 사용하는 경우에는 이러한 리팩토링이 쉽지만, ORM을 사용하지 않는 경우에는 어떻게 해야할까? 가장 먼저 해야할 것은 View가 계속 사용되고 있는지, 리팩토링에서 누락은 없었는지를 확인할 수 있는 방법을 마련하는 것이다. 특정 테이블의 변경이 있을때마다 어떠한 액션을 넣을 수 있는 가장 흔한 방법은 Trigger 이다. 하지만 아쉽게도 PostgreSQL에서는 View Table의 Select 쿼리에 대한 Trigger가 적용되진 않는다. 그래서 다른 방법을 고.. 2023. 11. 5.
PostgreSQL 11 에서의 add column not null & default 성능 개선 Aurora MySQL 5.7까지만 써본 경험에서 Online DDL 은 여전히 부담스럽다. 그럼에도 대량의 데이터가 쌓인 테이블에 DDL을 수행하는 것은 서비스를 운영하다보면 피할 수 없다. 100GB 이상의 테이블에 Online DDL로 컬럼을 추가해도 1시간이 넘도록 수행되던 경험을 해보면 가능한 기존 테이블에 컬럼을 추가하는 등의 DDL 작업은 피하고 싶어진다. 다만, MySQL과 다르게 PostgreSQL에서는 오래 전부터 일부 ALTER 작업에 대해서는 잠금 없는 변경이 가능하다. 이는 MySQL에서는 테이블 구조를 변경할때 전체 테이블의 데이터를 새로운 구조로 복사하는 방식을 취해서 테이블의 크기가 큰 경우 오래 걸리는 것과 다르게 PostgreSQL에서는 테이블 구조 변경 작업시 meta .. 2023. 8. 1.
(AWS RDS) PostgreSQL 필수 Log 관련 Parameter DB를 활용한 365/24시간 서비스에서 가장 중요한 설정 중 하나가 DB 로그를 어떻게 남기고 관리할 것인가이다. MySQL을 주로 사용하다가 PostgreSQL 을 사용하게 되면서 PostgreSQL에서 지원하는 다양한 로그 파라미터들을 알게 되었다. 아래는 사내에서 적용하고 있는 PostgreSQL 의 필수 로그 파라미터 값들이다. ChatGPT 가 나와서 이제 이런 파라미터값들에 대한 설명이 의미가 있나 싶지만…ㅠ 파라미터 각 설정들은 공식 문서 를 확인해보면 더 자세하게 확인할 수 있다. 각 설정을 남길 경우 발생되는 로그 메세지 샘플도 첨부했다. 해당 로그 메세지를 파싱하여 Slack 알람 등을 보내는 Lambda 함수를 만드는데 활용하면 좋다. log_temp_files 권장: 1024 설정.. 2023. 3. 19.
DataGrip 에서 안전하게 Command 수행하기 DataGrip을 포함한 GUI 도구로 운영 DB에 쿼리를 수행하는건 항상 조심해야한다. 하지만, 매번 모든 쿼리를 사람이 주의해서 수행하는건 불가능하며, 사람이라면 무조건 실수를 할 수 있다. 사람인 이상 잘못된 쿼리를 실행할 수 있지만, 이게 최대한 치명적인 실수가 발생하지 않도록 장치를 둘 순 있다. 그래서 가능한 실수를 할 수 없는 환경을 조성해서 진행하는게 필요하다. 1. Reader DB 활용 보통 클라우드 서비스를 사용하거나, 어느정도 정비가 되어있는 상황이라면 Reader DB (Replica DB) 가 존재한다. GUI 도구를 사용하다보면 의도치 않게 UI 상에서 데이터 수정을 일으킬 수 있다. 그래서 단순 조회가 필요한 경우 조회 기능 밖에 지원하지 않는 DB (Reader)를 사용한다.. 2023. 3. 13.
PostgreSQL14 Memoize 성능 비교 (feat. 13 vs 14 Nested Loop) PostgreSQL에서는 3가지의 Join 알고리즘을 지원한다. Nested loop join Hash join Merge join 이 중 Nested loop join 은 가장 보편적인 Join 방식으로 그 작동 방식에는 결국 반복적인 스캔이 있다. 만약 반복적인 스캔의 하위 결과가 매번 같다면 이를 캐시해두고 반복적인 스캔에서 계속 사용한다면 어떨까? 아마도 JavaScript의 메모이제이션 을 알고 있다면 이해하기 쉬울것 같다. PostgreSQL 14에서 memoize 이 도입되었다. 그리고 AWS의 Aurora PostgreSQL 역시 PostgreSQL 14.x를 지원하고 있어 해당 옵션을 사용할 수 있다. Memoize 로 성능 개선을 얼마나 얻을 수 있을지 한번 알아보자. 1. 성능 테스트.. 2023. 1. 30.
NOT IN 쿼리 성능 개선하기 (PostgreSQL) 일반적으로 모든 RDBMS에서 부정조건 (not in, != 등) 은 인덱스를 선택하지 못한다. 이는 부정조건이 그 조건 외 나머지 모두를 뜻하기 때문인데, 지정된 대상을 빨리 찾는것이 인덱스임을 고려하면 그것 외 나머지라는 것 자체가 전체를 읽어야만 알 수 있는 정보이기 때문이다. 이럴때 가장 효율적인 해결 방법은 not in 을 없애는 것이다. 가장 대표적으로는 left outer join 이 있다. as-is) 아래의 쿼리는 현재 거의 2초에 가까운 시간이 소요되는 쿼리이다. select id from courses WHERE ("status"::text = 'publish' AND "published_date" < now() AND "exposure" AND "deleted_at" IS NULL).. 2022. 1. 17.

728x90
반응형