有三个有表都是50W条以上的记录
t_user表user_id上建有索引 是用户表
t_Ldtx_Product表user_id上建索引 是产品表
lin_jfdj201104表user_id上建索引 是己登记用户表现在取出未登记用的用户并关联用户信息,我用下面的SQL取数非常的慢很没效率.
Select u.Msisdn,zzyw1.product_name, zzyw1.create_time From (
Select *
  From t_Ldtx_Product Zzyw
 Where To_Char(Zzyw.Create_Time, 'yyyymm') = 201104  And Zzyw.Expire_Time > Sysdate
   And Not Exists (select 'x' from lin_jfdj201104 jfdj where jfdj.user_id = zzyw.user_id)) zzyw1
   Inner Join t_user u On u.User_Id=zzyw1.user_id请高手指点有没有办法优化SQL语句或是优化表结构提高运行效率

解决方案 »

  1.   

    我感觉你的sql速度被 To_Char(Zzyw.Create_Time, 'yyyymm') = 201104  这个条件影响了吧。
    这个日期类型的字段就算有索引也失效了。
      

  2.   

    我Zzyw.Create_Time这个字段没有建索引
      

  3.   


    create table temp as
    Select *
      From t_Ldtx_Product Zzyw
     Where To_Char(Zzyw.Create_Time, 'yyyymm') = 201104 And Zzyw.Expire_Time > Sysdate
      And Not Exists (select 'x' from lin_jfdj201104 jfdj where jfdj.user_id = zzyw.user_id)
    ;
    Select u.Msisdn,zzyw1.product_name, zzyw1.create_time From temp zzyw1
    Inner Join t_user u On u.User_Id=zzyw1.user_id
      

  4.   

    t_Ldtx_Product数据量有多大,如果大的话在Create_Time上建立索引
    如果建立索引,修改这个条件
    To_Char(Zzyw.Create_Time, 'yyyymm') = 201104
    为:
    Zzyw.Create_Time  >=to_date(date'2011-04-01') and Zzyw.Create_Time<to_date(date'2011-05-01')关键要学会查看执行计划! pl/sql developer F5!!
      

  5.   

    具体看数据量大小的,create_time建立索引,看执行计划。