Skip to content
Home » 비트 맵 인덱스 | [오라클 기초 강좌] 26 – 인덱스 종류 및 활용 – 인덱스 생성/변경/삭제, Unique Index, Non-Unique Index, Bitmap Index 117 개의 새로운 답변이 업데이트되었습니다.

비트 맵 인덱스 | [오라클 기초 강좌] 26 – 인덱스 종류 및 활용 – 인덱스 생성/변경/삭제, Unique Index, Non-Unique Index, Bitmap Index 117 개의 새로운 답변이 업데이트되었습니다.

당신은 주제를 찾고 있습니까 “비트 맵 인덱스 – [오라클 기초 강좌] 26 – 인덱스 종류 및 활용 – 인덱스 생성/변경/삭제, Unique Index, Non-Unique Index, Bitmap Index“? 다음 카테고리의 웹사이트 kk.taphoamini.com 에서 귀하의 모든 질문에 답변해 드립니다: https://kk.taphoamini.com/wiki. 바로 아래에서 답을 찾을 수 있습니다. 작성자 최용진 이(가) 작성한 기사에는 조회수 1,754회 및 좋아요 13개 개의 좋아요가 있습니다.

Table of Contents

비트 맵 인덱스 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 [오라클 기초 강좌] 26 – 인덱스 종류 및 활용 – 인덱스 생성/변경/삭제, Unique Index, Non-Unique Index, Bitmap Index – 비트 맵 인덱스 주제에 대한 세부정보를 참조하세요

강의 자료(PDF) 다운로드: https://goo.gl/VZovDV
– Oracle은 기본적으로 B*-Tree Index를 제공한다.
– 검색(SELECT) 속도를 향상시키기 위해 Index를 생성한다.
– 갱신, 삭제, 삽입 등의 작업에서는 Index 처리를 위한 Overhead가 발생한다.
– Index를 저장하기 위한 물리적인 공간이 필요하다.
– 최적화를 위해 분리된 TABLESPACE에 생성한다(가능하다면 별도의 Disk).
– 가능한 수정이 빈번하지 않은 Column을 대상으로 Index를 생성한다.
– Column 분포도가 10 ~ 15% 이내인 경우에 Index를 생성한다(때로는 Full Scan이 효율적인 경우도 있다).

비트 맵 인덱스 주제에 대한 자세한 내용은 여기를 참조하세요.

[Oracle] 오라클 인덱스 구조 – Bitmap Index, 비트맵 인덱스

Bitmap Index (비트맵 인덱스). – Key 값에 중복이 없고, Key 값 별로 하나의 비트맵 레코드를 가짐. – 비트맵 상의 각 비트가 하나의 테이블 레코드 …

+ 여기를 클릭

Source: jungmina.com

Date Published: 9/25/2022

View: 7881

CH01. 인덱스 원리와 활용 – 09. 비트맵 인덱스 – 티스토리

실제로 비트맵 인덱스는 여러가지 압축 알고리즘이 사용되기 때문에 서로 다른 row 범위를 갖습니다. 테이블 로우 수가 많고 키 값의 수도 많다면 …

+ 여기에 자세히 보기

Source: bae9086.tistory.com

Date Published: 11/28/2022

View: 7851

데이터베이스 성능(튜닝)_비트맵 인덱스 – 정보시스템감리사

Bitmap Index = Index key value + Start Row + End Row + Bitmap 엔트리. 구분, B-트리, 비트맵 인덱스. 구조특징, Root block, branch block, …

+ 여기에 자세히 보기

Source: swingswing.tistory.com

Date Published: 2/23/2022

View: 3971

비트맵 인덱스 – Char – 티스토리

그럼 Bitmap 인덱스의 구조에 대해서 먼저 알아보도록 하겠다. 1. 비트맵 조인인덱스. 테이블에 하나의 bitmap index가 존재할 때 …

+ 여기에 자세히 보기

Source: charstring.tistory.com

Date Published: 10/7/2022

View: 6999

비트 맵 인덱스 | [오라클 기초 강좌] 26 – 인덱스 종류 및 활용

마지막 단계에서는 정렬된 인덱스 엔트리들을 단순히 B-tree구조로 삽입한다. 문제 4,5) Bitmap INDEX 액세스. Bitmap 인덱스를 실제로 액세스하여 결과값 …

+ 여기를 클릭

Source: you.halongpearl.vn

Date Published: 6/10/2022

View: 4080

오라클 인덱스, Bitmap 인덱스(Bitmap Indexes)

CREATE BITMAP INDEX 명령으로 Bitmap 인덱스를 생성하면 비트리 인덱스처럼 트리구조를 만들고 리프블럭에 값들을 비트로 변환하여 저장 합니다. B*Tree …

+ 여기에 더 보기

Source: ojc.asia

Date Published: 11/27/2021

View: 4559

[오라클] 인덱스의 원리 및 개념과 종류(B-TREE, BITMAP INDEX)

안녕하세요. 오늘은 인덱스에 대해 포스팅하겠습니다. 오라클을 기준으로 하여 설명할 것 입니다 인덱스 개념 및 원리 인덱스의 개념 어떤 데이터가 …

+ 여기에 자세히 보기

Source: lee-mandu.tistory.com

Date Published: 2/12/2022

View: 2182

오라클 비트맵 인덱스 BITMAPPED INDEX – DBA의 정석

… 오라클 비트맵 인덱스. Datawarehousing환경 과End-User-Computing환경등에서 필요한RDBMS의 첨단Indexing Access기법으로 경쟁사에서는Bitwised Index를 발표하고 …

+ 여기에 자세히 보기

Source: haisins.epac.to

Date Published: 9/9/2022

View: 6224

주제와 관련된 이미지 비트 맵 인덱스

