전체 글
-
인덱스 스캔 효율화DataBase/튜닝 2024. 8. 1. 14:14
LOT, 클러스터, 파티션은 랜덤 엑세스 최소화하는 데 매우 효과적인 저장 구조하지만, 이를 적용하려면, 많은 테스트를 진행해야 한다. (시스템 개발 단계에서 물리 설계가 중요한 이유) 1. 인덱스 탐색 인덱스의 탐색은 수직적 탐색, 수평적 탐색으로 나눌 수 있다. 화살표로 찾아간 블록에는 자신의 키 값보다 크거나 같은 값을 갖는 레코드가 저장돼 있다.각 레코드는 하위 노드를 가리키는 블록 주소를 가지고, 하위 노드에는 자신의 키 값보다 크거나 같은 값을 가진 레코드가 저장되어 있다.LMC는 자식 노드 중 가장 왼쪽 끝에 위치한 값을 가리킴 (부모 노드 A 3보다 작거나 같은 값) 1.1 (=)조건 (1) WHERE C1 = 'B' 루트 스캔 과정에서 C1='B'로 내려가는게 아니라, 그 왼쪽부터 ..
-
인덱스 튜닝(2) - 부분범위 처리 활용DataBase/튜닝 2024. 7. 19. 12:16
테이블 랜덤 엑세스로 인한 인덱스 손익분기점의 한계를 극복할 히든카드인 부분범위 처리를 활용해보자 1. 부분범위 DBMS가 클라이언트에게 데이터를 전송할 때도 일정량씩 나누어 전송한다. 서버 프로세스는 클라이언트로부터 추가 Fetch Call을 받기 전까지 그대로 멈춰 서서 기다린다. 데이터를 전송하고 나면 서버 프로세스는 CPU를 OS에 반환하고 대기 큐에서 잠을 잔다. 이처럼 전체 쿼리 결과집합을 쉼 없이 연속적으로 전송하지 않고 사용자로부터 Fetch Call이 있을 때마다 일정량씩 나누어 전송하는 것을 부분범위 처리라고 한다. *데이터 전송단위인 Array Size는 클라이언트 프로그램에서 설정함 -> JAVA에서는 기본값이 10이며, Statement 객체 setFetchSize 메소드를..
-
인덱스 튜닝 (1) - 기본 이론DataBase/튜닝 2024. 7. 18. 21:17
1. 기본 내용 (1) 인덱스 ROWID는 논리적 주소이다. TABLE ACCESS BY INDEX ROWID는 인덱스로 스캔한 후에 테이블을 엑세스하는 과정이다. 인덱스를 스캔하는 이유는 검색 조건을 만족하는 소량의 데이터를 인덱스에서 빨리 찾고 거기서 테이블 레코드를 찾아가기 위한 주소값, ROWID를 얻으려는 데 있다.ROWID가 데이터파일 번호, 오브젝트 번호, 블록 번호 같은 물리적 요소로 구성돼 있기 때문에 물리적 주소로 생각할 수 있지만, 사실은 논리적 주소이다. 프로그래밍 언어에서 포인터는 메모리 주소값을 담는 변수이다. 이를 통해 데이터를 찾아가는데 비용은 0에 가깝다 물리적으로 직접 연결된 구조와 다름없다. 인덱스 ROWID는 포인터가 아니라, 지시봉에 가깝다. 디스크상에서 테이블 레..
-
여러가지 인덱스 스캔 방식DataBase/튜닝 2024. 7. 18. 16:32
1. Index Range Scan Index Range Scan은 B*Tree 인덱스의 가장 일반적이고 정상적인 형태의 엑세스 방식 인덱스의 수직+수평 탐색을 통해 필요한 범위만 스캔한다. 인덱스 Range Scan 하려면 선두 컬럼을 가공하지 않은 상태로 조건절에 사용해야 한다. 2. Index Full Scan Index Full Scan은 수직적 탐색없이 인덱스 리프 블록을 처음부터 끝까지 수평적으로 탐색하는 방식이다.Index Full Scan은 대게 데이터 검색을 위한 최적의 인덱스가 없을 때 차선으로 선택된다. 인덱스 선두 컬럼이 조건절에 없으면, 옵티마이저는 먼저 Table Full Scan을 고려한다. 하지만, 대용량 테이블이어서 Table Full Scan에 부담이 크다면 옵티마이저..
-
인덱스 기본 (2) - 기본 사용법DataBase/튜닝 2024. 7. 17. 21:33
인덱스 기본 사용법은 인덱스 Range Scan 하는 방법을 의미한다. 인덱스 Range Scan을 할 수 없게 되는 이유를 알고 나면, Rnage Scan 하는 방법도 자연스럽게 터득한다. 1. 인덱스를 사용한다는 것 색인이 정렬돼 있더라도, 가공한 값이나 중간값으로는 스캔 시작점을 찾을 수 없다. 색인을 아예 사용할 수 없는 것은 아니나, 가공한 값이나 중간값 색인으로 검색하기 위해선 색인 전체를 스캔해야 한다. 데이터베이스 세계에서도 이는 마찬가지로, 인덱스 칼럼(선두 컬럼)을 가공하지 않아야 인덱스를 정상적으로 사용할 수 있다.인덱스를 정상적으로 사용한다는 것은 리프 블록에서 스캔 시작점을 찾아 거기서부터 스캔하다 중간에 멈추는 것을 의미한다. 즉 리프 블록 일부만 스캔하는 것이 Index Ra..
-
인덱스 기본(1) - 인덱스 구조 및 탐색DataBase/튜닝 2024. 7. 17. 19:56
초등학교에 방문해 홍길동을 찾는 두 가지 방법 1. 1~6학년 모든 교실에서 홍길동 찾기 -> 홍길동이 많을 때 빠름 (테이블 풀)2. 교무실에서 명부 조회해서 홍길동이 있는 교실만 찾기 -> 홍길동이 별로 없으면 빠름 (인덱스) 이름으로 학생을 찾는 경우가 많다면, 학생명부를 아예 이름순으로 정렬해두면 편하다 이것이 인덱스다.이름에 딸린 학년-반-번호 컬럼이 인덱스 ROWID에 해당한다. 수십 년에 걸쳐 DBMS가 발전해 왔지만, 조회 방법은 위 두가지 방법에서 크게 벗어나지 못하고 있다.따라서 SQL 튜닝을 위해 인덱스를 공부하는 것은 매우 중요하다. 1. 인덱스 튜닝의 두 가지 핵심요소 인덱스는 큰 테이블에서 소량 데이터를 검색할 때 사용한다. 인덱스 튜닝의 핵심요소는 크게 두 가지이다...
-
데이터 저장 구조 및 I/O 매커니즘DataBase/튜닝 2024. 7. 17. 19:35
I/O 튜닝이 곧 SQL 튜닝이라고 해도 과언이 아니다! 튜닝의 원리를 제대로 이해하려면, I/O에 대한 이해가 중요할 수 밖에 없다.SQL 튜닝을 본격적으로 시작하기에 앞서 데이터 저장 구조, 디스크 및 메모리에서 데이터를 읽는 메커니즘을 살펴보자 1. SQL이 느린 이유 SQL이 느린 이뉴는 디스크 I/O 때문이다.OS 또는 I/O 서브시스템이 I/O를 처리하는 동안 프로세스가 잠을 자기 때문이다.프로세스는 생성, 종료, 준비, 실행, 대기를 반복하는데, 실행 중인 프로세스는 interrupt에 의해 수시로 실행 준비 상태로 전환했다가 다시 실행 하기를 반복한다. 여러 프로세스가 하나의 CPU를 공유할 수 있지만, 특정 순간에는 하나의 프로세스만 CPU를 사용할 수 있다. 프로세스가 디스크에서 ..
-
옵티마이저 힌트 & SQL 공유와 재사용DataBase/튜닝 2024. 7. 17. 16:35
1. 힌트란 옵티마이저가 대부분 좋은 선택을 하지만, 완벽하진 않다. SQL이 복잡할수록 실수할 가능성도 크다.데이터 또는 업무 특성을 활용해 개발자가 직접 더 효율적인 액세스 경로를 찾아낼 수도 있다.이럴 때 옵티마이저 힌트를 이용해 데이터 엑세스 경로를 바꿀 수 있다.SELECT /*+ INDEX(A.고객_PK) */ 고객명, 연락처, 주소, 가입일시 FROM 고객 A WHERE 고객ID = '00000008'; 힌트의 사용법은 간단하다. 주석 사이에 +기호를 사용하면된다. 힌트의 의미를 다 이해하려면 많은 공부가 필요하다. 사용법은 간단하니 몇가지 주의사항만 지키자 2. 힌트 사용 시 주의사항힌트 안에 인자를 나열할 땐 ,(콤마)를 사용할 수 있지만, 힌트와 힌트 사이에 사용하면 안된다.테이블을 지..