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 倍高速化するために必要な変更に過ぎませんでした