기타 색인

53095 단어 인덱스
비트 맵 인덱스:
  • 통계 항목 이 용감하게 우승 했다.
    SQL> drop table t purge;
    
    
    
    Table dropped.
    
    
    
    SQL> create table t as select * from dba_objects;
    
    
    
    Table created.
    
    
    
    SQL> insert into t select * from t;
    
    
    
    2314432 rows created.
    
    
    
    SQL> update t set object_id=rownum;
    
    
    
    4628864 rows updated.
    
    
    
    SQL> commit;
    
    
    
    
    
    SQL> select count(*) from t;
    
    
    
      COUNT(*)
    
    ----------
    
       4628864
    
    -------------------------------------------------------------------
    
    | Id  | Operation       | Name | Rows  | Cost (%CPU)| Time      |
    
    -------------------------------------------------------------------
    
    |   0 | SELECT STATEMENT   |      |    1 | 19312   (8)| 00:03:52 |
    
    |   1 |  SORT AGGREGATE    |      |    1 |           |      |
    
    |   2 |   TABLE ACCESS FULL| T      |   289M| 19312   (8)| 00:03:52 |
    
    -------------------------------------------------------------------
    
    Statistics
    
    ----------------------------------------------------------
    
          65727  consistent gets
    
          12258  physical reads
     

    SQL> create index idx_t_1 on t(object_id);
    Index created.
    SQL> alter table t modify object_id not null;
    Table altered.
    SQL> set autotrace on SQL> select count(*) from t; | Id  | Operation          | Name    | Rows    | Cost (%CPU)| Time    | ------------------------------------------------------------------------- |   0 | SELECT STATEMENT      |     |     1 |  2998   (1)| 00:00:36 | |   1 |  SORT AGGREGATE       |     |     1 |         |        | |   2 |   INDEX FAST FULL SCAN| IDX_T_1 |  5518K|  2998   (1)| 00:00:36 | ------------------------------------------------------------------------- Statistics ----------------------------------------------------------       10865  consistent gets
    SQL> create bitmap index idx_map_t on t(status);
    Index created.
    SQL> select count(*) from t;
      COUNT(*) ----------    4628864
    SQL> select count(*) from t; | Id  | Operation              | Name      | Rows  | Cost (%CPU)| Time      | ----------------------------------------------------------------------------------- |   0 | SELECT STATEMENT          |       |    1 |  113   (0)| 00:00:02 | |   1 |  SORT AGGREGATE           |       |    1 |           |      | |   2 |   BITMAP CONVERSION COUNT     |       |  5518K|   113   (0)| 00:00:02 | |   3 |    BITMAP INDEX FAST FULL SCAN| IDX_MAP_T |      |           |      | Statistics ----------------------------------------------------------     123  consistent gets
  • 즉석에서 일기 절 진 조회:
  • 인구 센서 스에 서 우 리 는 성별, 연령 범위, 출생지 등 다 차원 적 인 분석 통 계 를 사용 하 는데 이런 다 차원 조 회 는 즉석 조회 라 고 할 수 있다.
    select * from t where col1=xxx and col2=xxx and col3=xxx and col4=xxx...

  • 구조 표 t 는 다음 과 같다. 성별, 연령 범위, 출생지 등 필드 가 있다.
    create table t
    
    (id, gender not null,location not null,age not null,data) as
    
    select rownum,
    
        decode(ceil(dbms_random.value(0,2)),1,'M',2,'F') gender,
    
        ceil(dbms_random.value(1,50)) location,
    
        decode(ceil(dbms_random.value(0,3)),1,'child',2,'young',3,'middle_age',4,'old'),
    
        rpad('*',20,'*')
    
    from dual
    
    connect by rownum<=100000;
    
    
    
    set autotrace traceonly
    
    SQL> select * from t where gender='M' and location in (1,10,30) and age='child';
    
    
    
    658 rows selected.
    
    | Id  | Operation      | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    
    --------------------------------------------------------------------------
    
    |   0 | SELECT STATEMENT  |     |   671 | 31537 |   171   (1)| 00:00:03 |
    
    |*  1 |  TABLE ACCESS FULL| T     |   671 | 31537 |   171   (1)| 00:00:03 |
    
    
    
       1 - filter("GENDER"='M' AND ("LOCATION"=1 OR "LOCATION"=10 OR
    
              "LOCATION"=30) AND "AGE"='child')
    
    Statistics
    
    ----------------------------------------------------------
    
        652  consistent gets
    
          16290  bytes sent via SQL*Net to client
    
    
    
    --     ,      ;                  。oracle      
    
    SQL> create index idx_union on t(gender,location,age);
    
    
    
    Index created.
    
    
    
    SQL> select * from t where gender='M' and location in (1,10,30) and age='child';
    
    
    
    658 rows selected.
    
    
    
    
    
    Execution Plan
    
    ----------------------------------------------------------
    
    Plan hash value: 306189815
    
    
    
    ------------------------------------------------------------------------------------------
    
    | Id  | Operation             | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
    
    ------------------------------------------------------------------------------------------
    
    |   0 | SELECT STATEMENT         |         |   671 | 31537 |     6   (0)| 00:00:01 |
    
    |   1 |  INLIST ITERATOR         |         |     |     |          |      |
    
    |   2 |   TABLE ACCESS BY INDEX ROWID| T     |   671 | 31537 |     6   (0)| 00:00:01 |
    
    |*  3 |    INDEX RANGE SCAN         | IDX_UNION |     1 |     |     5   (0)| 00:00:01 |
    
    
    
    Statistics
    
    ----------------------------------------------------------
    
        635  consistent gets
    
          36405  bytes sent via SQL*Net to client
    
    --     
    
    SQL> create bitmap index idx_gender on t(gender);
    
    SQL> create bitmap index idx_age on t(age);
    
    SQL> create bitmap index idx_loc on t(location);
    
    SQL> select * from t where gender='M' and location in (1,10,30) and age='young';
    
    657 rows selected.
    
    | Id  | Operation             | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
    
    ------------------------------------------------------------------------------------------
    
    |   0 | SELECT STATEMENT         |         |   622 | 29234 |     6   (0)| 00:00:01 |
    
    |   1 |  INLIST ITERATOR         |         |     |     |          |      |
    
    |   2 |   TABLE ACCESS BY INDEX ROWID| T     |   622 | 29234 |     6   (0)| 00:00:01 |
    
    |*  3 |    INDEX RANGE SCAN         | IDX_UNION |     1 |     |     5   (0)| 00:00:01 |
    
    ------------------------------------------------------------------------------------------
    
    
    
       3 - access("GENDER"='M' AND ("LOCATION"=1 OR "LOCATION"=10 OR "LOCATION"=30)
    
              AND "AGE"='young')
    
    Statistics
    
    ----------------------------------------------------------
    
        637  consistent gets
    
          36355  bytes sent via SQL*Net to client

  • bitmap 색인 의 단점:
  • 건국 bitmap 색인 에 열 삽입 값 을 제출 하지 않 았 을 때 이 특정한 값 의 줄 을 수정 하거나 삽입 할 수 없습니다.
  • id 값 에 대해 bitmap 색인 을 만 들 수 없습니다. 대 비 는 다음 과 같 습 니 다.
    SQL> create bitmap index idx_btid on t(id);
    
    SQL> set autotrace traceonly
    
    SQL> select count(*) from t;
    
    | Id  | Operation       | Name | Rows  | Cost (%CPU)| Time      |
    
    -------------------------------------------------------------------
    
    |   0 | SELECT STATEMENT   |      |    1 |  1675   (1)| 00:00:21 |
    
    |   1 |  SORT AGGREGATE    |      |    1 |           |      |
    
    |   2 |   TABLE ACCESS FULL| T      |  1081K|  1675   (1)| 00:00:21 |---     :
    
    Statistics
    
    ----------------------------------------------------------
    
           6140 consistent gets
    
           6051  physical reads
    
    --     
    
    SQL> select /*+index(t,idx_btid)*/ count(*) from t;
    
    | Id  | Operation         | Name     | Rows  | Cost (%CPU)| Time     |
    
    -----------------------------------------------------------------------------
    
    |   0 | SELECT STATEMENT     |        |      1 |  3563   (1)| 00:00:43 |
    
    |   1 |  SORT AGGREGATE      |        |      1 |         |        |
    
    |   2 |   BITMAP CONVERSION COUNT|        |  1081K|  3563   (1)| 00:00:43 |
    
    |   3 |    BITMAP INDEX FULL SCAN| IDX_BTID |        |         |        |
    
    -----------------------------------------------------------------------------
    
    Statistics
    
    ----------------------------------------------------------
    
           3563 consistent gets
    
           3494  physical reads


  • 원리:
  • 특정 필드 의 모든 가능 한 값 을 하나의 비트 맵 으로 만 들 고 각 비트 맵 은 0 과 1 로 저장 합 니 다.
  • 예 를 들 어 성별 이라는 필드 는 남자 와 여자 의 값 이다.남자 와 여자 두 장의 비트 맵 이 있 습 니 다. 모든 비트 맵 에서 비트 순 서 는 이 표 의 특정 기록 (rowid 로 가정) 에 대응 합 니 다. 남자 비트 맵 이 0011100 이면 이 표 는 7 개의 기록 이 있 고 3 - 5 조 기록 의 값 만 남자 라 는 것 을 의미 합 니 다. 이 자리 들 은 rowid 를 직접 찾 을 수 있 고 0 인 자 리 는 rowid 를 찾 을 수 없습니다.상대 적 으로 여자: 1100011.
  • 만약 에 이 표 에 또 다른 필드 지역 이 있다 면 각각 3 개의 값 A 구역, B 구역, C 구역 이 있 으 면 A, B 와 C3 개의 비트 맵 이 있 고 그들의 값 을
  • 로 가정 한다.
  • A:1000100;
  • B:0100001;
  • C:0011010;그럼 남자 와 여자 의 가입:
  • 남: 0011100;
  • 여자: 1100011;
  • A 구역 에 있 는 여 자 를 찾 으 려 면 위의 줄 1 과 줄 5 를 연산 하고 새로운 비트 맵 을 얻 습 니 다. 1000000 은 첫 번 째 기록 이 조건 에 부합 한 다 는 것 을 나타 내 면 비트 맵 을 통 해 해당 하 는 rowid 를 직접 얻 을 수 있 습 니 다.
  • 비트 맵 의 압축: 비트 맵 의 알고리즘 은 비트 맵 뒤의 모든 0 을 생략 할 수 있 습 니 다. 예 를 들 어 A: 1000100 = A: 100001.
  • 비트 맵 의 잠 금: 5 에서 알 수 있 듯 이 새로운 1 이 추가 되 었 을 때 만 비트 맵 이 바 뀌 고 비트 맵 이 바 뀌 었 을 때 가리 키 는 rowid 가 모두 잠 겨 수정 할 수 없습니다.이 때문에 비트 맵 은 조회 에 만 적합 합 니 다.
  • 중복 도가 낮은 비트 맵 색인 은 커 졌 다. 만약 에 특정한 열 에 100 개의 서로 다른 값, 100 만 열 이 있다 면 이 비트 맵 색인 의 크기 는 약 1 억 자리 이다.100 만 개의 서로 다른 값, 100 만 열 이 있다 면 크기 는 약 1 조 자리 / 2 = 5 천 억 자리 로 엄 청 난 숫자 다.이것 이 바로 비트 맵 색인 의 취약 점 입 니 다.

  • 함수 인덱스:
  • 열 연산 은 색인 을 작용 을 잃 게 한다. 비교 하면 다음 과 같다.
    SQL> create table t as select * from dba_objects;
    
    SQL> create index idx_id on t(object_id);
    
    SQL> create index idx_name on t(object_name);
    
    SQL> create index idx_crt on t(created);
    
    --
    
    SQL> select * from t where upper(object_name)='T';
    
    | Id  | Operation      | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    
    --------------------------------------------------------------------------
    
    |   0 | SELECT STATEMENT  |     |    12 |  2484 |   289   (1)| 00:00:04 |
    
    |*  1 |  TABLE ACCESS FULL| T     |    12 |  2484 |   289   (1)| 00:00:04 |
    
    --------------------------------------------------------------------------
    
    Statistics
    
    ----------------------------------------------------------
    
           1036  consistent gets
    
    --          
    
    SQL> create index idx_fx on t(upper(object_name));
    
    SQL> select * from t where upper(object_name)='T';
    
    | Id  | Operation            | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
    
    --------------------------------------------------------------------------------------
    
    |   0 | SELECT STATEMENT        |         |     707 |     188K|     151   (0)| 00:00:02 |
    
    |   1 |  TABLE ACCESS BY INDEX ROWID| T      |     707 |     188K|     151   (0)| 00:00:02 |
    
    |*  2 |   INDEX RANGE SCAN        | IDX_FX |     283 |         |       3   (0)| 00:00:01 |
    
    --------------------------------------------------------------------------------------
    
    Statistics
    
    ----------------------------------------------------------
    
          5  consistent gets

  • 열 연산 을 피 하 는 전형 적 인 사례
    select * from t where object_id-10<30;--          
    
    set autotrace traceonly
    
    set linesize 1000
    
    --------------------------------------------------------------------------
    
    | Id  | Operation      | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    
    --------------------------------------------------------------------------
    
    |   0 | SELECT STATEMENT  |     |    12 |  2484 |   289   (1)| 00:00:04 |
    
    |*  1 |  TABLE ACCESS FULL| T     |    12 |  2484 |   289   (1)| 00:00:04 |
    
    --------------------------------------------------------------------------
    
    select * from t where object_name like 'CLUS%';--   ,      :
    
    select * from t where substr(object_name,1,4)='CLUS';
    
    select * from t where created>=to_date('2010-10-02','YYYY-MM-DD') AND created<to_date('2010-10-03','YYYY-MM-DD')+1; --  sql
    
    select * from t where trunc(created)>=to_date('2010-10-02','YYYY-MM-DD') and trunc(created)<=to_date('2010-10-03','YYYY-MM-DD');
    
    -- :created   :2011/12/7   22:18:33, trunc(created) :2011/12/7


  • 색인 고전 사례:
  • count (*) 조회 가 많 고 색인 이 빨 라 집 니 다.
  • 소량 반환, 잦 은 조작 열 에 조합 색인 을 추가 합 니 다.
  • Max / min 의 열 에 색인 을 추가 합 니 다.
  • 파 티 션 색인, 조회 한 sql 은 파 티 션 조건 을 추가 해 야 합 니 다. 그렇지 않 으 면 각 파 티 션 색인 을 옮 겨 다 닐 것 입 니 다.
  • 불필요 한 order by 조작 제거
  • 정렬 된 열 에 색인 추가
  • 비트 맵 색인 은 자주 수정 되 는 열 에 세 워 져 있 습 니까?
  • 불필요 한 색인 제거
  • 좋은 웹페이지 즐겨찾기