본문 바로가기

SQL/친절한 sql 튜닝

[8주차] 번호 매기기

6.4.3 채번 방식에 따른 insert 성능 비교

채번: 번호를 새로 부여하다

 

insert, update, delete, merge 중에서

튜닝 요소가 많은 것은 insert이다

 

신규 데이터를 입력하려면, pk 중복 방지를 위한 번호를 새로 매기는 것이 선행되어야 한다.

 

가장 많이 사용 되는 번호 매기기 방식의 성능과 장단점을 비교한다.

 

pk : primary 키. 테이블에 하나만 생성한다. unique, not null이다

 

복합 컬럼: pk가 상담원id+상담일자+번호매기기 => 컬럼이 여러개 => 복합 컬럼

구분 속성: 번호매기기 이외의 컬럼: 상담원id+상담일자

 

 

채번 테이블
시퀀스 테이블

 

max+1

 

 

 

 

 

 

 

 

 

 

 

1) 테이블이라서 row Lock 발생

2) 시퀀스 자체를 새로 만들기때문에 시퀀스 경합 발생

3) MAX+1 은 테이블에서 값을 읽고 insert하니까 row Lock 발생

 

인덱스 블록 경합?

아래에서 많이 나옴... 오른쪽으로 데이터를 쌓는다.

 

 

 

 

 

 

어떤걸 사용할까? 이 표를 보고 결정하세요

 

 

 

 

시퀀스

오라클: 순서, 자동으로 증가하는 숫자

 

// 생성
create sequence 시퀀스이름;

// 데이터 넣기
insert into 테이블명 (ㄱ, ㄴ, ㄷ)  values (시퀀스이름.NextVAL, "블라1", "블라1");
insert into 테이블명 (ㄱ, ㄴ, ㄷ)  values (시퀀스이름.NextVAL, "블라2", "블라2");
insert into 테이블명 (ㄱ, ㄴ, ㄷ)  values (시퀀스이름.NextVAL, "블라3", "블라3");

//결과
1      블라1      블라1
2      블라2      블라2
3      블라3      블라3

// 현재 시퀀스 숫자 가져오기 : 3
select 시퀀스이름.currval from DUAL;

 

◆ Identity Column 의 기본 구문

generated [  always |   by default [on null]  ] as identity [  (identity_options)   ]

Identity Column은 각 행이 생성될 때,

각 행에 대하여 Sequence generator에서 일정 단위의 정수값을 생성하여 지정할수 있다.

== 시퀀스랑 비슷하다

insert into t (c1, c2) values ( 3, 'X' );

 

 

 

글로벌보다 세션이 성능이 좋다

스테이징 테이블 : https://docs.oracle.com/cd/E57185_01/OHPCA/apcs01.html

 

About Staging Tables

When data is imported into Profitability and Cost Management, users create the staging tables that provide the predefined structure to manage the import. To import model data from relational databases into Profitability and Cost Management, you must create

docs.oracle.com

준비 테이블 

데이터를 Profitability and Cost Management로 가져올 때 사용자는 가져오기를 관리하기 위해 미리 정의된 구조를 제공하는 준비 테이블을 생성합니다.

관계형 데이터베이스에서 Profitability and Cost Management로 모델 데이터를 가져오려면 Profitability and Cost Management 데이터베이스 테이블이 생성된 위치에서 별도의 데이터베이스 스키마에 준비 테이블 집합을 생성하여 응용 프로그램에서 사용할 정보 형식을 지정해야 합니다.

 

 

 

 

 

입력일시를 포함하면 성능이 좋아진다

 

 

인덱스 블록 경합

발생하는 경우:

1) MAX+1

2) Right Growing 인덱스

 

인덱스 블록 경합을 해결하는 방법

오른쪽에 만 쌓지않고 두루두루 분포하게 만든다.

 

1) 인덱스를 해시 파티셔닝

http://www.gurubee.net/lecture/1909

 

Hash Partition

Hash Partition 이란?   - Hash Partition은 Partitioning Key 값에 해시 함수를 적용하여 Data를 분할하는 방식으로 History Data의 관리의 목적 보..

www.gurubee.net

 - Hash Partition은 Partitioning Key 값에 해시 함수를 적용하여 Data를 분할하는 방식으로 History Data의 관리의 목적 보다는 성능 향상의 목적으로 나온 개념 입니다

  - Hash Partition 은 Range Partition 으로 만들기 힘든 사항 즉, 조건을 주기 힘든 경우, 각 파티션 이 고르게 나누어지지 않아 밸런스을 유지하기 힘든 경우라고 판단되는 경우에 유리합니다.

  - Hash Partition 의 경우 각각 다른 파티션에 데이터가 고르게 분산시키기 위해서는 반드시 파티션 의 개수를 명시하여야 하며, 파티션의 수를 2 의 거듭 제곱수 (즉, 2,4,8,16 ….)로 설정하여야 합니다.

  - NULL 값은 첫 번째 파티션에 위치하게 됩니다.

 

 

 

 

2) 인덱스를 리버스 키 인덱스로 전환

http://www.gurubee.net/lecture/2959

 

리버스 키 인덱스의 개념

리버스 키(Reverse Key) 인덱스는 B*TREE 인덱스와 거의 같다. 단지 인덱스 키 값을 반대로 구성해 비트리 인덱스를 생성할 뿐이다. 그로 인한 몇..

www.gurubee.net

사원번호 값이 순차적으로 증가할 경우 일반적인 B*TREE 인덱스는 우측 리프 블록으로 모든 데이터가 저장된다.

그렇기 때문에 우측 리프 블록에 경합이 발생한다.

반면 리버스 키 인덱스는 사업번호 값이 순차적으로 증가하더라도

사원번호 인덱스의 우측 리프 블록에만 추가(Insert)가 발생하지 않고 모든 인덱스 블록으로 추가되게 된다.

 

 

 

Right Growing 인덱스 해결 방법

글로벌 시퀀스, 세션 시퀀스를 각각 만든다.

각각 다른 리프 블록에 값을 입력해서 인덱스 경합이 발생하지 않는다

'SQL > 친절한 sql 튜닝' 카테고리의 다른 글

[7주차] 6.2 Direction Path I/O 활용  (0) 2022.05.01
[6주차] 소트 튜닝  (0) 2022.04.24
[5주차] 소트 머지 조인  (0) 2022.04.17
[4주차] 인덱스 튜닝  (0) 2022.04.10
[3주차] 테이블 액세스 최소화  (0) 2022.04.03