[독서 노트] [수확, 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 배 입 니 다. 여러 필드 의 차이 가 더욱 뚜렷 하 다 면)

좋은 웹페이지 즐겨찾기