Oracle compressed/b-tree 索引如何以及何时使用
Oracle compressed/b-tree index how and when to use
我想向 Oracle 应用程序工作流添加压缩索引 table hr.pqh_ss_transaction_history
以便访问特定类型的工作流 (process_name
) 和特定人员的工作流 (selected_person_id
).
尽管数据有偏差,但 process_name
中有很多重复值。但是,我想访问 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_person_id 显然会 select 更有活力。不幸的是,此列有 3774 个空值,此后的最高计数是一个人的 73 个。很多人只会有 1 行。总行数为 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 版。
我认为在 selected_person_id
上放置一个非压缩的 b-tree 索引是个好主意,因为值 returned 将落在总行的不到 5% 中场景,但是当您使用 nvl(psth.selected_person_id, :p_person_id) = :p_person_id
select 时,您如何处理不会进入索引的列中的空值?有没有更有效的方法来编写 sql 以及你应该如何创建这个索引?
对于process_name
,我想使用压缩的 b 树索引。我假设声明是
CREATE INDEX idxname ON pqh_ss_transaction_history(process_name) COMPRESS
其中 rowid
会有一个隐含的第二列。在这里使用 rowid 是否安全,因为通常不建议使用 rowid?倾斜的数据是一个问题吗(大多数时候我会 select 在高容量方面)?我不明白压缩索引的效率如何。对于 b-tree 索引,您通常需要 return 5% 的数据,否则完整 table 扫描实际上更有效。压缩索引 return 如此多 rowids
,然后使用那些 rowids
查找完整 table,如何比完整 table 扫描更快?
或者因为优化器只能使用两个索引之一,我应该创建一个未压缩的基于函数的索引,将 selected_person_id
和 process_name
连接起来吗?
也许你可以创建这个索引:
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
我想向 Oracle 应用程序工作流添加压缩索引 table hr.pqh_ss_transaction_history
以便访问特定类型的工作流 (process_name
) 和特定人员的工作流 (selected_person_id
).
尽管数据有偏差,但 process_name
中有很多重复值。但是,我想访问 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_person_id 显然会 select 更有活力。不幸的是,此列有 3774 个空值,此后的最高计数是一个人的 73 个。很多人只会有 1 行。总行数为 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 版。
我认为在 selected_person_id
上放置一个非压缩的 b-tree 索引是个好主意,因为值 returned 将落在总行的不到 5% 中场景,但是当您使用 nvl(psth.selected_person_id, :p_person_id) = :p_person_id
select 时,您如何处理不会进入索引的列中的空值?有没有更有效的方法来编写 sql 以及你应该如何创建这个索引?
对于process_name
,我想使用压缩的 b 树索引。我假设声明是
CREATE INDEX idxname ON pqh_ss_transaction_history(process_name) COMPRESS
其中 rowid
会有一个隐含的第二列。在这里使用 rowid 是否安全,因为通常不建议使用 rowid?倾斜的数据是一个问题吗(大多数时候我会 select 在高容量方面)?我不明白压缩索引的效率如何。对于 b-tree 索引,您通常需要 return 5% 的数据,否则完整 table 扫描实际上更有效。压缩索引 return 如此多 rowids
,然后使用那些 rowids
查找完整 table,如何比完整 table 扫描更快?
或者因为优化器只能使用两个索引之一,我应该创建一个未压缩的基于函数的索引,将 selected_person_id
和 process_name
连接起来吗?
也许你可以创建这个索引:
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