[독서 노트] [수확, Oracle 뿐만 아니 라] 비트 맵 색인 (2)
즉석 조회 (다 차원 보고서 조회: select * from t where col1 = XXX and col2 = XXX and col3 = XXX...)
1. 구조 표, 이 표 는 성별, 연령 범위, 출생지 등 필드 가 있 습 니 다. 약 10 만 개의 데 이 터 를 투입 하여 즉석 조 회 를 준비 합 니 다.
SYS@ orcl>drop table t purge;
Table dropped.
SYS@ orcl>create table t (
2 name_id,
3 gender not null,
4 location not null,
5 age_group not null,
6 data
7 )
8 as
9 select rownum,
10 decode(ceil(dbms_random.value(0,2)),
11 1,'M',
12 2,'F')gender,
13 ceil(dbms_random.value(1,50)) location,
14 decode(ceil(dbms_random.value(0,3)),
15 1,'child',
16 2,'young',
17 3,'middle_age',
18 4,'old'),
19 rpad('*',20,'*')
20 from dual
21 connect by rownum<=100000;
Table created.
2. 전체 표 스 캔 상황 에서 의 조회
SYS@ orcl>set linesize 1000
SYS@ orcl>set autotrace traceonly
SYS@ orcl>select *
2 from t
3 where gender='M'
4 and location in (1,10,30)
5 and age_group='child';
663 rows selected.
Execution Plan
----------------------------------------------------------
Plan hash value: 1601196873
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 575 | 27025 | 138 (3)| 00:00:02 |
|* 1 | TABLE ACCESS FULL| T | 575 | 27025 | 138 (3)| 00:00:02 |
--------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("GENDER"='M' AND ("LOCATION"=1 OR "LOCATION"=10 OR
"LOCATION"=30) AND "AGE_GROUP"='child')
Note
-----
- dynamic sampling used for this statement
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
653 consistent gets
0 physical reads
0 redo size
13755 bytes sent via SQL*Net to client
865 bytes received via SQL*Net from client
46 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
663 rows processed
3. 세 개의 열 을 만 드 는 연합 색인, 세 개의 열 은 모두 고도 로 중복 되 는 열 입 니 다. 연합 색인 을 만 들 었 지만 전체 표 스 캔 을 걸 었 습 니 다.
SYS@ orcl>create index idx_union on t(gender,location,age_group);
Index created.
SYS@ orcl>select *
2 from t
3 where gender='M'
4 and location in (1,10,30)
5 and age_group='child';
663 rows selected.
Execution Plan
----------------------------------------------------------
Plan hash value: 1601196873
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 575 | 27025 | 138 (3)| 00:00:02 |
|* 1 | TABLE ACCESS FULL| T | 575 | 27025 | 138 (3)| 00:00:02 |
--------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("GENDER"='M' AND ("LOCATION"=1 OR "LOCATION"=10 OR
"LOCATION"=30) AND "AGE_GROUP"='child')
Note
-----
- dynamic sampling used for this statement
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
653 consistent gets
0 physical reads
0 redo size
13755 bytes sent via SQL*Net to client
865 bytes received via SQL*Net from client
46 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
663 rows processed
4. 연합 색인 을 강제 집행 하여 왜 전체 표 스 캔 을 하 는 지 알 게 되 었 다.
SYS@ orcl>select /*+index(t,idx_union)*/*
2 from t
3 where gender='M'
4 and location in (1,10,30)
5 and age_group='child';
663 rows selected.
Execution Plan
----------------------------------------------------------
Plan hash value: 306189815
------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 575 | 27025 | 38152 (1)| 00:07:38 |
| 1 | INLIST ITERATOR | | | | | |
| 2 | TABLE ACCESS BY INDEX ROWID| T | 575 | 27025 | 38152 (1)| 00:07:38 |
|* 3 | INDEX RANGE SCAN | IDX_UNION | 49691 | | 151 (2)| 00:00:02 |
------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access("GENDER"='M' AND ("LOCATION"=1 OR "LOCATION"=10 OR "LOCATION"=30)
AND "AGE_GROUP"='child')
Note
-----
- dynamic sampling used for this statement
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
564 consistent gets
0 physical reads
0 redo size
34169 bytes sent via SQL*Net to client
865 bytes received via SQL*Net from client
46 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
663 rows processed
5. 이번 주인공: 비트 맵 색인. gender, location, age group 세 필드 에 각각 비트 맵 색인 을 만 듭 니 다.
SYS@ orcl>create bitmap index gender_idx on t(gender);
Index created.
SYS@ orcl>create bitmap index location_idx on t(location);
Index created.
SYS@ orcl>create bitmap index age_group_idx on t(age_group);
Index created.
SYS@ orcl>select *
2 from t
3 where gender='M'
4 and location in (1,10,30)
5 and age_group='41 and over';
663 rows selected.
Execution Plan
----------------------------------------------------------
Plan hash value: 687389132
-----------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 575 | 27025 | 9 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID | T | 575 | 27025 | 9 (0)| 00:00:01 |
| 2 | BITMAP CONVERSION TO ROWIDS | | | | | |
| 3 | BITMAP AND | | | | | |
|* 4 | BITMAP INDEX SINGLE VALUE | GENDER_IDX | | | | |
| 5 | BITMAP OR | | | | | |
|* 6 | BITMAP INDEX SINGLE VALUE| LOCATION_IDX | | | | |
|* 7 | BITMAP INDEX SINGLE VALUE| LOCATION_IDX | | | | |
|* 8 | BITMAP INDEX SINGLE VALUE| LOCATION_IDX | | | | |
|* 9 | BITMAP INDEX SINGLE VALUE | AGE_GROUP_IDX | | | | |
-----------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
4 - access("GENDER"='M')
6 - access("LOCATION"=1)
7 - access("LOCATION"=10)
8 - access("LOCATION"=30)
9 - access("AGE_GROUP"='child')
Note
-----
- dynamic sampling used for this statement
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
426 consistent gets
0 physical reads
0 redo size
34169 bytes sent via SQL*Net to client
865 bytes received via SQL*Net from client
46 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
663 rows processed
요약:
전체 표 스 캔: 138 소비
조합 색인: 38152 (TABLE ACCESS BY INDEX ROWID), 151 (INDEX RANGE SCAN) 이 들 었 습 니 다. 색인 스 캔 을 하 더 라 도 전체 표 스 캔 보다 높 습 니 다.
비트 맵 색인: 9 (전체 표 스 캔 은 15 배, 조합 색인 은 4239 배 입 니 다. 여러 필드 의 차이 가 더욱 뚜렷 하 다 면)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.