본문 바로가기

Database

(7)
인덱스 기본 사용법 : 연산 최적화(친절한 SQL 튜닝) 인덱스 기본 사용법인덱스 컬럼(선두 컬럼)을 가공하지 않아야 인덱스를 정상적으로 사용할 수 있다.즉, ‘인덱스를 정상적으로 사용한다’ 라는 개념은 리프 블록에서 ‘시작점’ 을 찾아 순차 스캔하며 결과를 찾는 것이다. 인덱스 기본 사용법인덱스 컬럼(선두 컬럼)을 가공하지 않아야 인덱스를 정상적으로 사용할 수 있다.즉, ‘인덱스를 정상적으로 사용한다’ 라는 개념은 리프 블록에서 ‘시작점’ 을 찾아 순차 스캔하며 결과를 찾는 것이다.이것은 결국 B-Tree의 그래프에서 리프 노드를 먼저 찾은 뒤, 인덱스 시작점부터 리프 블록의 일부분만 스캔하는 Range Scan을 의미한다.이는 일반적인 DB의 인덱스 구현은 B+Tree를 기반으로 하므로, 리프 노드에서 시작해 오른쪽 리프 노드로 자연스럽게 넘어가는 범위 탐..
인덱스 구조 및 탐색 : 수직적 탐색 과정과 LMC(친절한 SQL 튜닝) 인덱스 구조 및 탐색 DBMS가 발명된지 수 십년이 지났지만, 사실상 현존하는 SQL의 테이블 스캔 방법은 두 가지다. 1. 테이블 전체를 스캔(Full Scan)2. 인덱스를 사용(Random Access) 이 두 가지 과정에서 당연하게도 인덱스를 사용하는 것이 실제 튜닝을 통해 성능을 개선할 요소가 많다.FS 자체는 그다지 (물리적으로 개선하는 것이 아니라면) 의미가 없을 것이다. 인덱스 튜닝의 핵심 요소 1.  인덱스 스캔 과정에서 발생하는 비효율을 줄이기 (인덱스 스캔 효율 튜닝) 소량 데이터 검색 시에는 인덱스 자체의 튜닝을 줄이는 것이 중요하다.  예시에서는 복합 인덱스의 순서처럼, 중복도가 낮은 순서대로 정렬하는 것의 예시를 들었다.이 경우 테이블 내에서 전체 스캔해야 할 내용은 적어지며, ..
[DB]psql 하드웨어 성능 튜닝 (24.07.10) PostgreSQL을 처음 설치하면 기본 설정으로 작동한다. 하지만 하드웨어 사양에 맞춰 설정을 조정하면 성능을 크게 향상시킬 수 있다.메모리 설정shared_buffers를 늘리면 데이터 캐시가 증가하여 쿼리 성능이 향상된다.work_mem을 조정하면 복잡한 쿼리나 정렬 작업이 빨라진다.CPU 활용max_parallel_workers와 max_worker_processes를 통해 여러 CPU 코어를 효율적으로 사용할 수 있다. 이는 대용량 데이터 처리를 빠르게 해준다.디스크 I/O 최적화effective_io_concurrency를 통해 디스크 작업의 동시성을 최적화하면, 디스크 읽기/쓰기 속도가 향상된다.wal_buffers를 적절히 설정하면 쓰기 작업 성능이 개선된다.이러한 설정 조정을 통해 Pos..
대규모 쿼리 최적화 1차 시도 (IN 방지..) (24.05.21) Trace와 Span 상황효율적 탐색 질의 :Trace와 Span 데이터가 존재. Trace의 PK를 Span이 FK로 가지는 1:N 매핑 관계'다수'의 Trace를 조회하고, 이와 연관된 '다수'의 Span을 매핑하여 가져와야 함.이를 위해 Trace를 IO를 통해 한번 조회하고, 이것의 Id Set을 통해 IN 연산을 사용하여 Span들을 가져오려고 했음.하지만 3번의 경우 대용량 데이터라 상당히 많은 시간이 소요될 것 같음. 이를 극복하기 위해 다음 방법이 유효한지?: '다른 조건'을 통해 Span의 모집단을 먼저 줄이고, 이후 Join이나 In 연산을 사용.ex)Trace id set (1, 2, 3 .. N) Spans in (traceId)를 바로 사용함 (많은 시간) Spans where t..
3주차 - 랜덤I/O, 순차 I/O와 인덱스, B+Tree, B-Tree 질문 1. 랜덤 I/O와 순차 I/O에 대해서 설명해주세요. 랜덤 I/O vs 순차 I/O 랜덤 I/O는 디스크에서 비연속적인 위치에 있는 데이터를 읽는 방식이며, 순차 I/O는 데이터를 연속적인 순서로 읽는 방식이다. - 당연하게도 순차 I/O가 더 빠르다. (디스크 상의 연속적인 위치에 저장) - 데이터베이스 시스템에서는 종종 랜덤 I/O가 필요하다. 데이터베이스에는 다양한 쿼리가 수행되며, 이 쿼리들은 테이블의 여러 위치에 저장된 데이터를 요구하기 때문. 특히 인덱스 검색이나 특정 조건에 맞는 레코드 검색과 같은 작업에서 랜덤 I/O가 필수적이다. - 인덱스 레인지 스캔은 데이터를 읽기 위해 주로 랜덤 I/O를 사용하며, 풀 테이블 스캔은 순차 I/O를 사용한다. 2. 인덱스에 대해서 설명해주세요...
DataBase 2주차 정리 - SQL, DDL, DML, DCL, JOIN, 쿼리 순서 질문 1. SQL에 대해서 설명해주세요. C언어와 같은 프로그래밍 언어와 어떤차이가 있나요? 특정 어휘와 특정 구문을 갖는 프로그래밍 언어의 정의를 고려하면 SQL은 프로그래밍 언어라고 할 수 있다. 그러나 범용 사용이 가능한 GPL(General Purpose Language)보다는 실제로는 DSL(Domain-Specific Language) 에 가깝다. SQL은 데이터베이스 관리 및 데이터 조작을 위해 설계된 특수 목적 언어(Domain-Specific Language, DSL)이다. 이 언어는 데이터를 저장, 검색, 수정, 삭제하는 등의 기능을 제공한다. SQL과 DSL SQL은 프로그래밍 언어의 일반적 정의에 부합한다. 특정 어휘와 구문을 사용하며, 명령을 실행할 수 있기 때문이다. 그러나 일반..
[Elasticsearch] RDBMS에 비해 왜 빠를까? 역인덱싱에 대해 개요 NoSQL의 경우 일반적으로 RDBMS보다 빠르다고 하는데, 구체적으로 왜 그런지 조사해보았다. RDBMS(관계형 데이터베이스 관리 시스템)와 NoSQL(비관계형 데이터베이스)은 데이터를 저장하고 관리하는 방식에서 근본적인 차이가 있다. 아래와 같은 이유로 차이가 발생한다. 구조적 차이 SQL의 주요 초점은 데이터 중복을 줄이는 것. RDBMS의 경우 테이블 형식으로 데이터를 저장하며, 엄격한 스키마를 따른다. 데이터는 행과 열로 구성되며, SQL(Structured Query Language)을 사용하여 데이터를 조작한다. 이를 통해 데이터의 무결성과 일관성, 트랜잭션 등의 규칙을 엄격하게 지킬 수 있다. NoSQL은 반대로 유연하고 빠른 동적 스키마를 제공한다. NoSQL 데이터베이스는 비관계형..