zoukankan      html  css  js  c++  java
  • 索引瘦身_oracle_11g

    假设一个表,10个列,字段列长度分布均匀。

    一个表10G,那么一个列的索引+rowid,肯定是在1G+

    例如有个场景:一个客户数据库,一个业务表,记录STATUS状态列,欠费A,正常B。

    如果没到月底,只统计欠费的少量数据,如何创建相匹配的索引。

    如果一个表有1个亿,欠费数量只有500时! 如果常规创建索引SQL>create index cc_status on A(status);  索引将非常大!

    此事,可以使用如下测试方式,进行索引瘦身:

    1.优点,索引变小;

    2.缺点:或者说使用索引的SQL需要改写或者与该函数索引相匹配。

    一、测试用法

    SQL> conn tt/tt
    Connected.
    SQL> create table b as select * from dba_objects;
    SQL> select count(*) from b where status='INACTIVE';
      COUNT(*)
    ----------
             0
    SQL> update b set status='INACTIVE' where rownum=1;
    update b set status='INACTIVE' where rownum=1
                        *
    ERROR at line 1:
    ORA-12899: value too large for column "TT"."B"."STATUS" (actual: 8, maximum: 7)
    SQL> alter table b modify STATUS varchar2(10);
    Table altered.
    SQL>  update b set status='INACTIVE' where rownum=1;
    1 row updated.
    SQL> commit;
    Commit complete.
    SQL> create index cc_ind_status on b(case when STATUS='INACTIVE' then 1 else null end);
    Index created.
    SQL> select count(*) from b where STATUS='INACTIVE';
      COUNT(*)
    ----------
             1
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 749587668
    
    ---------------------------------------------------------------------------
    | Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    ---------------------------------------------------------------------------
    |   0 | SELECT STATEMENT   |      |     1 |     7 |   345   (1)| 00:00:05 |
    |   1 |  SORT AGGREGATE    |      |     1 |     7 |            |          |
    |*  2 |   TABLE ACCESS FULL| B    |    14 |    98 |   345   (1)| 00:00:05 |
    ---------------------------------------------------------------------------
    select count(*) from b where (case when STATUS='INACTIVE' then 1 else null end)=1;
    SQL> select count(*) from b where (case when STATUS='INACTIVE' then 1 else null end)=1
      COUNT(*)
    ----------
             1
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 1978997881
    -----------------------------------------------------------------------------------
    | Id  | Operation         | Name          | Rows  | Bytes | Cost (%CPU)| Time     |
    -----------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |               |     1 |     3 |     1   (0)| 00:00:01 |
    |   1 |  SORT AGGREGATE   |               |     1 |     3 |            |          |
    |*  2 |   INDEX RANGE SCAN| CC_IND_STATUS |     1 |     3 |     1   (0)| 00:00:01 |
    -----------------------------------------------------------------------------------
    Predicate Information (identified by operation id):
    ---------------------------------------------------
       2 - access(CASE "STATUS" WHEN 'INACTIVE' THEN 1 ELSE NULL END =1)
    Note
    -----
       - dynamic sampling used for this statement (level=2)

    二、对比大小

    SQL> create index cc_ind_status_2 on b(status);

    SQL>select SEGMENT_NAME,BYTES/1024/1024 from user_segments where SEGMENT_NAME like 'CC_IND_STA%';

    SEGMENT_NAME BYTES/1024/1024
    -------------------- ---------------
    CC_IND_STATUS       .0625
    CC_IND_STATUS_2        2

    SQL> analyze table b compute statistics;  

    SQL> select INDEX_NAME,NUM_ROWS from user_indexes where INDEX_NAME like 'CC_IND_STA%';

    INDEX_NAME NUM_ROWS
    ------------------------------------------------------------ ----------
    CC_IND_STATUS 1
    CC_IND_STATUS_2 86341

  • 相关阅读:
    hdoj 3376,2686 Matrix Again 【最小费用最大流】
    Trustie站点代码托管使用指南
    POJ 2442 Sequence(堆的使用练习)
    猛犸机器学习开发实践
    关于《金字塔原理》的主要内容
    实战案例:如何快速打造1000万+播放量的抖音网红?
    【限时特惠】网易云易盾验证码全线95折!智能无感知、滑动拼图、点选验证-7天免费体验!
    当GDPR来敲门,中国互联网企业该如何应对?
    H5活动产品设计指南基础版
    Box(视图组件)如何在多个页面不同视觉规范下的复用
  • 原文地址:https://www.cnblogs.com/lvcha001/p/13357038.html
Copyright © 2011-2022 走看看