주제와 관련된 더 많은 사진을 참조하십시오 [오라클 기초 강좌] 26 – 인덱스 종류 및 활용 – 인덱스 생성/변경/삭제, Unique Index, Non-Unique Index, Bitmap Index. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

[오라클 기초 강좌] 26 - 인덱스 종류 및 활용 - 인덱스 생성/변경/삭제, Unique Index, Non-Unique Index, Bitmap Index
[오라클 기초 강좌] 26 – 인덱스 종류 및 활용 – 인덱스 생성/변경/삭제, Unique Index, Non-Unique Index, Bitmap Index

주제에 대한 기사 평가 비트 맵 인덱스

  • Author: 최용진
  • Views: 조회수 1,754회
  • Likes: 좋아요 13개
  • Date Published: 2018. 2. 13.
  • Video Url link: https://www.youtube.com/watch?v=l8Nk1ZTnzMA

Bitmap Index, 비트맵 인덱스

반응형

Bitmap Index (비트맵 인덱스)

– Key 값에 중복이 없고, Key 값 별로 하나의 비트맵 레코드를 가짐

– 비트맵 상의 각 비트가 하나의 테이블 레코드와 매핑

row#0( 8001) flag: ——, lock: 0, len=35 col 0; len 2; (4): 42 4c 55 45 → 키 값 : BLUE col 1; len 6; (6): 01 00 9f 4c 00 00 → 시작 RowID col 2; len 6; (6): 01 01 a4 03 01 47 → 종료 RowID col 3; len 15; (15): 00 c1 ae bb fa 02 c1 a1 10 c1 94 19 c2 dc 07 → 비트맵

– 시작 RowID와 종료 RowID만 갖고 있다가 테이블 액세스가 필요할 때면 각 비트가 첫번째 비트로부터 떨어져 있는 상대적인 거리를 이용해 RowID 값을 환산 (오라클이 한 블록에 저장할 수 있는 최대 레코드 수를 이용해 계산)

Key 값의 수가 많을 때

– Key 값의 수가 너무 많아 한 블록에 모두 담지 못할 경우 B*Tree 구조를 사용

– Key 값의 수가 많을수록 인덱스 높이 증가

– B*Tree 인덱스보다 더 많은 공간을 차지할 수 있어 비효율적

Key 값별로 Row 수가 많을 때

– Row 수가 너무 많아 한 블록에 모두 담지 못하는 경우 두 개 이상의 블록에 저장

– 한 블록에 적어도 2개 비트맵 레코드가 담기도록 잘라서 저장

(한 블록에 저장 가능한 start RowID, end RowID → 1~50 이라고 했을 때 1~25/26~50 으로 잘라서 저장한다는 말?)

비트맵 인덱스 활용

– Distinct Value 개수가 적을 때 효율적

– 적은 용량을 차지하므로 인덱스가 여러개 필요한 대용량 테이블에 유용 (다양한 dimension을 가진 팩트성 테이블, DW)

– Lock에 의한 DML 부하가 심하므로(레코드 하나만 변경되더라도 해당 비트맵 범위에 속한 모든 레코드에 Lock이 걸림) OLTP성 환경에 부적합

– Table Random Access가 발생하는 건 B*Tree와 동일

반응형

CH01. 인덱스 원리와 활용 – 09. 비트맵 인덱스

반응형

인덱스는 키 값에 해당하는 테이블 레코드를 찾아갈 수 있도록 주소 정보를 제공합니다. 일반적으로 사용되는 B*Tree 인덱스는 테이블 레코드를 가리키는 rowid 목록을 키 값과 함께 저장하는 구조입니다.

테이블에 100개 레코드가 있으면 인덱스에도 100개 rowid를 키 값과 함께 저장합니다. rowid에는 중복 값이 없지만 키에는 중복 값이 있을 수 있습니다. 개념적으로 비트맵 인덱스는 키 값에 중복이 없고, 키 값 별로 하나의 비트맵 레코드를 갖습니다. 그리고 비트맵 상의 각 비트가 하나의 테이블 레코드와 매핑됩니다. 비트가 1로 설정돼 있으면 상응하는 테이블 레코드가 해당 키 값을 포함하고 있음을 의미합니다.

(1)기본구조

그림의 아래쪽이 색상 컬럼이 생성한 비트맵 인덱스를 표현한 것인데, 키 값이 BLUE인 첫번째 행을보면 4번째 7번째 9번째 비트가 1로 설정되어 있습니다. 따라서 상응하는 테이블 레코드의 색상이 BLUES 임을 확인할 수 있습니다.

블록 덤프를 통해 실제 비트맵 인덱스 내부 구조를 살펴보면 아래와 같습니다.

마지막 컬럼(col3)은 시작 rowid와 종료 rowid 구간에 속한 테이블 레코드와 매핑되는 비트맵입니다. 첫 번째 비트는 시작 rowid(col 1)가 가리키는 레코드와 매핑되고, 마지막 비트는 종료 rowid(col 2)가 가리키는 레코드와 매핑됩니다.

비트맵 인덱스는 이처럼 첫 번째와 마지막 비트의 rowid만을 갖고 있다가 테이블 액세스가 필요할 때면 각 비트가 첫 번째 비트로부터 떨어져 있는 상대적인 거리를 이용해 rowid 값을 환산합니다.

비트맵 위치와 rowid 매핑

데이터 블록은 한 익스텐트 내에서 연속된 상태로 저장되지만 익스텐트끼리는 서로 인접해 있지 않습니다. 심지어 다른 데이터 파일에 흩어져 저장되는데 , 어떻게 시작 rowid와의 상대적인 거리로 정확한 레코드 위치를 알아낼 수 있을까요?

