提示SQL查询已连接表包含百万条记录

时间:2014-11-05 22:18:19

标签: sql oracle join aggregate-functions hint

我的下面的查询平均花费超过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.

你能帮助更好地解决这个问题吗?如果需要有关于表格的任何其他信息,请告诉我。这些表格也没有收集统计​​数据。

1 个答案:

答案 0 :(得分:1)

<击> 您的查询计划显示HINT = RULE。这是为什么?这是dbms中的标准设置吗?为什么不使用优化器?您可以使用/*+CHOOSE*/。这可能是所有需要的。 (为什么表上没有统计数据?)

编辑:以上是无稽之谈。通过不收集任何统计信息,您可以阻止优化程序执行其工作。它总会回归到旧的规则,因为它没有计算成本的基础并找到更好的计划。很奇怪,你自愿让dbms不能快速得到你的查询。当然,您可以在查询中使用提示,但在表数据发生显着变化时,请务必检查并更改它们。更好地收集统计信息并让优化器完成这项工作。至于有用的提示:

我的感觉是:在CM_CONTRACT_DETAIL上有很多标准,这应该是驱动表。您可以使用/*+LEADING(a)*/强制执行此操作。甚至可以在该表/*+FULL(a)*/上使用全表扫描,您仍然可以通过并行执行来加速:/*+PARALLEL(a,4)*/

祝你好运: - )