본문 바로가기
  • Round and Round

전체 글26

[SQLP] 3-4. 인덱스 설계 🧷 인덱스 설계🖇️ 인덱스 설계 필요성1. 인덱스 설계의 어려움인덱스를 원하는 만큼 생성할 수 있다면 SQL 튜닝은 간단하지만, 인덱스가 많아질수록 부작용이 발생한다.DML 성능 저하신규 데이터 입력 / 삭제 시 모든 인덱스를 갱신해야 하므로 부하 증가.특히 인덱스는 정렬 상태를 유지해야 해 수직적 탐색이 발생찾은 블록에 여유 공간이 없으면 인덱스 분할(Index Split)이 발생TPS(Transactions Per Second, 시스템이 처리하는 트랜잭션 수) 저하 → 응답시간 증가디스크 공간 낭비인덱스가 늘어나면 DB 사이즈가 불필요하게 커진다.데이터베이스 운영 비용 증가백업, 복제, 재구성 등 관리 부담이 커진다.2. 개발 단계에서 인덱스 설계의 중요성인덱스 개수를 최소화하려면 기존 인덱스 구.. 2025. 9. 24.
[SQLP] 3-3. 인덱스 스캔 효율화 🧷 인덱스 스캔 효율화IOT, 클러스터, 파티션은 테이블 랜덤 액세스를 크게 줄이는 강력한 저장 구조지만, 운영에 적용하려면 충분한 성능 검증이 필요하다. 이 때문에 시스템 개발 단계에서의 물리 설계가 매우 중요하다.운영 환경에서 가장 일반적이고 단순하게 적용할 수 있는 튜닝기법은 인덱스 컬럼 추가 다. 랜덤 액세스를 줄이는 효과는 매우 크지만 방식은 매우 단순하다고 생각할 수 있다. 반면, 인덱스 스캔 효율화는 고려해야 할 튜닝 요소가 매우 다양한다. 인덱스 설계의 핵심 원리 또한 인덱스 스캔 효율화를 기반으로 한다. 🖇️ 인덱스 스캔 원리인덱스 스캔 효율화를 이해하려면, 수직 탐색과 수평 탐색 과정을 알아야 할 필요가 있다.수직적 탐색 : 루트 → 브랜치 → 리프 블록까지 내려가며, 스캔 시작점을.. 2025. 9. 23.
[SQLP] 3-2. 부분 범위 처리 🧷 부분 범위 처리부분범위 처리는 테이블 랜덤 액세스로 인한 인덱스 손익 분기점의 한계를 극복할 수 있는 방법이다. 인덱스로 접근할 레코드가 많아도, 일부만 빠르게 응답해 OLTP 환경에서 특히 효과적이다. 🖇️ 부분 범위 처리 원리부분범위 처리는 전체 데이터를 한 번에 읽지 않고, 필요한 만큼 나누어 전송하는 방식이다. 이 덕분에 데이터가 아무리 많아도 앞쪽 일부를 빠르게 응답할 수 있다. OLTP 환경에서 대용량 데이터를 다를 때 매우 중요한 원리이다. ✔️ 동작 방식DBMS는 결과 집합을 Array Size 단위로 잘라 클라이언트에 전송한다.전송 후 서버 프로세스는 멈추고 대기하다가, 클라이언트에서 Fetch Call을 보내면 그다음 데이터를 전송한다.1억 건 이상의 대용량 테이블이라도 처음 일.. 2025. 9. 22.
[SQLP] 3-1. 테이블 액세스 최소화 🧷 테이블 액세스 최소화🖇️ 테이블 랜덤 액세스SQL 튜닝은 랜덤 I/O 최소화가 핵심이다. DBMS 기능, JOIN 메서드, 다양한 튜닝 기법도 모두 랜덤 I/O 최소화에 초점을 맞춘다.1. ROWID 와 테이블 액세스인덱스를 스캔하는 이유는1) 조건에 맞는 소량 데이터를 빠르게 찾기 위해서,2) 테이블 레코드 위치를 찾기 위한 ROWID를 얻기 위해서다.인덱스가 SQL에서 참조하는 모든 컬럼을 포함하지 않으면, 인덱스 스캔 후 반드시 테이블 액세스가 발생한다. 실행계획에서 TABLE ACCESS BY INDEX ROWID 는 테이블 액세스가 이루어졌음을 의미한다. ✔️ ROWID데이터 블록 주소 + 로우 번호 등 물리적 요소로 구성하지만 실제 성격은 논리적 주소테이블 레코드를 직접 가리키는 포인터.. 2025. 9. 21.
[SQLP] 2-3. 인덱스 스캔 방식 🧷 인덱스 스캔 방식🖇️ Index Range Scan인덱스 루트 블록에서 리프 블록까지 수직적으로 탐색한 후, 리프 블록에서 필요한 범위만 스캔하는 방식 B * Tree 인덱스에서 가장 일반적이고 정상적인 형태의 액세스 방식이다. 인덱스를 수직적으로 탐색한 후 리프 블록에서 필요한 범위만 스캔하는데, 이것은 범위 스캔을 의미한다.  Index Range Scan이 동작하려면 인덱스를 구성하는 선두 컬럼이 WHERE 조건절에 포함되어야 한다. 그렇지 않은 상태에서 힌트를 사용해 인덱스를 강제로 적용하면 Index Full Scan 방식으로 처리될 수 있다. 반대로, 선두 컬럼을 가공하지 않으면 무조건 Index Range Scan이 발생하기 때문에 인덱스를 사용한다고 해서 항상 성능이 좋은 것은 아니.. 2025. 3. 5.
[SQLP] 2-2. 인덱스 활용 🧷 인덱스 활용데이터베이스 성능 최적화를 위해 인덱스를 활용하는 것은 매우 중요하다. 하지만 인덱스를 어떻게 활용하느냐에 따라 실제 성능 향상 효과가 달라진다.🖇️ 인덱스 스캔 방식인덱스는 정렬되어 있기 때문에, 리프(Leaf) 블록에서 스캔 시작점부터 더 이상 데이터가 없는 지점까지 중간에 스캔을 중단할 수 있다. 이러한 경우를 Index Range Scan이라고 하며, 이는 스캔 시작점과 종료점을 명확히 파악하여 필요한 부분만 읽어 들임을 의미한다. 반면, 인덱스 전체를 순차적으로 스캔하는 경우를 Index Full Scan이라고 한다.(1) Index Range ScanSELECT EMPNOFROM EMPWHERE NAME LIKE 'ABD%'Leaf 블록[ABC] [ABE] [ABF] .. 2025. 2. 23.
[SQLP] 2-1. 인덱스 구조 🧷 인덱스 구조🖇️ 인덱스 튜닝온라인 트랜잭션 처리(OLTP) 시스템에서는 소량의 데이터를 빠르게 검색하는 것이 중요하다. 따라서 대규모 테이블에서 소량의 데이터를 효율적으로 검색할 수 있도록 인덱스를 최적화하는 튜닝이 필수적이다. 인덱스 스캔 과정에서 성능을 결정하는 요소는 여러 가지가 있지만, 핵심적으로 고려해야 할 두 가지 요소는 다음과 같다. ✔️ 핵심 요소인덱스 스캔 효율화 튜닝인덱스 스캔 과정에서 불필요한 연산을 최소화하는 것이 중요하다.인덱스 정렬 방식과 접근 방식을 최적화하여 스캔 횟수를 줄이는 것이 핵심이다.랜덤 액세스 최소화 튜닝인덱스 스캔 후 테이블 데이터를 가져올 때 랜덤 I/O를 최소화해야 한다.테이블 접근 횟수를 줄이면 디스크 I/O 부담을 줄일 수 있어 성능 향상에 직접적인.. 2025. 2. 22.
[SQLP] 1-5. I/O 메커니즘 🧷 I/O 메커니즘🖇️ 블록 단위 I/O오라클을 비롯한 대부분의 DBMS에서 I/O는 블록(Block) 단위로 수행된다. 이는 특정 레코드를 읽거나 쓰기 위해 해당 레코드가 포함된 블록 전체를 읽고 써야 함을 의미한다. 오라클의 기본 블록 크기는 8KB이며, 단 1바이트를 읽더라도 최소 8KB를 읽어야 한다. 이 원칙은 테이블뿐만 아니라 인덱스에서도 동일하게 적용된다. 예를 들어, 다음 두 개의 SQL 문을 비교해 보자.SELECT COL FROM TBL WHERE NUM > 100;SELECT * FROM TBL WHERE NUM > 100; 두 쿼리가 동일한 실행 계획을 사용한다면, 서버에서 발생하는 I/O 작업량은 동일하다. 특정 레코드 하나만 읽더라도 해당 레코드가 포함된 블록 전체를 읽어야 .. 2025. 2. 11.
[SQLP] 1-4. 라이브러리 캐시 최적화 🧷 라이브러리 캐시 최적화🖇️ 바인드 변수1. SQL 공유 및 재사용 단점사용자 정의 함수/ 프로시저, 트리거, 패키지 등 의 경우 이러한 오브젝트들은 Stored Object로 분류되며, 생성 시 고유한 이름을 갖는다. 생성과 동시에 컴파일된 상태로 데이터 딕셔너리에 저장되며, 사용자가 삭제하지 않는 한 영구적으로 보관된다. 실행 시에는 라이브러리 캐시에 적재되어 여러 사용자가 공유하며 재사용할 수 있다.SQL의 경우 SQL은 Transient Object로 분류되며, 고유한 이름이 없고 SQL 텍스트 자체가 이름 역할을 한다. 데이터 딕셔너리에 저장되지 않고, 처음 실행 시 최적화 과정을 거쳐 동적으로 생성된 내부 프로시저가 라이브러리 캐시에 적재된다. 이를 통해 여러 사용자가 동일한 SQL을 공.. 2025. 2. 9.
[SQLP] 1-3. SQL 공유 및 재사용 🧷 SQL 공유 및 재사용🖇️ 소프트 파싱 VS 하드 파싱SGA(System Global Area)는 서버 프로세스와 백그라운드 프로세스가 공통적으로 액세스 하는 데이터와 제어구조를 캐싱하는 메모리 공간이다. SGA 구성요소 중에 SQL파싱, 최적화, 로우 소스 생성 과정을 거쳐 생성한 내부 프로시저를 반복 재사용할 수 있도록 캐싱해 두는 공간을  라이브러리 캐시(Library Cache) 이라고 한다.  소프트 파싱(Soft Parsing) : SQL 파싱 후 라이브러리 캐시에 해당 SQL이 존재하면 바로 실행한다.하드 파싱(Hard Parsing) : 라이브러리 캐시에 SQL이 존재하지 않으면 최적화 및 로우 생성 과정을 거친다.하드 파싱이 느린 이유   하드 파싱(Hard Parsing)은 옵티.. 2025. 2. 9.
[SQLP] 1-2. SQL 파싱과 최적화 🧷 SQL 파싱과 최적화🖇️ SQL 이란?SQL : Structured Query Language SQL은 데이터베이스에서 데이터를 질의, 조작, 정의, 제어하기 위한 구조적(Structured)이고 집합적(Set-Based)이며 선언적(Declarative)인 언어이다. 오라클 PL/SQL, SQL Server T-SQL처럼 절차적(Procedural) 프로그래밍 기능을 제공하는 확장 언어도 있지만, SQL은 집합 기반의 결과를 얻기 위한 선언적 언어이다. 사용자는 SQL을 통해 원하는 데이터 결과를 선언하지만, 그 결과 집합을 만드는 과정은 절차적일 수밖에 없다. 이러한 과정을 처리하는 DBMS 내부 엔진이 바로 SQL 옵티마이저(Optimizer)이며, 사용자가 작성한 SQL을 효율적으로 처리할.. 2025. 2. 9.
[SQLP] 1-1. Oracle 아키텍처 🧷 Oracle 아키텍처Oracle 은 데이터베이스와 이를 액세스 하는 프로세스 사이에 SGA(System Global Area)라고 하는 공유 메모리 캐시 영역을 두어 구성된다.데이터베이스(Database) : 디스크에 저장된 데이터 집합으로, 주요 파일로는 데이터 파일(Datafile), Redo Log 파일, Control 파일이 포함된다.인스턴스(Instance) : SGA (공유 메모리 영역)와 이를 액세스 하는 프로세스 집합으로 구성된다.기본적으로 Oracle에서는 하나의 데이터베이스에 대해 하나의 인스턴스가 접근하지만, RAC(Real Application Cluster) 환경에서는 하나의 데이터베이스를 여러 개의 인스턴스가 동시에 액세스 할 수 있다. ✅ RAC (Real Applicat.. 2025. 2. 9.