오라클/튜닝 10

점이력, 선분이력

이력 관리란 ? 모든 업무는 언제 시작해서 언제 끝났는지에 관한 정보가 기록되어 있다. 예를 들면 배송 상태에 따른 이력이 있는데, 배송 시작, 배송 중, 배송 완료 등 각각의 상태에 따라 이력이 관리된다. 이러한 이력을 기록하고 관리하는 것이 이력 관리이다. 이력 관리 대상 이러한 이력 관리는 관리하지 않을 때와 비교했을 때 많은 비용이 들어간다. 따라서 이력 관리가 필요한 데이터는 어떤 것인지 잘 판단하는 것이 중요하다. 관리해야할 데이터가 다음 5가지의 조건에 맞는지 확인하자. 변경 내역을 감시할 필요가 있는가? 시간의 경과에 따라 데이터가 변할 수 있는가? 시간의 경과에 따라 관계가 변하는가? 과거의 데이터를 조회할 필요가 있는가? 과거 버전을 보관할 필요가 있는가? 점 이력(시점 이력)과 선분 ..

오라클/튜닝 2023.04.16

NL 조인 튜닝 예시

테스트 데이터 환경 아래 스크립트 참조 * 튜닝 포인트 : SQL수정 or 인덱스 변경가능 OLTP에 최적화 T_고객23 - 총건수 : 2만건 - 고객성향코드 = '920' : 101건 - 고객성향코드 종류 : 200종류 - 인덱스 : PK_T_고객23 (고객번호) T_주문23 - 총 건수: 200만건 - 아래 조건의 결과 : 10,000건 O.주문일자 LIKE '201701%' AND O.상품코드 = 'P103' - 인덱스 : PK_T_주문23 (주문번호) */ DROP TABLE test.T_cust_KM; CREATE TABLE test.T_cust_KM (custno VARCHAR2(7), custname VARCHAR2(50), custcode VARCHAR2(3), C1 VARCHAR2(30)..

오라클/튜닝 2023.02.21

테이블 random 액세스 쿼리 튜닝 예시

테스트 데이터 환경 아래 스크립트 참조 인덱스 : 주문지역코드, 주문일자, 주문금액 * 튜닝 포인트 : 인덱스 수정 불가 하며 SQL은 수정 가능 * 전체데이터 : 1,000만건 * 주문일자 : 2019.05.24 - 2019.08.31 (100일) 1일당 10만건 * 주문지역코드 : 1, 2, 3, 4, 5 (고르게 분포) * 주문금액 : 1만원 - 100만원 (고르게 분포) ALTER SESSION SET WORKAREA_SIZE_POLICY = MANUAL; ALTER SESSION SET SORT_AREA_SIZE = 2000000000; drop table test.t_order_km; --테이블생성 create table test.t_order_km AS SELECT A.custno, orde..

오라클/튜닝 2023.02.13

6장. DML 튜닝

6.3 파티션을 활용한 DML 튜닝 테이블 파티션 오라클 파티션테이블은 하나의 큰 테이블을 물리적으로 나눠놓은 것입니다. 물리적으로 나눴지만 논리적으로는 하나의 테이블로 간주됩니다. 왼쪽 그림처럼 Sales 테이블에 1월데이터부터 5월데이터까지 하나의 통테이블에 몰아서 넣을수 있습니다. 하지만, 파티션테이블을 사용하게되면 오른쪽 그림처럼 월마다 다른 세그먼트에 Sales 데이터를 나눠서 넣을 수 있습니다. 이렇게 나눠서 넣어놔도 사용자는 1월~5월치 데이터가 마치 하나의 Sales 테이블에 들어있는 것처럼 사용할 수 있습니다. Range Partition Range Partition 은 범위로 구분되는 파티션 테이블, 범위(Range)에는 숫자, 날짜, 문자가 모두 가능 참조 : https://jack-..

오라클/튜닝 2022.06.26

3장. 인덱스 튜닝

3.1 테이블 액세스 최소화 DBA(데이터파일번호 + 블록번호)는 디스크 상에서 블록을 찾기 위한 주소I/O 성능을 높이려면 버퍼캐시를 활용해야한다. 블록을 읽을 때는 디스크로 가기 전에 버퍼캐시부터 찾아본다. 읽고자 하는 DBA를 해시 함수에 입력해서 해시 체인을 찾고 거기서 버퍼 헤더를 찾는다 캐시에 적재할 때와 읽을 때 같은 해시 함수를 사용하므로 버퍼 헤더는 항상 같은 해시 체인에 연결됨 반면, 실제 데이터가 담긴 버퍼 블록은 매번 다른 위치에 캐싱되는데 그 메모리 주소값을 버퍼 헤더가 가지고 있음 해싱 알고리즘으로 버퍼 헤더를 찾고 거기서 얻은 포인터로 버퍼 블록을 찾아감. 인덱스로 테이블 블록을 액세스할 때는 리프 블록에서 읽은 ROWID를 분해해서 DBA 정보를 얻고 테이블을 Full Sca..

오라클/튜닝 2022.06.19

2장. 인덱스 기본

2.1 인덱스 구조 및 탐색 테이블에서 데이터를 찾는 두 가지 방법 1. 테이블 전체 스캔 2. 인덱스 이용 인덱스 튜닝의 두가지 핵심요소 1. 인덱스 스캔과정에서의 비효율 줄이기(인덱스 스캔 효율화, 소량만 스캔) 2. 테이블 액세스 횟수 줄이기(랜덤 액세스 최소화) 랜덤 액세스 최소화 > 인덱스 스캔 효율화 인덱스 구조(B+Tree) - 인덱스는 대용량 테이블에서 필요한 소량의 데이터만 빠르고 효율적으로 액세스 하기 위해서 사용하는 오브젝트이다. - 테이블에서 인덱스 없이 데이터를 검색하려면, 테이블 전체 스캔해야하는데 인덱스 이용시 일부만 스캔하고 멈출 수 있다. - 인덱스를 사용하면 Range Scan이 가능하다. - Root 블록과 Branch 블록의 각 레코드는 하위 블록에 대한 주소 값을 가..

오라클/튜닝 2022.06.18

1장. SQL 처리 과정과 I/O

1.1 SQL파싱과 최적화 SQL을 실행 전, 아래와 같은 최적화 과정을 수행한다. 1) SQL 파싱 SQL Parser가 파싱을 진행하는 단계 SQL문을 이루는 개별 구성요소를 분석해서 파싱 트리를 생성하고, 문법적 오류가 없는지 확인한다. 의미상 오류가 없는지 확인한다. 2) SQL 최적화 옵티마이저가 활약하는 단계 미리 수집한 통계정보를 바탕으로 다양한 실행경로를 생성 및 비교한 후 가장 효율적인 경로를 선택한다. 3) 로우 소스 생성 옵티마이저가 선택한 실행경로를 실행 가능한 코드 형태로 포맷팅 하는 단계 로우 소스 생성기가 그 역할을 맡는다. 옵티마이저가 활약하는 단계에 대해서 요약한다. 1) 사용자로부터 전달 받은 쿼리를 실제로 실행할 실행계획들을 찾아낸다. 2) Data Dictionary ..

오라클/튜닝 2022.06.18