select  t.endorse_id,
                               t.contract_id,
                               t.policy_id,
                               t.product_id,
                               t.validate_date,
                               t.end_date,
                               trt.treaty_type,
                               t.treaty_id,
                               (t.sar-t.risar)*t.exchange_rate as rtsar
                          from t_ri_contract_log       t,
                               t_ri_contract_reinsurer trcr,
                               t_ri_treaty trt,
                              t_ri_endorse tre                         where                tre.endorse_id = (select max(t1.endorse_id)
                                               from t_ri_contract_log t0,
                                                    t_ri_endorse t1
                                              where t0.policy_id = t.policy_id
                                                and t0.product_id = t.product_id
                                                and t0.endorse_id < t.endorse_id
                                                and t1.endorse_id=t0.endorse_id
                                                and t1.endorse_date>=to_date(s_date, 'ddmmyyyy')
                                                and t1.endorse_date<=to_date(e_date, 'ddmmyyyy'
))
                           
                           and    t.contract_id = trcr.contract_id
                           and trcr.reinsurer_code=reinsurer
                           and t.treaty_id=trt.treaty_id红色那块的相关子查询很占资源,速度极其慢,怎么避免相关字查询,有什么方案可以代替?那段子查询的意思是  先要从主查询中取得 t.policy_id, t.product_id, t.endorse_id,然后取得policy_id相等,product_id相等的endorse最大的那一行

解决方案 »

  1.   

    再有是使用in,还是使用exists都是有说头的,如果2个表的数据量相差很大的话。
      

  2.   

    或者就我这个sql优化一下,让我学习学习是怎么优化的,例子比较容易懂...thanks
      

  3.   

    lz的SQL写的有问题,逻辑应该是错的。
    t_ri_endorse 这个表没有看到和其他表关联,会导致笛卡尔集。
    而且如果不需要取出t_ri_endorse表中的字段的话,建议用exists
      

  4.   

    是不要取出,我只需要判断在那个时间是否有记录,但是我用exists还是很慢啊,怎么样把这个子查询给优化一下呢,数据量比较大,这个子查询的笛卡尔积很严重...
      

  5.   

    在你的只查询中加上这个试试/*+ no_unnest */ select max(t1.endorse_id) /*+ no_unnest */ 
    from t_ri_contract_log t0
      

  6.   

    如果根据楼主描述,速度慢只是子查询,那就要先了解下子查询的2个表t_ri_contract_log t0和t_ri_endorse t1的数据大小,如果数据量非常大,就得分析
    1、t_ri_contract_log 的policy_id 和product_id是否有索引;
    2、t_ri_endorse的endorse_id是否有索引,如果没有,就要看endorse_date是否有索引。检查完后,如果表数据量大,却没有索引,慢是理所当然的。最后建议楼主拿具体的数据,进行确认速度慢是否真的是子查询引起的。
      

  7.   

    where子句里=的放最后面,其次筛选掉多的字段的放后面
    希望对你有用
      

  8.   

    t_ri_endorse tre并没有和其他的表进行关联,也没有出现在select中,
    所以,你的sql本身是否存在问题呢?