有三个有表都是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语句或是优化表结构提高运行效率
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语句或是优化表结构提高运行效率
这个日期类型的字段就算有索引也失效了。
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
如果建立索引,修改这个条件
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!!