我想向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名称
连接?