我发现在 Progress 10.1 中,当查询中使用多个索引时,数据库将使用索引列表中的第一个索引,而不是最佳索引,也不是两个索引的子集。
有没有其他人经历过这个?
==================================================== ================
定义了几个索引,但我们正在查看的两个是: XIE1cac_role_person owning_entity_mnemonic owning_entity_key role_key
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)
):
所以我现在强制它使用第二个索引:
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 倍的更改