Programming-[Backend]/Database 13

[TIL][link] DB Connection Pooling, context manager

DB Connection Pool은 여러 클라이언트의 DB 접속 요청을 위해 미리 세션을 만들어놓고 배분하는 것을 뜻한다. 이렇게 미리 만들어 놓지 않으면 DB는 접속 요청이 올 때마다 세션을 생성하는 작업을 반복해야해서 성능에 좋지 않다. 참조 링크 글에서는 connection pool을 설정하지 않거나 설정하고 DB에 연결 요청을 했을 때 소요 시간을 비교한다. SQLAlchemy를 사용하였으며, 아래 코드에서 poolclass=QueuePool 부분이 ConnectionPool 설정을 해주는 부분이다. from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from sqlalchemy.pool import QueueP..

[TIL] DB pagination offset 문제, covering index

문제점 pagination을 하기 위해서 보통 아래와 같은 형식의 쿼리문을 사용한다. select ... from ... where ... limit ... offset limit은 가져올 데이터의 총 개수를, offset은 데이터를 조회할 시작점을 의미한다. 여기서 문제는, 데이터 개수가 많아지면(offset 100만건 이상?) offset 위치를 찾는 것을 마치 연결 리스트처럼 처음부터 쭉 이어나가다가 DB에 부하가 크게 걸릴 수 있다. 해결방법 where절에 조건을 건다. 특정값 이상의 id를 갖는 row만 조회한다던가, 날짜-연도 등을 기준으로 특정일 이후부터만 조회하도록하여 데이터의 개수 자체를 줄여서offset에 드는 부하를 줄여준다. covering index를 갖는 subquery를 실행하..

[TIL] insert시 ForeignKey에 제한 걸기: DB Trigger 사용

Django - python - postgresql을 이용하여 작업을 진행하던 중, 발생했던 문제점을 해결한 기록이다. 문제상황 아래처럼 새로운 테이블(모델)을 생성하고자 했다. class IWantNewModel: old_model = ForeignKey( "models.OldModel", on_delete=CASCADE, ... ) 이 때, FK가 되는 old_model의 타입을 특정 타입이 되도록 제한하고 싶었다. DB 자체에서 제한을 걸면 나중에 서비스단 로직에서 굳이 validation을 복잡하게 할 필요가 없기 때문이다. 한층 더 추상화되는 점은 있다만, 그래도 편리할 수 있다. Django에서는 이런 경우(FK가 아닌 경우에는) CheckConstraint 조건을 주어서 DB에서 제한을 걸도..

[TIL] 😎 MYSQL 필드 최대 길이 정의 varchar 255 vs 191

varchar 255 이유 MYSQL에서 필드의 최대 길이를 정의할 때 varchar(255)로 지정하는게 일반적이였다. 이것은 참조 링크에 따르면 MYSQL에서 메모리 용량을 8비트(256)에 맞추고 오래된 database와 호환하기 위해서 등이였다고 한다. 그리고 MYSQL에서 varchar로 된 필드를 indexing하기 위한 최대 용량을 767 byte로 잡아놨었다. 이것은 utf-8 기준이였고 767/3 = 255.666...이 되기 때문에 varchar 255로 정의하는게 관례였다. 3으로 나누는 이유는 utf-8 기준으로 모든 글자들이 3바이트에 포함되었기 때문이었다. varchar 191 이유 그러다가 이모지 🚀까지 포함하는 utf8mb4 collation 규칙이 적용되면서 한 글자에 4바..

[TIL] 여러 where 조건 한번에 조회하기. multi column related id query join

