데이터가 있으면 UPDATE / 데이터가 없으면 INSERT DB에서 흔히 말하는 upsert 구문을 PostgreSQL에서도 사용해보자. INSERT INTO [TABLE] (COLUMN1, COLUMN2, ...) VALUES (VALUE1, VALUE2, ...) ON CONFLICT ([column_name / ON CONSTRAINT constraint_name/ WHERE predicate]) [DO NOTHING] [DO UPDATE SET column1 = value1, ...] ON CONFLICT column_name : 특정 컬럼명을 기준으로 체크하고, 컬럼을 여러 개 넣을수도 있다. ON CONSTRAINT constraint_name : 테이블 생성할 때 만든 constraint ..
DBMS/PostgreSQL 검색 결과
AWS RDS For PostgreSQL 성능 최적화 사내에서 개발중인 서비스는 PostgreSQL DB를 사용중이다. 아직 베타를 출시한 것은 아니지만 쿼리 하나 날리는데 20초가 걸리는 경우가 있었다. 백엔드 개발자이지만 DB 전문가는 아니라 쿼리를 어떻게 더 튜닝해야할지 몰랐다. 먼저 RDS 인스턴스를 변경해보았다. 1. RDS 인스턴스 db.t3.medium -> db.mg.large 로 변경 기존에 사용하던 DB사양은 위와 같았다. 속도가 느리기도 하고 DB 성능을 높일 때가 된 것 같아 아래와 같은 사양으로 변경하였다. 2. RDS Parameter 변경 RDS -> 데이터베이스 -> 데이터베이스명 -> 구성을 보면 파라미터 그룹이 있다. 그걸 클릭하면 pg_setting에 있던 값들이 나온다..
DB 파티셔닝(Partitioning) 정의 및 예제 배경 회사의 부동산 데이터를 적재하는 과정에서 연도별 데이터가 방대하게 쌓이고 있다. 빅데이터의 수준은 아니지만 추후 10년치 이상의 데이터를 쌓고나서는 용량의 한계와 성능저하를 불러올 수 있을 것이다. 하나의 DBMS에 너무 큰 테이블이 들어오면서 용량 및 성능 측면에서 많은 이슈가 발생할 수 있게 되고, 이런 이슈를 해결하기 위해 혜성처럼 등장한 table을 파티션(partition)이라는 작은 단위로 나누어 관리하는 파티셔닝 기법을 사용해볼 것이다. 파티셔닝 기법을 통해 소프트웨어적으로 데이터베이스를 분산처리하여 성능 저하를 방지하고, 관리를 수월하게 할 수 있을 것이다. 개념 논리적인 데이터들의 element들을 다수의 entity로 쪼개는 것..
공간 인덱스 활용 업무를 하는데 공간 연산을 하는 일이 많다. 특정 주소와 비교하여 가까운 거리에 있는 주소를 추출한다거나 500m 또는 1km 이내의 주소들을 추출하는 경우이다. 이럴 때에는 거리 계산이 필요하다. 거리계산하는 함수로 st_distance 를 사용하였는데, 이 공감함수는 공간 인덱스를 타지 못한다는 걸 깨달았다. 500m 이내 데이터를 추출하는데 34초 가량 걸려 개선해야될 필요성을 느꼈다. PostgreSQL 인덱스 생성 CREATE INDEX [인덱스명] ON [테이블명] USING btree (컬럼1, 컬럼2..); 인덱스를 생성할 때에는 보통 위와 같이 사용한다. geometry 데이터 타입인 경우에도 위와 같이 생성하면 인덱스를 탈 줄 알았는데, 잘못 알고 있었다. 공간 인덱스..
뷰(View) 테이블 생성 및 제어 뷰(View) 데이터베이스에 존재하는 일종의 가상의 테이블을 의미한다. 실제 테이블의 행과 열을 가지고 있고, 동일한 방식으로 조회할 수 있으나 실제로 데이터를 저장하는 것은 아니다. 뷰(View) 테이블을 조회하는 순간 원본 테이블로 가서 해당 테이블의 데이터를 보여주는 역할만 수행하는 것이다. 즉, 뷰(View)를 사용하게 되면 여러 테이블이나 뷰를 하나의 테이블처럼 볼 수 있어 편리하다. 뷰(View)의 장점 1. 특정 사용자에게 테이블 전체가 아닌 필요한 필드만을 보여줄 수 있어 보안적으로 좋다. 2. 복잡한 쿼리를 단순화하여 사용할 수 있다. 3. 쿼리를 재사용할 수 있다. 4. 뷰(View)가 참조하는 원본 테이블의 데이터가 변경되면 뷰(View)의 데이터도..
특정 문자열 개수 구하기 특정 문자열의 개수를 파악할 때, 오라클에서는 편리한 REGEXP_COUNT 라는 함수가 존재하는데, 안타깝게도 PostgreSQL은 지원하지 않는다. 그렇다고 구할 수 없는 건 아니다. select length('서울특별시 강남구 역삼동 100') - length(replace('서울특별시 강남구 역삼동 100', ' ', '')) -- 3 나의 경우에는 도로명주소를 파악하고자 위와같이 공백이 들어간 갯수를 파악했다. 위 값을 구하면 3이 나온다. 읍면동의 경우에는 위의 쿼리를 사용했을 때, 3이 나오겠지만, 리까지 있는 동네에는 4가 나올 것이다. 3과 4에 따라서 읍면동/도로명 주소를 구할 수 있다.
최근댓글