1

Progress 10.1 では、クエリで複数のインデックスが使用されている場合、データベースはインデックスのリストの最初のインデックスを使用し、最適なものではなく、2 つのインデックスのサブセットではないことがわかりました。

他の誰かがこれを経験しましたか?

================================================== ===============

いくつかのインデックスが定義されていますが、ここで見ているのは次の 2 つです。

XIE2cac_role_person contract_obj person_role_code effective_from_date

当初、私のコードは次のとおりで、はるかに大きなデータセットを返す最初のインデックスを使用していました。

FOR EACH cac_role_person NO-LOCK 
        WHERE cac_role_person.contract_obj = cbm_contract.contract_obj 
          AND cac_role_person.owning_entity_mnemonic = "BROKER"
          AND (
              (cac_role_person.effective_to_date > TODAY 
          AND  cac_role_person.effective_to_date >=  
               cbm_contract_component.contract_component_start_date)
           OR (cac_role_person.effective_to_date = ? 
          AND cac_role_person.effective_from_date <=                  
              cbm_contract_component.contract_component_start_date)
              ):

したがって、2番目のインデックスを使用するように強制します。

FOR EACH cac_role_person NO-LOCK USE-INDEX XIE2cac_role_person
        WHERE cac_role_person.contract_obj = cbm_contract.contract_obj 
          AND cac_role_person.owning_entity_mnemonic = "BROKER"
          AND (
              (cac_role_person.effective_to_date > TODAY 
          AND  cac_role_person.effective_to_date >=  
               cbm_contract_component.contract_component_start_date)
           OR (cac_role_person.effective_to_date = ? 
          AND cac_role_person.effective_from_date <=                  
              cbm_contract_component.contract_component_start_date)
              ):

最初のコードでは 30 時間で約 4,000 件の修正が行われ、改善により 12 時間で 70,000 件の修正が行われました。(ループはより大きな部分の一部ですが、これは処理を 17 倍高速化するために必要な変更に過ぎませんでした

4

1 に答える 1