Select /*+use_hash(t7 t)*/
Distinct t.Taxregcode
From Tb_Ass_Improvedeclarebooklet t, Tb_Lvy_Improvedeclaredata T7, Tc_Pub_Taxtype o
Where t.Taxregcode = T7.Taxregcode 
And o.Taxtypecode = t.Taxtypecode 
And o.Fundtaxflag = 1 
And o.Choiceflag = 1 
And o.Taxtypecode Not In ('82', '96') 
And t.Statmonth = '200812'
And T7.Operatortime > (To_Date('200812', 'yyyymm') - 1) 
And T7.Operatortime < Add_Months(To_Date('200812', 'yyyymm'), 1) 
And t.Orgdeptcode Like Substr('26101020000', 1, 7) || '%' 
And T7.Negativeflag <> 9其中 t 和 t7表都又400万条左右的数据,o表几十条数据
查询条件基本上都是索引
业务需要去掉重复的Taxregcode,所以用到了Distinct 
查询速度很慢,希望高手能提出优化意见,谢谢!

解决方案 »

  1.   

    1、/*+use_hash(t7 t)*/ 这个提示最后不要
    2、DISTINCT很影响速度,能否先不用distinct,把结果放到一个中间表中,从这个中间表用distinct取数
    3、对表o的关联最好改为EXISTS
      如Select  t.Taxregcode 
    From Tb_Ass_Improvedeclarebooklet t JOIN Tb_Lvy_Improvedeclaredata T7
          ON(t.Taxregcode = T7.Taxregcode )
     Where t.Statmonth = '200812' 
      And t.Orgdeptcode Like Substr('26101020000', 1, 7) || '%' 
      And T7.Operatortime > (To_Date('200812', 'yyyymm') - 1) 
      And T7.Operatortime < Add_Months(To_Date('200812', 'yyyymm'), 1) 
      And T7.Negativeflag <> 9 
      AND EXISTS
     (select 1 from Tc_Pub_Taxtype o 
       where o.Taxtypecode = t.Taxtypecode 
         And o.Fundtaxflag = 1 
         And o.Choiceflag = 1 
         And o.Taxtypecode Not In ('82', '96') )
      

  2.   

    400W数据不是特别多,3个表关联也不是很多,既然关键字段都有索引,那就从新统计一下表信息试试--其它2长表也用一样的语句统计,换下表名即可
    analyze table Tb_Ass_Improvedeclarebooklet  compute statistics;
      

  3.   

    PS:你的语句中的HINTS强迫ORACLE优化器走哈希连接,去掉试试看。
      

  4.   


    你说的太深了,我的权限只有查询,没有其他权限了,去掉了/*+use_hash(t7 t)*/ 和
    没去掉相差没影响啊,谢谢!能否将Distinct替换成别的方式啊? 
      

  5.   

    1.ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾. 
    2.如果 Tb_Ass_Improvedeclarebooklet 表中Taxregcode是唯一的,就用EXSITS代替DISTINCT
      

  6.   

     Tb_Ass_Improvedeclarebooklet 表中Taxregcode不是唯一的
      

  7.   

    呃。。那就去找你们的DBA吧~~
    这种情况,不再现场,不了解各种信息,是很难解决的~~
      

  8.   

    not in 和‘<>’是不走索引的,建议换一种写法
      

  9.   

    楼主是 阿里软件的人吧sql就像出自一人之手
      

  10.   

    用row_number () over()  函数去除重复即可。
      

  11.   

    Select Distinct t.Taxregcode --如果t表中的Taxregcode字段是唯一主键的话,去掉distinct
      From Tb_Ass_Improvedeclarebooklet t, Tc_Pub_Taxtype o
     Where o.Taxtypecode = t.Taxtypecode
       And o.Fundtaxflag = 1
       And o.Choiceflag = 1
       And o.Taxtypecode Not In ('82', '96')
       And t.Statmonth = '200812'
       And t.Orgdeptcode Like '2610102%'
       and t.Taxregcode in
           (select T7.Taxregcode
              from Tb_Lvy_Improvedeclaredata T7
             where T7.Operatortime > To_Date('20081130', 'yyyymmdd')
               And T7.Operatortime < To_Date('20081230', 'yyyymm')
               And T7.Negativeflag <> 9))
    试一下