오라클이 한 블록에 저장할 수 있는 최대 레코드 개수를 제한한다는 데서 힌트를 얻을 수 있습니다. 오라클의 표준 블록크기는 8,192바이트이고 1바이트 크기의 레코드라면 한 블록에 수천 개를 저장할 수 있을거 같지만 실제 테스트해보면 730개를 넘지 못합니다. 크기를 5바이트로 늘려도 한 블록당 730개를 넘지 않습니다.

이것을 보면 오라클은 한 블록에 저장할 수 있는 최대 레코드 개수를 제한하고 있습니다.

예를 들어, 위의 상품 테이블에 총 20개 블록이 할당되었다고 하겠습니다. 첫 번째와 두 번째 익스텐트에 각각 10개 블록이 있고, 하나의 테이블 블록이 가질 수 있는 최대 레코드 개수는 730이라고 하겠습니다. 이 테이블 색상 컬럼에 비트맵 인덱스를 만들면 오라클은 네 개 (BLUE,GREEN,RED,NULL)의 키 값에 각각 14,600(=730*20)개 비트를 할당(초기값은 0)

하고 값에 따라 비트를 설정합니다. 첫 번째 키 값을 예로 들면 ‘BLUE’인 레코드에 해당하는 비트를 모두 1로 설정합니다.

비트맵 인덱스를 스캔하면서 테이블 레코드를 찾아갈 때는 어떤식으로 할까요? 예를 들어 9,500번째 비트가 1로 설정돼 있으면 14번째 블록 10번째 레코드를 찾아가면 됩니다. (9500/730 = 13.01… 이므로 14번째블록에서 mod(9500,760) = 10으로 10번째 레코드를 확인할 수 있습니다.

키 값의 수가 많을 때

비트맵 인덱스는 키 값별로 하나의 레코드를 갖는데, 저장할 키 값의 수가 많을 때는 한 블록에 모두 담지 못합니다. 비트맵을 저장하기 위해 두 개 이상 블록이 필요해지면 오라클은 B*Tree 인덱스 구조를 사용하며, 값의 수가 많을수록 인덱스 높이(height)도 증가합니다. 하지만 이런구조면 B*Tree인덱스보다 더 많은 공간을 차지할 수 있어 비트맵 인덱스로 부적합합니다.

키 값별로 로우 수가 많을 때

한 블록 크기의 비트맵으로 표현할 수 없을 정도로 테이블 로우 수가 많을 때도 두 개 이상 블록이 필요해집니다.

예를 들어, ‘BLUE’값 하나에 대한 비트맵을 저장하기 위해 2+1/2 블록만큼의 공간을 필요로 한다면 아래와 같은 구조로 저장됩니다. 한 블록이 단 하나의 비트맵 레코드로 구성될 수 있지만 실제 테스트해 보면 ,한 블록에 적어도 2개 비트맵 레코드가 담기도록 잘라서 저장하는 것을 확인할 수 있습니다.

비트맵 압축

실제로 비트맵 인덱스는 여러가지 압축 알고리즘이 사용되기 때문에 서로 다른 rowid 범위를 갖습니다. 테이블 로우 수가 많고 키 값의 수도 많다면 완전히 0으로 채워진 비트맵 블록들이 생기는데, 오라클은 그런 블록들을 제거합니다. 비트맵 뒤쪽에 0이 반복되어도 이를 제거합니다. 그리고 앞, 뒤, 중간 어디든 같은 비트맵 문자열이 반복되면 checksum 비트를 두어 압축합니다. 이 때문에 각 비트맵이 가리키는 rowid 구간이 서로 달라지지만 시작 rowid와 종료 rowid만 알고 있으면 비트와 매핑되는 rowid를 계산하거나 다른 비트맵과 Bitwise 연산하는 데에는 전혀 지장이 없습니다.

(2) 비트맵 인덱스 활용

비트맵 인덱스는 성별처럼 Distinct Value 개수가 적을 때 저장효율이 매우 좋습니다. 그런 컬럼이라면 B*Tree 인덱스보다 훨씬 적은 용량을 차지하므로 인덱스가 여러 개 필요한 대용량 테이블에 유용합니다. Distinct Value 개수가 적은 컬럼일 때 저장효율이 좋지만 테이블 Random 액세스 발생 측면에서는 B8Tree 인덱스와 똑같기 때문에 그런 컬럼을 비트맵 인덱스로 검색하면 그다지 좋은 성능을 기대하기 어렵습니다. 스캔할 인덱스 블록이 줄어드는 정도의 성능 이점만 얻을 수 있습니다.

하나의 비트맵 인덱스 단독으로는 쓰임새가 별로 없지만 여러 비트맵 인덱스를 동시에 사용할 수 있다는 특징 때문에 대용량 데이터 검색 성능을 향상시키는 데에 큰 효과가 있습니다. 여러 개 비트맵 인덱스로 Bitwise 연산을 수행한 결과 테이블 액세스량이 크게 줄어든다면 극정인 성능 향상을 가져다 줍니다.

두 개 이상 비트맵을 이용한 AND 연산 뿐아니라 OR, NOT 연산도 가능합니다.

select * from 상품

where (크기 = ‘SMALL’ or 크기 is null)

and 색상 = ‘GREEN’

위의 쿼리를 수행한다 할때 ‘크기’ 컬럼 인덱스로부터 ‘SMALL’과 NULL에 대한 비트맵을 읽고, ‘색상’ 인덱스로부터 ‘GREEN’에 대한 비트맵을 읽어 그림과 같이 놓고 Bitwise연산을 수행하여 조건절을 만족하는 레코드를 찾을 수 있습니다.

비트맵 인덱스를 이용하면 null 값에 대한 검색도 가능합니다.

비트맵 인덱스는 여러 인덱스를 동시에 활용할 수 있다는 장점 때문에 다양한 조건절이 사용되는 정형화되지 않은 임의 질의가 많은 환경에 적합합니다. 하지만 비트맵 인덱스는 lock에 의한 DML부하가 심한 것이 단점입니다. 레코드 하나만 변경되더라도 해당 비트맵 범위에 속한 모든 레코드에 lock이 걸립니다. OLTP성 환경에 비트맵 인덱스를 쓸 수 없는 이유가 이것입니다. 즉 읽기 위주의 대용량 DW환경에 적합합니다.

(3)RECORDS_PER_BLOCK

오라클은 한 블록에 저장할 수 있는 최대 레코드 개수를 제한한다고 했습니다. 그래야 비트맵 위치와 rowid를 매핑할 수 있기 때문입니다. 그런데 실제 블록에 저장되는 평균적인 레코드 개수는 여기에 한참 못미치므로(블록수 * 730) 비트맵 인덱스에 낭비되는 공간이 많이 생깁니다. 이에 오라클은 블록에 저장될 수 있는 최대 레코드 개수를 사용자가 지정할 수 있는 기능을 제공합니다.

alter table [테이블 명] minimize records_per_block;

주의할 것은 블록당 레코드 개수가 정상치보다 낮은 상태에서 minize records_per_block명령을 수행하지 말아야한다는 사실입니다. 그럴 경우, 추가로 데이터가 입력되면서 블록마다 공간이 많이 생기고, 비트맵 인덱스가 줄어드는 것 이상으로 테이블 크기가 커지는 결과가 나옵니다.

반응형

데이터베이스 성능(튜닝)

▣ 데이터베이스 성능(튜닝)_비트맵 인덱스

– 데이터에 해당하는 0, 1로 구성된 비트맵을 구성하고 있고, 비트맵의 조합에 의해서 데이터를 매핑하는 방식의 인덱스

– 트리기반 인덱스 대비, 저장공간 절약 및 연산 횟수 감소

– 테이블이 매우 크고 컬럼이 낮은 분포도를 가질 때 사용되며

넓은 범위의 대량 데이터 검색(의사결정시스템)에 유용

Bitmap Index = Index key value + Start Rowid + End Rowid + Bitmap 엔트리

구분 B-트리 비트맵 인덱스 구조특징 Root block, branch block, leaf block으로 구성되며,

인덱스 깊이를 동리하게 유지하는 트리 구조 키 값을 가질 수 있는 각 값에 대해 하나의

비트맵을 구성 사용환경 OLTP DW, Mart 등 검색속도 처리 범위가 좁은 데이터 검색시 유리 다중 조건을 만족하는 데이터 검색 시에 유리

(특히, 비정형 쿼리) 분포도 데이터 분포도가 좋은 컬럼에 적합

큰 분포도(Cardinality)를 갖는 테이블에 적합 데이터 분포도가 나쁜 컬럼에 적합

적은 분포도를 갖는 테이블에 적합 장점 입력, 수정, 삭제가 용이함 비트 연산으로 OR연산, NULL값 비교 등이 가능함 단점 처리 범위가 넓을 때 수행 속도 저하 전체 인덱스 조정의 부하로 입력, 수정, 삭제가 어려움

비트맵 인덱스 생성문법

SQL> CREATE BITMAP INDEX user_gender_idx

ON user

TABLESPACE bitmap_idx;

2019년 59번

정답 : 3번

Bitmap Index = Index key value + Start Rowid + End Rowid + Bitmap 엔트리

3)번 Salary 값이 50000~60000사이인 직원은 비트 단위 OR연산으로 검색 가능함

