본문 바로가기
반응형

PostgreSQL17

(AWS RDS) PostgreSQL 필수 Log 관련 Parameter DB를 활용한 365/24시간 서비스에서 가장 중요한 설정 중 하나가 DB 로그를 어떻게 남기고 관리할 것인가이다. MySQL을 주로 사용하다가 PostgreSQL 을 사용하게 되면서 PostgreSQL에서 지원하는 다양한 로그 파라미터들을 알게 되었다. 아래는 사내에서 적용하고 있는 PostgreSQL 의 필수 로그 파라미터 값들이다. ChatGPT 가 나와서 이제 이런 파라미터값들에 대한 설명이 의미가 있나 싶지만…ㅠ 파라미터 각 설정들은 공식 문서 를 확인해보면 더 자세하게 확인할 수 있다. 각 설정을 남길 경우 발생되는 로그 메세지 샘플도 첨부했다. 해당 로그 메세지를 파싱하여 Slack 알람 등을 보내는 Lambda 함수를 만드는데 활용하면 좋다. log_temp_files 권장: 1024 설정.. 2023. 3. 19.
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.
NodeJS에서 데이터베이스 통합 테스트 성능 개선하기 (TypeORM, Jest, PostgreSQL) 보통 통합 테스트는 SQLite, H2와 같은 InMemory 데이터베이스를 사용한다. 메모리상에만 존재하기 때문에 실제 ORM (SQL) 을 검증이 가능하면서도 병렬로 테스트를 수행할 수 있고, 고속의 쿼리 수행이 가능하기 때문이다. 대부분의 데이터베이스 쿼리는 InMemory 데이터베이스에 대해 실행할 수 있지만 많은 엔터프라이즈 시스템은 실제 Production과 같은 데이터베이스에 대해서만 테스트할 수 있는 복잡한 쿼리를 사용한다. 그래서 운영 환경에서 사용하는 데이터베이스(MySQL, PostgreSQL 등) 에서 지원하는 여러 기능(Windows함수, 프로시저, 트리거 등) 들을 적극적으로 사용하는 환경에서는 InMemory DB로 검증하는데 한계가 있다. 이를 위해 보통은 로컬 PC에서는 D.. 2022. 12. 25.
NodeJS 와 PostgreSQL Connection Pool Database에 관해 기본적인 id/pw 외에 해야할 설정들이 여러개 있는데요. 그 중 실제 서비스 운영에 가장 중요한 설정 중 하나가 이전 글인 쿼리 타임아웃 과 함께 커넥션 풀 (Connection Pool) 설정입니다. 이 커넥션풀 설정이 왜 필요한지, 어떻게 해야할지 등등을 알아보겠습니다. 1. 실험 환경 실험의 경우 아래 환경에서 진행합니다. Node 16 PostgreSQL 14 (by Docker) 간단하게 아래와 같이 Node와 PG를 사용한 코드를 하나 만들어둡니다. 실험을 위해 lint 등을 빼고 빠르게 구성했습니다. app.js const express = require('express'); const pg = require('pg'); const app = express() con.. 2022. 1. 21.
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.
NodeJS 와 PostgreSQL Query Timeout 작은 서비스를 운영할때는 문제가 없던 서비스가 데이터가 적재되면 될수록 점점 슬로우 쿼리가 등장하게 됩니다. 이때 쿼리 시간을 제한하지 않으면, 5분/10분씩 수행되는 쿼리가 운영 환경에서 실행하게 되기도 하는데요. 이런 쿼리가 트래픽에 맞춰 여러개 요청이 온다면 결국 Node에서 사용가능한 Connection Pool이 가득차 더이상 쿼리 질의를 못하거나, 심한 경우 데이터베이스의 장애로 서비스가 사용불가능하게 되기도 합니다. 그래서 적정시간 이상으로 쿼리가 수행되면 강제로 종료하고, 다시 요청하도록 하는것이 일반적인 방식인데요. 해당 상황과 PostgreSQL에서의 옵션에 대해 소개드립니다. 1. 실험 환경 실험의 경우 아래 환경에서 진행합니다. Node 16 PostgreSQL 14 (by Dock.. 2022. 1. 14.

728x90
반응형