本帖最后由 wxdfire 于 2014-08-04 15:51:09 编辑

解决方案 »

  1.   

    感觉语句没啥问题,主要是执行效率有点问题
    可以试着将语句中的in改为exists的写法,对于大表的查询,exists要快一点
    另外查询中子查询用得较多,可以试着改为表连接的方式,查询会快一点
      

  2.   

    有in,not in的部分换成外连接试试
      

  3.   

    根据你说的情况,应该是你执行计划有问题.
    个人建议你先收集一下统计信息,如果还不行.
    你对比一下 和使用标红部分的查询结果 的执行计划有什么不同,用hint或sql profile调整就行了.
    这些都是不改语句的情况下,如果可以改语句,基本上也就是改是exists或join的形式,当然这要测试才知道那个好.
      

  4.   

    where q.quotasource like '%年初预算%'
                                    and q.quotasource not like '%政府专项%'
    感觉这两个这样写会走全表扫描,有索引也不起作用呀。
      

  5.   

    先查看语句的执行计划,优化查询计划
    参考http://www.cnblogs.com/fqw1987815/archive/2010/08/18/1802657.html
      

  6.   

    1、quota_quotadata这个表本身数据量很大么?可以改为楼上所说exists试试。
    2、where aa.gidl_doc_numb in (select distinct q.quotanotitle || q.quotanonum
                                  from quota_quotadata q
                                 where q.quotasource like '%年初预算%'
                                   and q.quotasource not like '%政府专项%'
                                   and q.year = 2014
                                   and q.quotastatus = 7)    这里in操作不用distinct消耗
      

  7.   

    这样试下SELECT aa.*
      FROM (SELECT SUM(t1.debit_source - nvl(t1.credit_source, 0)) / 10000 金额,
                   t1.gidl_doc_numb
              FROM Ga_t_Acc_Voucher_Static t1
             WHERE t1.acst_code = 1001
               AND t1.bdgt_subj IN (SELECT t.subjectcode
                                      FROM busmgr_funnew t
                                     WHERE t.subjecttype LIKE '一般预算支出科目'
                                       AND t.year = 2014)
               AND t1.yearmonth BETWEEN '201401' AND '201407'
               AND t1.sub_voucher_id IN
                   (SELECT asv.sub_voucher_id
                      FROM ga_t_acc_sub_voucher asv
                     WHERE asv.acst_code =
                           (SELECT t.acst_id
                              FROM GA_T_ACCOUNT_SET t
                             WHERE t.acst_name = '预算内')
                       AND asv.voucher_id IN
                           (SELECT amv.voucher_id
                              FROM ga_t_acc_main_voucher amv
                             WHERE amv.status = 3))
             GROUP BY t1.gidl_doc_numb) aa
     WHERE aa.gidl_doc_numb IN (SELECT /* no_merge */
                                DISTINCT q.quotanotitle || q.quotanonum
                                  FROM quota_quotadata q
                                 WHERE q.quotasource LIKE '%年初预算%'
                                   AND q.quotasource NOT LIKE '%政府专项%'
                                   AND q.year = 2014
                                   AND q.quotastatus = 7)
      

  8.   

    错了 我重新发
    SELECT aa.*
      FROM (SELECT SUM(t1.debit_source - nvl(t1.credit_source, 0)) / 10000 金额,
                   t1.gidl_doc_numb
              FROM Ga_t_Acc_Voucher_Static t1
             WHERE t1.acst_code = 1001
               AND t1.bdgt_subj IN (SELECT t.subjectcode
                                      FROM busmgr_funnew t
                                     WHERE t.subjecttype LIKE '一般预算支出科目'
                                       AND t.year = 2014)
               AND t1.yearmonth BETWEEN '201401' AND '201407'
               AND t1.sub_voucher_id IN
                   (SELECT asv.sub_voucher_id
                      FROM ga_t_acc_sub_voucher asv
                     WHERE asv.acst_code =
                           (SELECT t.acst_id
                              FROM GA_T_ACCOUNT_SET t
                             WHERE t.acst_name = '预算内')
                       AND asv.voucher_id IN
                           (SELECT amv.voucher_id
                              FROM ga_t_acc_main_voucher amv
                             WHERE amv.status = 3))
             GROUP BY t1.gidl_doc_numb) aa
     WHERE aa.gidl_doc_numb IN (SELECT /*+ no_merge */
                                DISTINCT q.quotanotitle || q.quotanonum
                                  FROM quota_quotadata q
                                 WHERE q.quotasource LIKE '%年初预算%'
                                   AND q.quotasource NOT LIKE '%政府专项%'
                                   AND q.year = 2014
                                   AND q.quotastatus = 7)