상황 base_table에 a, b컬럼이 FK로 잡혀있고, 중복된 항을 count로 구한 결과가 아래와 같을 때 다시 base_table에서 a_id, b_id를 갖는 id 값을 조회할려면 어떻게 해야할까? 다시 말해 (a_id, b_id) = (9002, 3145), ...인 Row들의 각 id 값을 구하고 싶은 경우 어떻게 해야할까 해결 방법 with 구문(또는 서브쿼리)로 원래 SQL문을 감싸고, 기존 테이블과 join을 하되 on절에 원하는 조건을 기입하면 된다. with tmp as (select count(id), a_id, b_id from base_table bt where 1 = 1 and deleted is null group by a_id, b_id having count(id) > ..

[Oracle] Oracle Xe 다운로드 및 설치, 기본 계정 설정, sql plus, IntelliJ 연결하기(IO Error : The Network Adaptor ...)

1. Oracle 데이터베이스 Oracle은 여러 종류의 관계형 데이터베이스 관리 시스템(RDBMS) 중 하나이다. 구매 및 유지 보수 비용이 크지만 그만큼 확실한 안정성과 유지보수를 보장받을 수 있기 때문에 대기업이나 공공기관에서 많이 사용한다. 데이터베이스 관리 시스템(DBMS)들은 SQL 표준을 준수하기 때문에 어떤 DBMS 사용하더라도 큰 문제는 없으나, DBMS 별로 기능이나 문법이 조금씩 달라서 가장 널리 쓰이는 Oracle DBMS를 사용하는 것이 처음 학습에 좋다. Oracle XE 버전 개요 Oracle XE(Oracle Express Edition) 버전은 공개 소프트웨어로 4GB의 메모리와 4GB의 데이터 파일까지 무료로 사용할 수 있다. 2. 다운로드 및 설치 아래 링크에 들어가서 ..

[TIL][링크] yyyyMMddhh24miss, MSSQL CONVERT 변환 코드 표

yyyyMMddhh24miss 은 Oracle에서 사용하는 날짜/시간 타입이다. 20220216175803 (2022-02-16 17:58:03) 형식으로 저장된다. 사외 시스템과 api를 연동하는 문서에 해당 단어가 적혀있어서 찾아보게 되었다. SQL dialect별 해당 포맷으로 날짜값을 추출하는 식은 아래와 같다. (참조1) MSSQL SELECT CONVERT(CHAR(8), GETDATE(), 112) + REPLACE(CONVERT(CHAR(8), GETDATE(), 108), ':', '') Oracle SELECT TO_CHAR(SYSDATE, 'yyyymmddhh24miss') FROM DUAL MSSQL 날짜 변환표 - 참조 2 번호 쿼리 결과 코드 0 CONVERT(CHAR(19), ..

[TIL][PostgreSQL][에러] : connection to server at "localhost" (127.0.0.1), port 5432 failed: Connection refused (0x0000274D/10061) Is the server running on that host and accepting TCP/IP connections?

에러 해결 -참조1 윈도우의 경우, 작업 관리자에서 postgreSQL service가 실행되고 있는지 확인한다. 실행되지 않고 있다면 우클릭 해서 "시작" 하면 된다. 해결2 postgreSQL 설치 파일 내부에 postmanager.pid 파일이 postgreSQL을 종료했음에도 남아있다면, 삭제하면 된다. 참조1 https://stackoverflow.com/questions/40532399/unable-to-connect-to-server-for-postgres

[TIL] MSSQL 날짜값 지정, CONVERT, DATEPART(DATE_FORMAT), GROUP BY alias

1. SQL 구문 날짜값이 포함된 MSSQL 쿼리문을 작성한다. 1 2 3 4 5 6 7 SELECT A1, CONVERT(varchar(10), a.updated_at, 20) AS date, CONVERT(varchar(10), DATEPART(dw, a.updated_at)) AS dayOfWeek FROM absolute AS a JOIN .... ON .... WHERE ..... GROUP BY CONVERT(varchar(10), a.updated_at, 20), DATEPART(dw, a.updated_at) ORDER BY CONVERT(varchar(10), a.updated_at, 20); Colored by Color Scripter cs 2. CONVERT(포맷(길이), 날짜값, ..