비트 맵 인덱스 | [오라클 기초 강좌] 26 – 인덱스 종류 및 활용 – 인덱스 생성/변경/삭제, Unique Index, Non-Unique Index, Bitmap Index 183 개의 가장 정확한 답변

We are using cookies to give you the best experience on our website.

You can find out more about which cookies we are using or switch them off in settings.

오라클 인덱스, Bitmap 인덱스(Bitmap Indexes)

오라클 인덱스, Bitmap 인덱스(Bitmap Indexes)

테이블의 컬러 컬럼이 BLUE, GREEN, RED, BLACK 4가지의 값을 가진다고 했을 때, 컬럼에 유일한 값이 몇개 되지 않으면 컬럼의 카디널리티cardinality가 낮다고 합니다. 이러한 컬럼에 적합한 인덱스가 Bitmap 인덱스bitmap indexes 입니다.

정보저장의 최소단위인 비트를 이용하여 칼럼 값을 간결하게 저장하고 이를 이용하여 자동으로 ROWID를 생성하는 구조를 가지며 성별 컬럼처럼 분포도가 나쁜 칼럼, NOT, OR를 사용하는 경우 탁월한 성능을 냅니다.

[그림 13.2 Bitmap 인덱스 내부구조]

CREATE BITMAP INDEX 명령으로 Bitmap 인덱스를 생성하면 비트리 인덱스처럼 트리구조를 만들고 리프블럭에 값들을 비트로 변환하여 저장 합니다. B*Tree 인덱스의 리프 블록(Leaf Block)은 INDEX KEY VALUE와 ROWID 로 구성이 되어 있지만 Bitmap 인덱스는 START ROWID ~ END ROWID로 압축해서 저장하고 컬럼값 역시 ‘1’ 이라는 비트로 저장해서 원본 데이터의 ROWID를 계산합니다.

Bitmap 인덱스를 생성하고자 하는 테이블 스캔을 한 후 Bitmap Index Generator에 의해 칼럼 값(비트형태의 ‘1’로 저장), 시작 ROWID, 끝 ROWID , Bitmap을 갖는 인덱스 엔트리를 생성 합니다. 생성된 Bitmap들을 B-tree구조에 넣기 쉽도록 KEY값과 START ROWID 순으로 정렬하며 마지막 단계에서는 정렬된 인덱스 엔트리들을 단순히 B*Tree 구조로 삽입 합니다.

