본문 바로가기

PostgreSQL

[PostgreSQL] 텍스트 검색 최적화: phraseto_tsquery - 컴도리돌이 이번에 검색 기능을 최적화해야 하는 쿼리가 있었습니다. 검색 시스템의 성능은 사용자 경험에 크게 영향을 미치기 때문에, 빠르게 정확한 검색 결과를 제공하는 것이 매우 중요하죠. 처음에 유저가 검색한 데이터를 보여주기 위해서, PostgreSQL의 LIKE 연산자를 사용하여 텍스트 검색을 처리하곤 했습니다. 그러나 데이터가 많이 지면서 검색 성능이 눈에 띄게 저하되는 상황이 많이 놓였죠 😓특히, 다중 단어 검색에서는 문제점이 더욱 두드러집니다. 예를 들어, "postgresql performance tuning"과 같은 문구를 검색할 때, LIKE 쿼리는 부분 단어 매칭에만 의존해 결과가 너무 광범위하거나 불안전했습니다. 성능도 상당히 떨어지고요. 🤨  그래서 이번에는 단순한 키워드 검색이 아닌, 문장.. 더보기
[PostgreSQL] 제약조건 설정시 주의해야할 부분을 고려하면서(PRIMARY KEY, NOT NULL, UNIQUE, CHECK) - 컴도리돌이 이전 포스팅에서 제약조건을 간단하게 설정하는 방법과 제약조건을 설정할 때 어느 부분을 고려해야 할지 짧게 확인해 보았어요. 이번에는 조금 더 세부적으로 설정하는 방법과 언제 사용하는지에 대해 스터디를 해보려고 해요.   [PostgreSQL] 제약조건에 대해서(PRIMARY KEY, UNIQUE, NOT NULL, CHECK) - 컴도리돌이PostgreSQL에서 제약조건에 대해 글을 남겨보려고 해요. 제약조건은 데이터베이스에서 우리가 입력하는 데이터가 올바르고 일관되도록 도와주는 규칙이라 생각하면 돼요. 예를 들어, 고객의 이메comdolidol-i.tistory.com 적절하게 제약조건을 걸자!제약조건을 설정할 때 적재적소하게 사용하는 게 중요하다고 했죠? 모든 필드에 제약조건을 걸고 싶은 유혹이 있을.. 더보기
[PostgreSQL] 제약조건에 대해서(PRIMARY KEY, UNIQUE, NOT NULL, CHECK) - 컴도리돌이 PostgreSQL에서 제약조건에 대해 글을 남겨보려고 해요. 제약조건은 데이터베이스에서 우리가 입력하는 데이터가 올바르고 일관되도록 도와주는 규칙이라 생각하면 돼요. 예를 들어, 고객의 이메일 주소가 잘못 입력되었을 때 이를 방지할 방법이 없다고 하면 큰일이겠죠? 그래서 제약조건에 대해 아는 것은 매우 중요해요. 그럼 예시 코드를 보면서 자세히 알아보겠습니다 😆CREATE TABLE users ( id SERIAL PRIMARY KEY, username VARCHAR(50) NOT NULL, email VARCHAR(100) UNIQUE NOT NULL, age INT CHECK (age >= 0)); 이 예시에는 users라는 테이블을 생성하였는데, 여기서 주목할 부분은 PRI.. 더보기
[PostgreSQL] 해시 인덱스(Hash Index)에 대해서 - 컴도리돌이 쿼리를 작성하고 나서 실행 계획을 확인하다 보면 가끔 Bitmap Index Scan이나 Hash Join이라는 용어를 접하게 돼요. 해시 인덱스가 사용된 걸 보고는 이제 데이터 조회가 더 빠르겠지?라고 기대했는데, 의외로 성능이 좋지 않을 때가 많더라고요 🤔 그럴 때마다 해시 인덱스를 사용되었는데, 왜 이렇게 느리지?라는 생각만 들곤 했지만, 한 번도 검색해보지 않는 과거의 저를 반성하며 오늘의 나는 해시 인덱스에 대해 깊이 알아가는 시간을 가지려고 해요 😊 해시 인덱스는 PostgreSQL에서 효율적인 데이터 검색을 위해 제공하는 여러 인덱스 유형 중 하나이에요. 이 인덱스는 특정한 키 값에 대해 매우 빠른 조회 성능을 제공하는데, 그 이유는 해시 함수를 사용하여 데이터를 처리하기 때문이죠. 여기.. 더보기
[PostgreSQL] B-tree index에 대해서 - 컴도리돌이 B-treePostgreSQL에서 기본적으로 사용되는 인덱스 구조는 B-tree로 되어 있습니다. B-tree는 데이터베이스에서 빠른 검색 및 정렬된 데이터 액세스를 위해 설계된 효율적인 인덱스 구조입니다. B-tree의 인덱스 행은 페이지로 구성됩니다. 잎 페이지에서는 이러한 행에 데이터를 인덱싱할 키와 테이블 행(TID)에 대한 참조가 포함되며, 내부 페이지에서는 각 행이 인덱스의 자식 페이지를 참조하고 이 페이지의 최소 값을 포함합니다. B-tree의 몇 가지 중요한 특성이 다음과 같이 있습니다. B-tree는 균현이 잡혀 있으며, 각 잎 페이지는 루트로부터 동일한 수의 내부 페이지로 분리됩니다. 따라서 모든 값에 대한 검색은 동일한 시간이 걸립니다.B-tree는 각 페이지(보통 8KB)는 많은(수.. 더보기
[PostgreSQL] 인덱스 온리 스캔(index only scan)에 대해서 - 컴도리돌이 인덱스 온리 스캔(Index Only Scan) 인덱스 온리 스캔(Index Only Scan)은 인덱스 스캔과 유사하지만, 테이블 데이터 대신 인덱스로부터 직접 데이터를 가져옵니다. 따라서 테이블 데이터에 대한 접근이 필요 없으므로, 더 빠른 쿼리 실행 속도를 제공합니다. 인덱스 온리 스캔을 사용한다는 것은 데이터베이스가 쿼리의 결과를 인덱스만으로 만들어내기 때문에 "인덱스만 스캔한다."라고 표현할 수 있습니다. 테이블 예제 테스트를 위해서 테이블은 다음과 같이 작성했습니다. CREATE TABLE books_test ( books_id INTEGER NOT NULL PRIMARY KEY , books_title VARCHAR , books_price INTEGER , books_link VARCHAR.. 더보기
[PostgreSQL] Foreign Key (외래키, 관계 테이블) - 컴도리돌이 외래키는 한 테이블의 열이 다른 테이블의 기본 키(primary key)나 후보 키(candidate key)의 값을 참조하는 데 사용하는 제약 조건입니다. 즉 외래키는 데이터 무결성과 관계의 일관성을 유지하는 데 중요한 역할을 합니다. 데이터 무결성(Data Integrity)을 지키기 위해서는 데이터 무결성 제약조건에 대해 알고 있어야 합니다. 무결성 제약조건이란 데이터베이스의 정확성, 일관성을 보장하기 위해 저장, 삭제, 수정 등을 제약하기 위한 조건을 뜻합니다. PostgreSql에서는 다양한 방법으로 데이터 무결성을 제어할 수 있으며, 일반적으로 사용되는 제약조건 중에 외래 키(FOREIGN KEY) 제약 조건 이 있습니다. 외래 키 (Foreign Keys) 두 테이블 사이의 관계를 선언함으로.. 더보기
[PostgreSQL] 날짜 형식 검증 함수 - 컴도리돌이 페이지에서 데이터를 조회할때 날짜 형식에 맞지 않는 데이터로 인해서 페이지 에러가 발생할 때가 종종 존재합니다. 그럴 때마다 일일히 찾을 수 없기 때문에, 함수를 만들어서 편하게 사용하는 편입니다. 이번 포스팅에서는 보편적으로 사용할 수 있는 날짜 형식 검증 함수를 기록하려고 합니다. 입력받은 문자열 값이 null인 경우 false를 반환시킵니다. 그리고 입력받은 문자열을 date 형식으로 정상적으로 처리되면 true가 발생하게 되고, 만약 예외처리가 발생할 경우 false를 반환하게 될 것입니다. CREATE FUNCTION validation_check_date(str CHARACTER VARYING) RETURNS BOOLEAN AS $$ BEGIN IF str is NULL THEN RETURN .. 더보기