>

Oracle Applications 워크 플로 테이블 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는 분명히 더 선택적입니다. 불행히도이 칼럼에는 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을 사용하고 있습니다.

selected_person_id 에 압축되지 않은 b-tree 인덱스를 넣는 것이 좋습니다.  리턴 된 값이 총 행 시나리오의 5 % 미만에 해당하지만 nvl(psth.selected_person_id, :p_person_id) = :p_person_id 를 사용하여 선택할 때 인덱스로 들어 가지 않는 열의 널을 어떻게 처리합니까? ? SQL을 작성하는 더 효율적인 방법이 있습니까? 어떻게이 색인을 작성해야합니까?

process_name  압축 된 b- 트리 인덱스를 사용하고 싶습니다. 진술 문이

CREATE INDEX idxname ON pqh_ss_transaction_history(process_name) COMPRESS

rowid 에 대한 내재 된 두 번째 열이있는

. rowid를 사용하는 것이 좋지 않기 때문에 여기서 rowid를 사용하는 것이 안전합니까? 비뚤어진 데이터가 문제가됩니까 (대부분의 경우 볼륨면에서 선택하는 경우)? 압축 인덱스가 얼마나 효율적인지 이해하지 못합니다. b- 트리 인덱스의 경우 일반적으로 데이터의 5 %를 반환하려고합니다. 그렇지 않으면 전체 테이블 스캔이 실제로 더 효율적입니다. 압축 인덱스는 어떻게 많은 rowids 를 반환합니까?  그런 다음 rowids 를 사용하여 전체 테이블을 조회하십시오. 전체 테이블 스캔보다 빠릅니까?

또는 최적화 프로그램이 selected_person_id 를 사용하여 압축되지 않은 함수 기반 색인을 작성 해야하는 경우 두 색인 중 하나만 사용할 수 있기 때문에  그리고 process_name  연결?

  • 답변 # 1

    아마도이 색인을 만들 수 있습니다 :

    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
    
    

  • 이전 tomcat - Dockerfile에 선언 된 환경 변수에 어떻게 액세스 할 수 있습니까?
  • 다음 mysql - 문자열의 마지막 문자와 첫 번째 문자를 찾기위한 정규식