.

인덱스를 데이터의 존재 여부를 0 or 1로 표시하는 비트 단위로 저장하고 B*Tree 인덱스 한계를 극복하여 대량의 자료 조회에 적합한 구조이지만 잦은 DML이 발생되는 곳은 리프 블록의 갱신으로 인해 부적합 합니다.

하나의 인덱스 값을 수정하면 그 인덱스 값을 가지는 모든 행(로우, ROW)에 락lock을 겁니다. 즉 하나의 인덱스 값으로 테이블상의 여러 개의 행을 표현하기 때문에 INSERT, UPDATE, DELETE 등을 사용하는 경우 오라클 LOCK 메커니즘인 행 단위 락(ROW LEVEL LOCKING)을 지원할 수 없습니다.

B*Tree 인덱스가 NULL값을 보관하지 않는 것과는 달리 Bitmap 인덱스는 NULL값에 대한 BIT값을 저장하여 비트리 인덱스의 NULL문제를 해결했으며 AND, OR 연산시 비트연산을 빠르게 수행하여 탁월한 성능을 보입니다.

[기본형식]

CREATE BITMAP INDEX index_name ON table_name (Column|Expr[,Column|Expr]…)

실습에서 사용되는 MYEMP, MYDEPT 테이블은 0.환경설정의 0.4 실습 데이터 설치편을 참조하여 생성 바랍니다.

MYEMP 테이블의 deptno 컬럼에 대해 인덱스를 생성한 후 일단 안보이도록 하고 WHERE절에 deptno 컬럼을 사용하여 조회해 봅니다. 다시 deptno 컬럼의 인덱스를 보이도록 한 후 조회해 봐서 성능 차이가 나는지를 확인해 봅니다.

실습

MYEMP 테이블의 deptno 컬럼에 오름차순 인덱스를 생성하고 안보이도록 숨깁니다.

숨기게 되면 인덱스는 존재하지만 오라클에서 해당 인덱스를 사용하지 않습니다.

deptno 컬럼의 인덱스를 생성한 후 INVISIBLE 상태로 변경 합니다. 컬럼에 대한 인덱스가 이미 있다면 DROP INDEX로 삭제 후 다시 생성하세요.

CREATE INDEX IDX_MYEMP_DEPTNO ON MYEMP(DEPTNO);

<실행결과>

Index IDX_MYEMP_DEPTNO이(가) 생성되었습니다.

ALTER INDEX IDX_MYEMP_DEPTNO INVISIBLE;

<실행결과>

Index IDX_MYEMP_DEPTNO이(가) 변경되었습니다.

현재 deptno 컬럼의 인덱스는 생성되어 있지만 보이지 않으므로 오라클에서 사용하지 않습니다.

WHERE절에 deptno 컬럼을 사용하여 조회해 보겠습니다.

MYEMP 테이블에서 deptno 값이 1 또는 3인 데이터가 몇 건 있는지 확인하세요.

SELECT COUNT(*) FROM MYEMP WHERE DEPTNO IN (1,3);

<실행결과>

COUNT(*) 1 10000000

<실행계획>

실행시간은 필자의 노트북 기준으로 대략1 2초 정도 걸렸으며, deptno 컬럼 인덱스를 경유하지 않고 MYEMP 테이블 전체를 FULL SCAN하여 deptno 값이 1 인것과 3인 것을 필터링 하여 찾았고 집합함수인 COUNT문 때문에 AGGREGATE 옵션이 실행되어 결과를 한건으로 보였습니다. AGGREGATE 옵션은 주로 GROUP BY와 같이 쓰이는 SUM, COUNT등이 출현하는 경우 한건으로 추출되도록 하는 옵션 입니다.

deptno 컬럼의 인덱스를 보이도록 한 후 다시 쿼리해 보겠습니다.

deptno 컬럼에 생성되어 있는 인덱스를 보이도록 하고 다시 SELECT문을 실행하세요.

ALTER INDEX IDX_MYEMP_DEPTNO VISIBLE;

SELECT COUNT(*) FROM MYEMP WHERE DEPTNO IN (1,3);

<실행결과>

COUNT(*) 1 10000000

<실행계획>

IDX_MYEMP_DEPTNO 인덱스를 빠르게 멀티 블럭으로 읽어 들이면서 전체 인덱스를 읽는 FAST FULL SCAN을 하면서 deptno 컬럼 값이 1 또는 3인 데이터를 찾고 AGGREGATE 옵션에 의해 한건으로 COUNT의 결과를 보입니다. 비용cost은 이전에 인덱스를 숨기고 실행한 것보다 적게 들었지만 여전히 1.7초 내외의 수행시간이 걸렸습니다. 인덱스를 경유 했지만 여전히 쿼리 성능이 만족스럽지 않은 상황 입니다. 비트리 인덱스는 값이 고유할수록, 값의 분포도가 좋을수록 좋은 성능을 내는 인덱스인데 deptno 컬럼은 중복되는 값이 많아서 인덱스를 경유해도 성능이 급진적으로 개선이 되지는 않습니다.

CARDINALITY 항목은 해당 오퍼레이션에서 추출되는 예상되는 건수를 표시 하는데 테이블에 대한 통계정보가 부정확하면 실제 건수와 차이가 나니 정확한 실행 계획의 생성을 위해 주기적으로 ANALYZE TABLE 명령으로 테이블 통계정보를 생성하는 것이 좋습니다. 이 값이 부정확하면 오라클 옵티마이저oracle optimizer가 실제 인덱스를 경유하는 것보다 FULL TABLE SCAN 하는 것이 효율적인데도 인덱스를 경유하게 하고, 해시조인이 효율적인데도 중첩루프 조인을 하도록 해서 쿼리 성능을 나쁘게 하는 실행계획을 만들어 낼 수 있습니다.

