본문 바로가기
728x90

DataBase14

[친절한 SQL 튜닝/4장] 4.1 NL 조인 [출처: 친절한 SQL 튜닝, 저자 조시형] 1. 기본 메커니즘NL 조인 → Nested Loop, 중첩 루프 조인일반적으로 Outer와 Inner 양쪽 테이블 모두 인덱스 사용, Outer 쪽은 사이즈가 크지 않으면 사용 X→ TFS를 하더라도 한 번에 그치기 때문→ Inner의 경우는 인덱스를 사용, 사용하지 않을 시 Outer에서 읽은 건수만큼 TFS 반복그렇기에 결국 NL 조인은 인덱스를 이용한 조인 방식이라고 할 수 있음소트 머지 조인과 해시 조인도 기본적인 조인 프로세싱은 동일함2. NL 조인 실행 계획 제어select /*+ ordered use_nl(c) */ e.사원명, c.고객명, c.전화번호from 사원 e, 고객 cwhere e.입사일자 >= '19960101'and c.관리사원번호.. 2025. 9. 10.
[DB] RDB와 NoSQL 1. 관계형 데이터베이스(RDB)1 - 1. 개념RDB(Relational Database)는 데이터를 테이블에 저장하고 데이터의 관계를 통해 데이터를 관리하는 DB이다.테이블은 고정된 행(row)과 열(column) 구조SQL을 사용하여 데이터의 CRUD, 조인 등을 수행한다.1 - 2. 특징정형 데이터: 스키마가 미리 정의되어 있기에 데이터의 일관성이 높다.관계 기반트랜잭션 지원: ACID 속성을 보장하여 데이터 무결성을 유지 가능하다.SQL 사용수직 확장(Scale -Up)에 적합1 - 3. 사용 환경높은 데이터 무결성과 일관성이 중요한 환경 → 금융 거래, 결제 시스템처럼 데이터 정확성이 필수인 경우OLTP 환경 → 짧고 빈번한 트랜잭션 처리에 최적화정형 데이터 중심의 복잡한 질의 환경 → JOI.. 2025. 8. 14.
[친절한 SQL 튜닝/3장] 3.4 인덱스 설계 [출처: 친절한 SQL 튜닝, 저자 조시형] 1. 인덱스 설계가 어려운 이유인덱스가 많으면 구체적으로 다음과 같은 문제가 발생한다.- DML 성능 저하 ( → TPS( = 초당 트랜잭션 수) 저하) - DB 사이즈 증가 (→ 디스크 공간 낭비)- DB 관리 및 운영 비용 상승정렬 상태 특징으로 인해 인덱스 삽입 시 찾은 블록에 여유 공간이 없는 경우 인덱스 분할도 발생*인덱스 분할(Index Split): 신규 값을 입력할 리프 블록에 공간이 꽉 차있으면 새로운 블록을 사이에 끼워 넣고(양방향 연결 리스트 구조) 기존 블록의 뒤쪽 절반을 다음 블록으로 옮김인덱스 설계는 시스템 전체 시각에서 종합적, 전략적으로 접근해야 함인덱스 추가는 시스템 부하/인덱스 변경은 운영 리스크가 큼2. 가장 중요한 두 가지 .. 2025. 8. 11.
[친절한 SQL 튜닝/3장] 3.3 인덱스 스캔 효율화 [출처: 친절한 SQL 튜닝, 저자 조시형] 1. 인덱스 탐색/*조건 1*/WHERE C1 = 'B'-> ANSWER: 수직 탐색: Leaf2, (B, 1) / 수평 탐색: Leaf3 (C, 1)에서 스캔 종료/*조건 2*/WHERE C1 = 'B'AND C2 = 3-> ANSWER: 수직 탐색: Leaf2, (B, 3) / 수평 탐색: Leaf3 (C, 1)에서 스캔 종료/*조건 3*/WHERE C1 = 'B'AND C2 >= 3-> ANSWER: 수직 탐색: Leaf2, (B, 3)/수평 탐색: Leaf3 (C, 1)에서 스캔 종료/*조건 4*/WHERE C1 = 'B'AND C2 ANSWER: 수직 탐색: Leaf2, (B, 1) / 수평 탐색: Leaf3 (B, 4)에서 스캔 종료/*조건 5*/.. 2025. 8. 1.
[친절한 SQL 튜닝/3장] 3.2 부분범위 처리 활용 [출처: 친절한 SQL 튜닝, 저자 조시형] 1. 부분범위 처리 부분 범위 처리: 전체 쿼리 결과집합을 사용자로부터 Fetch Call이 있을 때마다 일정량씩 부분 전송하는 것미전송 분량이 있더라도 서버 프로세스는 클라이언트로부터 추가 Fetch call을 받기 전까지 그대로 멈춰 서서 대기데이터 전송 후 서버 프로세스는 대기 큐에서 wait -> ready, 다음 Fetch Call 시 대기 큐에서 나와 데이터 전송먼저 읽는 데이터부터 일정량을 전송하고 멈추기에 결과를 빨리 출력 가능private void execute(Connection con) throws IOException { Statement stmt = con.createStatement(); ResultSet rs = stmt.exec.. 2025. 7. 29.
[친절한 SQL 튜닝/3장] 3.1 테이블 액세스 최소화 [출처: 친절한 SQL 튜닝, 저자 조시형] 1. 인덱스 ROWID를 통한 테이블 액세스인덱스를 스캔하는 이유: ROWID를 얻기 위함인덱스 ROWID는 논리적 주소 정보, 포인터와 달리 테이블 레코드와 물리적으로 연결 X인덱스 탐색은 ROWID가 가리키는 테이블 블록을 버퍼캐시에서 먼저 찾아보고 못 찾으면 디스크에서 버퍼 캐시로 적재한 후 읽음모든 데이터가 캐싱돼 있더라도 테이블 레코드를 찾기 위해 DBA 해싱과 래치 획득 과정 반복하는 고비용 구조2. 인덱스 클러스터링 팩터Clustering Factor(CF): 군집성 계수, 특정 컬럼을 기준으로 같은 값을 갖는 데이터가 서로 밀집된 정도CF가 좋은 컬럼에 생성한 인덱스는 검색 효율이 좋음 → 테이블 액세스량에 비해 블록 I/O 적게 발생(*버퍼 P.. 2025. 7. 28.
[친절한 SQL 튜닝/2장] 2.3 인덱스 확장 기능 사용법 [출처: 친절한 SQL 튜닝, 저자 조시형] 1. Index Range ScanB*Tree의 가장 일반적이고 정상적인 형태의 액세스 방식루트에서 리프블록까지 수직적으로 탐색한 후 필요한 범위만 스캔선두 컬럼을 가공하지 않은 상태라면 무조건 가능, 성능은 스캔 범위, 테이블 액세스 횟수를 얼마나 줄이냐로 결정 2. Index Full Scan수직적 탐색 없이 리프 블록을 처음부터 끝까지 수평적으로 탐색데이터 검색을 위한 최적의 인덱스가 없을 때 차선으로 선택 선두 커럶이조건에 없으면 옵티마이저는 먼저 Table Full Scan 고려 테이블(모든 값 저장)보다는 인덱스(Key, ROWID만 저장)가 저장 공간이 더 작음인덱스 스캔 단계에서 대부분 레코드를 필터링하고 일부만 테이블을 액세스 한다면 인덱스 스.. 2025. 7. 22.
[친절한 SQL 튜닝/2장] 2.2 인덱스 기본 사용법 [출처: 친절한 SQL 튜닝, 저자 조시형] 1. 인덱스 사용의 의미인덱스 컬럼(정확히는 '선두 컬럼')을 가공하지 않아야 인덱스를 정상적으로 사용 가능정상적 사용 → 리프 블록에서 스캔 시작점을 찾아 스캔하다가 중간에 멈추는 것(Index Range Scan)을 의미 인덱스 컬럼 가공 시 스캔 시작점을 찾을 수 없고 멈출 수도 없어 Index Full Scan 방식으로 작동EX) 생년월일 컬럼에서 생월로만 탐색, 가공하지 않은 주문 수량에서 NVL 조건 탐색, LIKE 포함 검색OR 조건 시에도 시작지점 탐색 불가(Full Scan), OR Expansion 통해 Range Scan 사용 가능/*OR EXPANSION1: 명시적 UNION ALL*/SELECT *FROM TABLE1WHERE COL1 .. 2025. 7. 22.
[친절한 SQL 튜닝/2장] 2.1 인덱스 구조 및 탐색 [출처: 친절한 SQL 튜닝, 저자 조시형] 1. 인덱스 튜닝의 두 가지 핵심 요소인덱스 스캔 효율화 튜닝랜덤 액세스(특정 블록에 필요 순간에 임의 접근) 최소화 튜닝성능에 미치는 영향은 랜덤 액세스 최소화 튜닝이 더 큼(랜덤 I/O가 느림) 시퀀셜(Sequential)랜덤(Random)속도매우 빠름느림I/O 크기큰 청크 단위(스트리밍)작은 단위(블록/페이지)CPU 오버헤드낮음높음(I/O 호출, 컨텍스트 스위치 증가) 2. 인덱스 구조인덱스: 대용량 테이블에서 필요한 데이터만 빠르게 효율적으로 액세스 하기 위해 사용하는 오브젝트DBMS는 일반적으로 B*트리 인덱스 사용, 범위 스캔 가능인덱스 탐색 과정: 수직적 탐색(인덱스 스캔 시작 지점 탐색) / 수평적 탐색(데이터 탐색) 과정으로 나눌 수 있음수직적.. 2025. 7. 22.
728x90