代码之家  ›  专栏  ›  技术社区  ›  Superdooperhero

Oracle压缩/b树索引如何以及何时使用

  •  0
  • Superdooperhero  · 技术社区  · 7 年前

    我想向Oracle Applications工作流表添加压缩索引 hr.pqh_ss_transaction_history 为了访问特定类型的工作流( process_name )以及特定人员的工作流( selected_person_id ).

    中有许多重复值 process\u名称 尽管数据有偏差。但是,我想访问 TFG_HR_NEW_HIRE_PLACE_JSP_PRC TFG_HR_TERMINATION_JSP_PRC 流程类型。

    "PROCESS_NAME","CNT"
    "HR_GENERIC_APPROVAL_PRC",40347
    "HR_PERSONAL_INFO_JSP_PRC",39284
    "TFG_HR_NEW_HIRE_PLACE_JSP_PRC",18117
    "TFG_HREMPSTS_TERMS_CHG_JSP_PRC",14076
    "TFG_HR_TERMINATION_JSP_PRC",8764
    "HR_ADV_INDIVIDUAL_COMP_PRC",4907
    "TFG_HR_SIT_NOAPP",3979
    "TFG_YE_TAX_PROV",2663
    "HR_TERMINATION_JSP_PRC",1310
    "HR_CHANGE_PAY_JSP_PRC",953
    "TFG_HR_SIT_EXIT_JSP_PRC",797
    "HR_SIT_JSP_PRC",630
    "HR_QUALIFICATION_JSP_PRC",282
    "HR_CAED_JSP_PRC",250
    "TFG_HR_EMP_TERM_JSP_PRC",211
    "PER_DOR_JSP_PRC",174
    "HR_AWARD_JSP_PRC",101
    "TFG_HR_SIT_REP_MOT",32
    "TFG_HR_SIT_NEWPOS_NIB_JSP_PRC",30
    "TFG_HR_SIT_NEWPOS_INBU_JSP_PRC",28
    "HR_NEW_HIRE_PLACE_JSP_PRC",22
    "HR_NEWHIRE_JSP_PRC",6
    

    selected\u person\u id显然更具选择性。不幸的是,此列有3774个空值,之后的最高计数为73个。很多人只有一排。总行数为136963。

    我的查询将采用以下格式:

    select psth.item_key,
           psth.creation_date,
           psth.last_update_date
    from   hr.pqh_ss_transaction_history psth
    where  nvl(psth.selected_person_id, :p_person_id) = :p_person_id
    and    psth.process_name = 'HR_TERMINATION_JSP_PRC'
    order  by psth.last_update_date
    

    我使用的是Oracle 12c版本1。

    我认为在 选定的\u person\u id 由于返回的值将落在总行数不到5%的情况下,但是如何处理列中的空值,当您选择使用 nvl(psth.selected_person_id, :p_person_id) = :p_person_id ? 有没有更有效的方法来编写sql?您应该如何创建此索引?

    对于 process\u名称 我想使用压缩的b树索引。我假设这个声明是

    CREATE INDEX idxname ON pqh_ss_transaction_history(process_name) COMPRESS 
    

    其中会有一个隐式的第二列 rowid . 在这里使用rowid是否安全,因为通常不建议使用rowid?扭曲的数据是否是一个问题(大多数情况下,我会选择高容量的数据)?我不明白压缩索引的效率有多高。对于b树索引,您通常希望返回5%的数据,否则完整表扫描实际上更有效。压缩索引如何返回这么多 rowids 然后使用这些 rowids公司 ,比全表扫描快?

    或者,由于优化器只能使用这两个索引中的一个,我应该使用 选定的\u person\u id process\u名称 连接?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Tony Andrews    7 年前

    也许您可以创建以下索引:

    CREATE INDEX idxname ON pqh_ss_transaction_history
      (process_name, NVL(selected_person_id,-1)) COMPRESS 1
    

    然后将查询更改为:

    select psth.item_key,
           psth.creation_date,
           psth.last_update_date
    from   hr.pqh_ss_transaction_history psth
    where  nvl(psth.selected_person_id, -1) in (:p_person_id,-1)
    and    psth.process_name = 'HR_TERMINATION_JSP_PRC'
    order  by psth.last_update_date