이번에는 먼저 생성한 deptno 컬럼의 인덱스를 삭제하고 Bitmap 인덱스를 생성하여 동일한 쿼리를 실행하고 실행시간 및 실행계획을 확인해 보겠습니다.

실습

IDX_MYEMP_DEPTNO 인덱스를 삭제하고 Bitmap 인덱스를 생성합니다.

deptno 컬럼의 인덱스(IDX_MYEMP_DEPTNO)를 삭제한 후 BIDX_MYEMP_DEPTNO 라는 이름으로 Bitmap 인덱스를 생성하세요.

DROP INDEX IDX_MYEMP_DEPTNO;

CREATE BITMAP INDEX BIDX_MYEMP_DEPTNO ON MYEMP(DEPTNO);

앞에서 작성한 SELECT 쿼리를 다시 실행하고 실행계획 및 성능을 확인하겠습니다.

deptno 값이 1 또는 3인 데이터가 몇 건인지 확인하세요.

SELECT COUNT(*) FROM MYEMP WHERE DEPTNO IN (1,3);

<실행결과>

COUNT(*) 1 10000000

<실행계획>

실행시간은 약 0.022초 정도 소요되었으며 생성한 Bitmap 인덱스를 경유하였고 비용도 많이 줄어 성능도 향상 되었음을 확인할 수 있습니다. 이렇게 Bitmap 인덱스는 deptno 컬럼처럼 값의 분포도가 좋지 않은 컬럼의 조회 용도로 사용하기에 적합한 인덱스 입니다.

#비트맵인덱스, #bitmap인덱스, #오라클인덱스, #인덱스, #INDEX​

오라클 비트맵 인덱스 BITMAPPED INDEX – DBA의 정석

Datawarehousing환경 과End-User-Computing환경등에서 필요한RDBMS의 첨단Indexing Access기법으로 경쟁사에서는Bitwised Index를 발표하고 있습니다. 이 기법은Oracle Server V7.3에서도Bitmapped Index라는 이름으로 발표될 예정이므로 이에 대한 정확한 이해를 위해 다음사항을 기술해 보았습니다.

Bitmapped Index란 ?

RDBMS의Table로부터 특정 자료의 검색을 위해 기존의 일반RDBMS에서는검색효율의 향상을 위해B-Tree Index를 구현하여 사용하여 왔습니다. 그외에도B-tree Cluster Index, Hash Cluster Index등을 이용하여 대부분의 검색효율을 보장하여 왔지만B-Tree Access를 위한 특성로 인해 몇가지 어려움을 안고 있었습니다.

1) B-tree Index Access 방식을 위해선 실지 조건비교되는Column값에 대한Table의 원시값을Index에도 보관하고 있어야 함으로 인해Index를 위한 실지data의 중복 저장으로 저장공간의 낭비를 감수하여야 으며, 특히 현실 상황에서 자주 사용케 되는 여러 컬럼의Concatenated Index (결합

인덱스) 에서 자료량이 많은Table에 대해서는 크나큰 부담이었습니다.

2) Index설정Column값의 분포도(Unique성)가 넓은Column에 대한(예:성별)조건검색시에는Index access를 했을때 보다 오히려Full Table Scan방식이 오히려 빠른 성능을 보장하기 때문에RDBMS의Cost Based Optimizer는Random access비용이 많이드는Index access를 포기하고 빠른속도의 순차

Table Scan을 하여 높은Hit Ratio를 보장하려 하는 경우를 우리는 흔히 보게됩니다.

3) End-User-Computing 환경에서 흔히 예상되는 복잡한 질의조건으로 인해Optimizer가 최적 실행계획에서Index를 포기하게되는 경우를 초래합니다. (예: 복잡한OR 연산자등)

이러한 상황을 해결하기 위한 새로운Index Access 방법 로Bitmapped Index가 새롭게 등장하게 되었습니다.

다음 상황을 통하여 구체적 설명을 제시합니다.

예) 한국오라클(주) 에서 관리하고 있는 고객정보Table이 다음과 같이 정의 되어있다고 가정합시다.

————————————————

고객번호 혼인여부 성별 중요등급

————————————————

1001 결혼 여 하

1002 미혼 남 상

1003 재혼 남 중

————————————————

상기Column들의 속성을 보면 고객번호는 유일한 값들이며B-Tree Index로 탁월한 조회성능 보장.

혼인여부(3종류),성별(2종류),중요등급(3종류) 은30 – 50%의 넓은 분포도를 갖는 값들로서B-Tree Index사용시 효율성이 거의 없슴.

즉, B-Tree Index에서는 자료의 값에 따라Sort하여 이분식(Binary) 가지치기(Leaf& Node) 구조를 유지하여, 조건에 들어오는 값에따라 검색자료 범위(Access Range)를 쪼개어 나가는데 반해, 저장되어 있는 자료가 동종(같은값)이 많다면 해야할일(Access Range)이 줄지 않고 비용이 많이드는Random Access(Index에서Rowid를 가지고 실Table Data를 찾을때)만 많아지고, Scan해야할 자료가지(Leaf) 수는 쉽게 줄지않게되어B-Tree Index방식으로는 빠른 성능을 보장하기가 어렵습니다.

그렇다면 다음과 같이 분포도가 좋지않은 중요등급Column을 몇 개의Bit들만 가지고 정보를 저장키로 하여봅니다.

———————————————————-

중요등급= ‘상’ 1 0 0 0 0 0

중요등급= ‘중’ 0 1 0 0 1 1

중요등급= ‘하’ 0 0 1 1 0 0

———————————————————-

