[DB] Key (Index) 는 어떻게 동작하나?
·
DataBase
쿼리에서 Key를 타면 시간 복잡도? 예상 O(1) or O(log N) ✅ 복합키면 시간 복잡도? 위와 그대로 결국 DB도 해시테이블 구조라 해싱 컴퓨팅 비용만 들이고 미리 키만 저장하면 O(1)이 들거라 생각. 복합키면 해싱 비용이 더 들어갈 뿐이지 시간복잡도의 오르내림은 없을것. 틀렸다. 해시 테이블이 아니라 B-Tree의 O(Log N) Example table Full Table Scan 테이블의 전체 row 를 확인하는 것. -- name is not indexed column EXPLAIN ANALYZE SELECT id FROM test.public.users WHERE name='kkk'; 실행 결과 `Seq Scan` 이 이뤄짐을 알 수있다. postgresql 에서의 `Seq Scan..
[PostgreSQL] CHECK Constraint
·
DataBase/PostgreSQL
When to use? 특정 attribute 의 값의 범위를 강제할 때. ex) birth_date DATE CHECK (birth_date > '1900-01-01') age INT CHECK (age between 0 and 100) How to use? 네이밍 컨벤션 __check CREATE TABLE ALTER TABLE 🔗 Reference PostgreSQL CHECK Constraint Summary: in this tutorial, you will learn about the PostgreSQL CHECK constraints and how to use them to constrain values in columns of a table based on a boolean expressio..
[PostgreSQL] Trigger + Transaction
·
DataBase/PostgreSQL
🎯 Goals 트리거 , 트랜잭션 내에서 언제 실행될까? 3가지 타입의 트리거 BEFORE ✅ AFTER (Only handle this in this post) INSTEAD OF 각 트리거 타입에 따라 Default Behavior 가 다르므로 꼭 공식문서를 참조하길 바란다. 이 글에선 `AFTER` 트리거만 다룬다. 아래 SQL문을 보고 실행 결과를 예상해보자. Each statement? vs After all transaction `COMMIT()`? 당연히 나는 후자로 알고있었다, 트랜잭션의 모든 Statement 가 끝난 후에 `COMMIT()` 된 시점에 트리거가 발동할 줄 알았다. 예상한 로그는 다음과 같다. ❌ 틀렸다, 각 문장마다 곧바로 트리거가 실행됐다. 공식 문서 훔쳐보기 Row-..
[PostgreSQL] Transaction + Pool 사용시 주의
·
DataBase/PostgreSQL
pool 객체를 트랜잭션과 함께 쓰지마라. Do not use pool.query if you need transactional integrity: the pool will dispatch every query passed to pool.query on the first available idle client. Transactions within PostgreSQL are scoped to a single client and so dispatching individual queries within a single transaction across multiple, random clients will cause big problems in your app and not work. For more info ..
[DB] Connection Pool
·
DataBase
🎯 Goals connection pool 이 무엇인지 안다. DB 연결 객체의 생성 과정을 안다. 뭐하는 앤데? DB 연결 객체의 캐시풀로, 연결 객체들이 재사용 될 수 있게한다. 왜 쓰는데? DB 커맨드의 성능 향상 👉🏻 앱단에서 DB에 쿼리를 날릴 때에는 반드시 연결 객체가 생성되어야한다. 연결 객체 생성 (연결) - 해제 마다 지연이 발생하는데 동시에 여러 커맨드를 입력할 경우 지연이 누적되어 성능에 악영향을 미친다. 따라서 캐시 풀에 재사용 가능한 연결객체를 미리 생성해 두고 다른 세션에서 이 연결 객체(이미 생성되어있는)를 그대로 재사용 할 수 있게 두는 것이다. 사용 후에는 '반납'한다. 커넥션 풀 미사용 커넥션 풀 사용 연결 객체 생성 - 해제 연결 객체 사용 - 반납 👉🏻 연결 객체 생성..
[PostgreSQL] Function (feat. trigger)
·
DataBase/PostgreSQL
1. 함수 사용 방법 함수 선언 리턴 타입이 `TRIGGER` 일 때 이 때는 반드시 트리거가 파라미터를 넘겼을 때 `TG_ARGV` 로 받아야한다. plpgsql 언어로 함수를 정의하고 리턴타입이 `TRIGGER` 인 경우, 자동으로 다음과 같은 변수가 블록 최상단에 선언된다. NEW 레코드 타입, 새로 `INSERT | UPDATE` 된 로우 DELTE에 대해서는 null 값을 가짐 OLD 레코드 타입, 변경 전 `UPDATE | DELETE` 된 로우 INSERT에 대해서는 null 값을 가짐 TG_ARGV[] text 배열, 파라미터를 받아올 때 이 키워드로 받아와야함. 트리거 함수는 반드시 NULL이나 레코드 타입을 반환해야함. 트리거 트리거 선언 네이밍 컨벤션 함수 fn_ postgreSQL ..