试试看(不知道对不对啊,呵呵)
一、
把各段SELECT后面那部分
AND ( LC.PARTNER_ID IN (....
使用OR连接起来,应该就能够变成一个SELECT,这样看起来最起码舒服些
二、
想想办法把 IN 转化为直接等于的形式,这样效率应该能提升很多,缺点是可读性较差
三、
想办法把DISTINCT去掉,如果在SELECT中能够确定返回结果唯一则尽量不要加DISTINCT也不知道俺说得对不对,诸位不要拿板砖拍得太很啊~~~—————————————————————————————————
该死的CSDN,把旧帖子都TMD删了,气死我了!!!

解决方案 »

  1.   

    优化结果如下(贴主最好多看点SQL的基本知识):SELECT DISTINCT jo.journal_id, jo.account_code, jo.department_id,
                    jo.debit_standard_amt, jo.credit_standard_amt,
                    jo.double_entry_date, jo.double_entry_id,
                    ac.gmss_p_l_class_id, lc.partner_id
               FROM ag_journal jo,
                    ma_account_code ac,
                    lc_receive_payment_head lc,
                    p_l_class_id ci,
                    lg_double_entry_head ldeh,
                    ag_double_entry_head adeh
              WHERE jo.account_code = ac.account_code
                AND ac.gmss_p_l_class_id = ci.pl_class_id
                AND ldeh.seq_no = adeh.seq_no
                AND adeh.double_entry_id = jo.double_entry_id
                AND (   lc.source_id = ldeh.source_id
                     OR (lc.partner_id, ldeh.source_id) IN (
                           SELECT partner_id, ap_id
                             FROM ap_ap_head
                           UNION ALL
                           SELECT partner_id, ar_id
                             FROM ar_ar_head
                           UNION ALL
                           SELECT partner_id, disposal_id
                             FROM ap_ap_head aah, ap_disposal ad
                            WHERE aah.ap_id = ad.ap_id
                           UNION ALL
                           SELECT partner_id, disposal_id
                             FROM ar_ar_head aah, ar_disposal ad
                            WHERE aah.ar_id = ad.ar_id)
                    )
      

  2.   

    谢谢各位师兄:)我这个select在一开始写的时候是用or连接,并且没有用in,而是用=
    我测了一下,这样的话由于from后面的表连接的 太多,所以效率更差,KingSunSha(弱水三千)这位大哥的方法我也试了一下,虽然代码看起来清楚了很多,但效率变得更差,可能是因为from 后面的表太多了??希望大家多多帮忙,谢谢大家了!!
      

  3.   

    from后的表也不算太多,关键是表的主要检索部分需要有索引。
      

  4.   

    我只看了你的union的第一部分,大概改了一下:SELECT DISTINCT JO.JOURNAL_ID,JO.ACCOUNT_CODE,JO.DEPARTMENT_ID,
                    JO.DEBIT_STANDARD_AMT,JO.CREDIT_STANDARD_AMT,
                    JO.DOUBLE_ENTRY_DATE,JO.DOUBLE_ENTRY_ID ,AC.GMSS_P_L_CLASS_ID,LC.PARTNER_ID
                 FROM AG_JOURNAL JO,MA_ACCOUNT_CODE AC,LC_RECEIVE_PAYMENT_HEAD LC
                 WHERE  JO.ACCOUNT_CODE=AC.ACCOUNT_CODE AND
                      exists (select 1 from MA_ACCOUNT_CODE tt1 where tt1.ACCOUNT_CODE=JO.ACCOUNT_CODE and exists (
                                  select 1 from MA_GMSS_P_L_CLASS tt2 where tt2.P_L_CLASS_ID=tt1.GMSS_P_L_CLASS_ID))
                  and exists (select 1 from LC_RECEIVE_PAYMENT_HEAD tt3 where tt3.PARTNER_ID=LC.PARTNER_ID and
                              exists(select 1 from LG_DOUBLE_ENTRY_HEAD tt4 where tt4.SOURCE_ID=tt3.SOURCE_ID  and
                                     exists(select 1 from AG_DOUBLE_ENTRY_HEAD tt5 where tt5.SEQ_NO=tt4.SEQ_NO and
                                            DOUBLE_ENTRY_ID=JO.DOUBLE_ENTRY_ID)))有点建议:
    1、尽量用exists代替in,这个效率会快很多,一般这类in都可以用exists代替;
    2、如果可以得话,用union all 代替 union
       这2个的差别是union会过虑2个sql语句中整条记录所有字段的值都一样的记录,而union all 却没有过虑这部分记录的时间。