*혼인여부(3종류),성별(2종류)도 같이 적용하였다고 가정.

이런 상황에서 아래의SQL을 실행한다고 가정하여 봅니다.

Select count(*) from 고객정보

where 결혼여부= ‘미혼’ and 중요도in (‘상’,’중’);

(“미혼자 인 고객중에 중요도가’상’ 이거나’중’인 고객은 몇 ?”)

이SQL을 실행하기 위한Optimizer가 이러한Operation을 다음과 같이 결정한다면 훨씬 빠른속도의 성능을 낼 수 있을 것 입니다.

혼인여부= ‘미혼’ AND (중요도= ‘상’ OR 중요 = ‘중’)

즉, ‘011001’ AND ( ‘100000’ OR ‘010011’)

다시 풀어보면’011001′ AND ‘110011’ 이고 결과는’010001’이다.

Optimizer는 두개 컬럼의 논리연산결과가’010001’인Row들을 찾아 건수를 세면 될 것 입니다.

상기와 같이 논리연산과Bit처리 방식은Computer에게 훨씬 쉽게 처리할 수 있는 길을 만들어주게 되면서, 몇종류 안되는 값들과의 별도의 조그만 연결표(Bitmap)와 몇Bit만의 저장공간만을 가지고

Index 구성을 가능케 함으로써 공간의 절약효과도 상당할 것이다.특히, Data warehousing, Decision Support System 에서와 같은 방대한 정보량에서 유용할 수 있습니다.

Bitmapped Index의 장단점 ?

Index를 사용하는데 있어서 우리는 몇가지의 고려사항을 검토해야 합니다. 조회성능측면, 저장공간측면, 유지관리측면 정도를 고려할 수 있습니다. 앞으로, 이러한 측면에서의Bitmapped Index특성을 설명하기로하겠습니다. 우선, Bitmapped Index의 장,단점을 간추려보면 다음과 같습니다. 장점으로는 아주적은Index저장공간을 사용하여 좋 않은 분포도의 값을 갖는 다량의 자료를 빠른속도로Access할 수 있다는 것과 복잡다양한 조건에 대해Index Access Path를 적용할 수 있다는 점이 있는

반면, 조건 유형이Pattern Match형태가 자주 사용될시 효용성이 극소화되며, B-Tree Index와 같이 모든Query에 대해Index Path로 사용될 수 없다는 단점이 있습니다. 한예로Insert, Update, Delete와 같은Query에서는 무의미 합니다.

Bitmapped Index는 다음과 같은 측면에서 각각 유용한 이점이 있습니다.

조회성 측면

– 각각의 독립적인Column들에 대하여 여러유형(AND,OR…)의 조건절에 대해Index가 사용 되어지게 하는 규칙이 불필요하다.(ad hoc query)

– 분포도가 나쁜 값에 대한Index Access가 빠름.

– Index Column으로 추가 필요시 독립적으로 추가 및 적용 가능.

– 복잡하게 길어지는 조건절에서도 모두 유효하게 작동된다.(복잡한 질의 및ad hoc query에서 유용)

– 특히 다량의 자료에 대한 계 질의(aggregate query)에서 탁월. (예:COUNT operator)

– 분포도가 좋은(Unique성:값의종류가 많다) 값에대한Index는 불리.

저장공간측면

– Index에 가지고 있어야 될 자료값 에대한 공간 절약.

. 하지만, Bitmapped Index로 적용하게될Column의 특성상 실제 값의 Size도 크지않다 예를들어’남’ 과’여’값의 겨우2Byte 이하일 것이다. 즉, Bitmapped Index적용Column의 후보는 대개5가지 정도 이내의 값을 갖는 경우가 되므로 실지 값의Size도 작게됨.고로, 이러한 측면에서의 저장공간 절약 측면 보다는 실제 현업상 요구되는Index구성에서 예를 들면 더나은 이해가 될 것 입니다.

예) 기존에 고객정보 검색속도를 위해Index1을 다음과 같이 구성 하였다고 가정 하겠습니다.

B-Tree Index1 = (혼인여부,성별,중요도)

이경우는Where절에서 혼인여부가 조건에 오지않는 경우나 조건절에 성별만 혹은 중요도만을 가지고 검색할 경우에는Index1을 사용할 수 없기에Index2(성별,중요도,혼인여부),Index3(중요도,성별,혼인여부)등의 추가Index가 있어야 만족한 성능을 낼 수 있었다면 거의10 – 100배의 공간절약을하며Bitmapped Index1(혼인여부),Index2(성별),Index3 (중요도)등의 독립적인3개의 적은공간으로 만족한 성능을 보장할 수 있다. 이러한 측면에서의 이점이 클 것 입니다.

유지관리측면

– Bitmapped Index는Decision Support System과 같은 조회전용 업무나OLTP업무 비중이 작은 업무에서 적합.

– 아직Single Bit에 대한Lock방안이 없고, Bitmapped Index에서Row-Level Locking대신에Block-Level Locking이 적용되기 때문에OLTP전용 업무에서는Lock Contention 및Deadlock 가능성 많음.

– Bitmapped Index에서Update등의Transaction은Block level Lock을 사용하여야 하므로Oracle의 기본Locking 인Row level Lock 사용할 수 없게 되며 결국Oracle block (예:2KB)내의 한Row에 대한 변경이 필요시(Update등)에는 해당Block전체가Locking되므로 잦은 변경이 예상되는OLTP업무에서는 큰부담이 되므로Batch성Bulk Operation 이 가미되어 운용할 수 있는 방안이 필요.

예) Data warehousing에서는 주업무가 조회이며, 자료변경 추가시는 대부분Batch성으로 처리하는 사례에서Batch작업시Bitmapped Index들을Disable시키고 처리후Enable하 것이 바람직.

