我的下面的查询平均花费超过5秒来获取通过应用程序多次触发的事务中的数据。我正在寻找一个提示,可以帮助我减少每次触发此查询所需的时间。我的条件是我无法添加任何索引或更改此查询的任何应用程序设置。因此,oracle提示或更改查询结构是我唯一的选择。请在下面查询我的问题。
SELECT SUM(c.cash_flow_amount) FROM CM_CONTRACT_DETAIL a ,CM_CONTRACT b,CM_CONTRACT_CASHFLOW c
WHERE a.country_code = Ip_country_code
AND a.company_code = ip_company_code
AND a.dealer_bp_id = ip_bp_id
AND a.contract_start_date >= ip_start_date
AND a.contract_start_date <= ip_end_date
AND a.version_number = b.current_version
AND a.status_code IN ('00','10')
AND a.country_code = b.country_code
AND a.company_code = b.company_code
AND a.contract_number = b.contract_number
AND a.country_code = c.country_code
AND a.company_code = c.company_code
AND a.contract_number = c.contract_number
AND a.version_number = c.version_number
AND c.cash_flow_type_code IN ('07','13');
关于表的事项是它们都是事务表,并且该表的数据每天都在变化。他们的数量为1至10卢布。 这是当前关于查询的解释计划:
操作对象名称行字节成本对象节点输入/输出PStart PStop
SELECT STATEMENT Hint=RULE
SORT AGGREGATE
TABLE ACCESS BY INDEX ROWID CM_CONTRACT_CASHFLOW
NESTED LOOPS
NESTED LOOPS
TABLE ACCESS BY INDEX ROWID CM_CONTRACT_DETAIL
INDEX RANGE SCAN XIF760CT_CONTRACT_DETAIL
TABLE ACCESS BY INDEX ROWID CM_CONTRACT
INDEX UNIQUE SCAN XPKCM_CONTRACT
INDEX RANGE SCAN XPKCM_CONTRACT_CASHFLOW
Indexes on CM_CONTRACT_DETAIL:
XPKCM_CONTRACT_DETAIL is a composite unique index on country_code, company_code, contract_number and version_number
XIF760CT_CONTRACT_DETAIL is a non unique index on dealer_bp_id
Indexes on CM_CONTRACT:
XPKCM_CONTRACT is a composite unique index on country_code, company_code, contract_number
Indexes on CM_CONTRACT_CASHFLOW:
XPKCM_CONTRACT_CASHFLOW is a composite unique index on country_code, company_code, contract_number and version_number,supply_sequence_number, cash_flow_type_code,payment_date.
你能帮助更好地解决这个问题吗?如果需要有关于表格的任何其他信息,请告诉我。这些表格也没有收集统计数据。
答案 0 :(得分:1)
<击>
您的查询计划显示HINT = RULE。这是为什么?这是dbms中的标准设置吗?为什么不使用优化器?您可以使用/*+CHOOSE*/
。这可能是所有需要的。 (为什么表上没有统计数据?)
击>
我的感觉是:在CM_CONTRACT_DETAIL上有很多标准,这应该是驱动表。您可以使用/*+LEADING(a)*/
强制执行此操作。甚至可以在该表/*+FULL(a)*/
上使用全表扫描,您仍然可以通过并行执行来加速:/*+PARALLEL(a,4)*/
。