3.Oracle’s Bitmapped Index의 특성 ?

Oracle에서의Bitmapped Index는 다음의 이점을 제공합니다.

검증된 기술

– 이미Oracle7의Text Server에서Bitmapped Technology를 적용하여 사용하여 왔으며 이러한 기술을Oracle7 Release7.3에서Production 으로 제공합니다.

통합기능으로 제공

– 별도의 기능옵션 추가없이Oracle Server에 통합되어 제공됩니다.

– 기존 사용 모든 환경과 수정없이 통합 적용이 가능합니다.

(예: DB Trigger, Distributed, Parallel, Integrity constraints…)

– 각종SQL, Tool 및Utility, Application등에서 수정이 필요없습니다.

병렬Index 생성 지원

– 방대한 자료에 대한Index생성시 병렬수행으로Bitmapped Index생성

압축기능

– 저장공간을 현저히 줄일 수 있게 구현된 압축기법을 제공합니다.

입력/수정/삭제 지원

– Oracle의Bitmapped Index는Insert,Update,Delete 를 지원합니다.

(은행 계정업무 와 같은 무리한OLTP transaction이 아닌 하루업무 중에 약10% 이내의 자료변경 업무는 그대로 사용 가능)

– 사용자로 하여금 가끔 유발되는 변경에 대해서Bitmapped Index를 재생성이 불필요하게 투명하게 사용가능.

병렬Index 검색 지원

– 대량의Table에 대한 검색시 병렬로Bitmapped Index 검색 가능.

여러컬럼에 대한Bitmapped Index 지원

– 분포도가 나쁜 몇개의 컬럼이 항시 같이 조건에 오는 경우B-Tree Index에서의Concatenated Index같이Multicolumn Bitmapped Index 사용가능.

유연성 보장

– 하나의Table에B-tree Index와Bitmapped Index를 동시 혼용가능.

(Clustered Index도 혼용 생성 가능)

Oracle에서의 테스트 예제

Oracle에서의Bitmapped Index의 특성을 확인할 수 있는 예시 입니다.

고객정보자료는 약100만건의 자료로 구성되어 있으며 현재 고객번호는 유일한 값으로 구성되며Primary Key로 선언되어 있습니다. 그러나, 성별 과 중요도, 혼인여부 컬럼의 값은2가지 내지는3가지 종류이어서B-Tree Index로는 검색수행 속도를 보장할 수 없는 상황임.

1) Select * from 고객정보where 성별= ‘남’;

본SQL을Optimizer는 최적의Execution Plan으로 Parallel Full

Table Scan을 선택하게 됩니다. (전체의50%이므로)

2) Select * from 고객정보where 고객번호 = 1001;

본SQL을Optimizer는 최적의Execution Plan으로 Unique B-tree

Index를Access 하여Rowid를 가지고Table 을1번 Scan.

3) Select * from 고객정보

where 성별= ‘남’ and 중요도in (‘상’,’중’);

본SQL을Optimizer는 최적의Execution Plan으로 Bitmapped Index

를 선택하게 됩니다.

4) Select * from 고객정보

where 성별= ‘남’ and 고객번호 = 1001;

본SQL을Optimizer는 최적의Execution Plan으로B-tree Index를

Range Scan하는 방 을 선택하게 됩니다.

(성별Bitmapped Index 보다는Unique한 고객번호Index가 효율적)

상기와같이Oracle 에서의Bitmapped Index는Cost Based Optimizer에 의해 투명하고 유연성있게 수행속도를 보장하게 되며, 필요시Oracle의 특징인Optimizer 취사 선택기능으로 사용의도에 맞추어

사용이 가능합니다.

결 론

Data Warehousing 또는Decision Support System에서의 필요한 요소인Oracle의Bitmapped Index는Release7.3 Server에 탑재되게 되었으며 기존RDBMS에서의 조회 수행속도의 몇가지 걸림돌을 해결케 하였고, 또한 방대한 자료량에 대한Index의 저장공간 절약 및End-User-computing에 꼭 필요한Indexing 구현기법입니다.

단, Bitmapped Index만이 지상 최대의 해법이 아니란 것도 우리는 알아야 하며 사전에OLTP에서의 부담감에 대한 분석이 필요 며, 과연 나쁜분포도에서 저장공간에 대한 낭비에는 많은 관심이 없고 단지 좋은 조회속도를 보장키 위한다면 이미 기존Oracle7에서부터 사용해온Clustered Index를 검토해 보는 것이 타당하리라고 사료됩니다.

키워드에 대한 정보 비트 맵 인덱스

다음은 Bing에서 비트 맵 인덱스 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 [오라클 기초 강좌] 26 – 인덱스 종류 및 활용 – 인덱스 생성/변경/삭제, Unique Index, Non-Unique Index, Bitmap Index

  • oracle
  • 오라클강좌
  • db
  • 최용진
  • 데이터베이스
  • 무료오라클강좌
  • 오라클강의
  • 무료오라클강의
  • 오라클
  • Unique Index
  • Non-Unique Index
  • Bitmap Index
  • Function Based Index
  • FBI
[오라클 #기초 #강좌] #26 #- #인덱스 #종류 #및 #활용 #- #인덱스 #생성/변경/삭제, #Unique #Index, #Non-Unique #Index, #Bitmap #Index


YouTube에서 비트 맵 인덱스 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 [오라클 기초 강좌] 26 – 인덱스 종류 및 활용 – 인덱스 생성/변경/삭제, Unique Index, Non-Unique Index, Bitmap Index | 비트 맵 인덱스, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

See also  랍스터 집게 손질 | 랍스타 완벽하게 바르는 방법 How To Extract Meat From Lobster Perfectly 모든 답변

Leave a Reply

Your email address will not be published. Required fields are marked *