none
优化sql语句 RRS feed

  • 问题

  • INSERT INTO [dbo].[HC_HouseFollow] ([FollowID],[HousingResourcesID],[EmployeeID],[Contents],[IsAwork],[AwakeTime],[AwakePart],[AwakeContent] ,[UpdateTime],[RecordTime],[IsDelete],[DepartmentID],[CompanyID],[AreaID],[Category],[EmployeeStation],[TransactionType] ,[IsOwnerVistlog],[UseType],[IsReport]) --查询数据 select newid(),HousingResourcesID,RegistrationEmployeeID,CancelVipExplain,0,GETDATE(),0,'',getdate(),GETDATE(),0,RegistrationDepartmentID,RegistrationCompanyID ,NULL ,12121,RegistrationStation,TransactionType,1,UseType,NULL from vw_HousingResourcesBaseListForTime --条件 where housingResourcesID in (select HC_HRB.HousingResourcesID from Property.dbo.HC_HousingResourcesBase HC_HRB inner join (select * from [Property].[dbo].[Sys_OperationChildLog] where VipEndTrueTime< GETDATE() and VipEndTrueTime is not null ) OCL on OCL.HousingResourcesID=HC_HRB.HousingResourcesID where IsVIP=1 and HousingResourcesStatus=58 and OCL.housingResourcesID not in(select housingResourcesID from [HC_HouseFollow] where EmployeeID=vw_HousingResourcesBaseListForTime.RegistrationEmployeeID and CHARINDEX('由于超时将Vip房源取消,房源编号',Contents)<>0 ) )

    这个sql语句怎么优化



    please verify my account

    2016年9月10日 0:37

答案

  • 1.in 改为 inner join

    2.not in 改为 left join 然后检查 左连接表 字段是否为null

    只能给你提示,没有环境。


    family as water

    • 已建议为答案 Albert_ Zhang 2016年9月12日 9:50
    • 已标记为答案 lctk 2016年9月14日 2:35
    2016年9月11日 2:07
  • then you can compare execution plans to find out which one is better in your environment.
    • 已建议为答案 Albert_ Zhang 2016年9月12日 9:51
    • 已标记为答案 lctk 2016年9月14日 2:35
    2016年9月11日 16:06
  • 你好,lctk

    你可以参考如下的代码完成并根据你的需求做些修改。此外,个人建议你可以尝试使用CTE 让你的代码更容易阅读和排错。另外,根据rmiao 的建议,参考如下的链接去查询执行计划,并不断修改优化。

    https://technet.microsoft.com/en-us/library/ms178071(v=sql.105).aspx

    ;WITH CTE AS
    (
    select HC_HRB.HousingResourcesID
    from 
    	Property.dbo.HC_HousingResourcesBase HC_HRB,
    	[Property].[dbo].[Sys_OperationChildLog] OCL,
    	[HC_HouseFollow] HF
    where  
    	OCL.VipEndTrueTime< GETDATE() and OCL.VipEndTrueTime is not null
    	AND OCL.HousingResourcesID=HC_HRB.HousingResourcesID
    	AND IsVIP=1 and HousingResourcesStatus=58
    	AND HF.EmployeeID=vw_HousingResourcesBaseListForTime.RegistrationEmployeeID 
    	AND CHARINDEX('由于超时将Vip房源取消,房源编号',HF.Contents)<>0	
    	AND OCL.housingResourcesID <> HF.housingResourcesID
    )
    INSERT INTO [dbo].[HC_HouseFollow]
    ([FollowID],[HousingResourcesID],[EmployeeID],[Contents],[IsAwork],[AwakeTime],[AwakePart],[AwakeContent]
    ,[UpdateTime],[RecordTime],[IsDelete],[DepartmentID],[CompanyID],[AreaID],[Category],[EmployeeStation],[TransactionType]
    ,[IsOwnerVistlog],[UseType],[IsReport])
    --查询数据
    select  
    	newid(),
    	HousingResourcesID,	RegistrationEmployeeID,CancelVipExplain,0,GETDATE(),0,'',getdate(),GETDATE(),0,RegistrationDepartmentID,RegistrationCompanyID
       ,NULL ,12121,RegistrationStation,TransactionType,1,UseType,NULL
    from vw_HousingResourcesBaseListForTime	vwHRBLFT	
    where EXISTS (SELECT 1 FROM CTE C WHERE C.HousingResourcesID=  vwHRBLFT.housingResourcesID)
    

    Best Regards,

    Albert Zhang

    • 已标记为答案 lctk 2016年9月14日 2:35
    2016年9月12日 9:50

全部回复

  • 1.in 改为 inner join

    2.not in 改为 left join 然后检查 左连接表 字段是否为null

    只能给你提示,没有环境。


    family as water

    • 已建议为答案 Albert_ Zhang 2016年9月12日 9:50
    • 已标记为答案 lctk 2016年9月14日 2:35
    2016年9月11日 2:07
  • then you can compare execution plans to find out which one is better in your environment.
    • 已建议为答案 Albert_ Zhang 2016年9月12日 9:51
    • 已标记为答案 lctk 2016年9月14日 2:35
    2016年9月11日 16:06
  • 具体怎么写啊?

    please verify my account

    2016年9月12日 0:48
  • 有没有教程看看啊

    please verify my account

    2016年9月12日 0:48
  • 你好,lctk

    你可以参考如下的代码完成并根据你的需求做些修改。此外,个人建议你可以尝试使用CTE 让你的代码更容易阅读和排错。另外,根据rmiao 的建议,参考如下的链接去查询执行计划,并不断修改优化。

    https://technet.microsoft.com/en-us/library/ms178071(v=sql.105).aspx

    ;WITH CTE AS
    (
    select HC_HRB.HousingResourcesID
    from 
    	Property.dbo.HC_HousingResourcesBase HC_HRB,
    	[Property].[dbo].[Sys_OperationChildLog] OCL,
    	[HC_HouseFollow] HF
    where  
    	OCL.VipEndTrueTime< GETDATE() and OCL.VipEndTrueTime is not null
    	AND OCL.HousingResourcesID=HC_HRB.HousingResourcesID
    	AND IsVIP=1 and HousingResourcesStatus=58
    	AND HF.EmployeeID=vw_HousingResourcesBaseListForTime.RegistrationEmployeeID 
    	AND CHARINDEX('由于超时将Vip房源取消,房源编号',HF.Contents)<>0	
    	AND OCL.housingResourcesID <> HF.housingResourcesID
    )
    INSERT INTO [dbo].[HC_HouseFollow]
    ([FollowID],[HousingResourcesID],[EmployeeID],[Contents],[IsAwork],[AwakeTime],[AwakePart],[AwakeContent]
    ,[UpdateTime],[RecordTime],[IsDelete],[DepartmentID],[CompanyID],[AreaID],[Category],[EmployeeStation],[TransactionType]
    ,[IsOwnerVistlog],[UseType],[IsReport])
    --查询数据
    select  
    	newid(),
    	HousingResourcesID,	RegistrationEmployeeID,CancelVipExplain,0,GETDATE(),0,'',getdate(),GETDATE(),0,RegistrationDepartmentID,RegistrationCompanyID
       ,NULL ,12121,RegistrationStation,TransactionType,1,UseType,NULL
    from vw_HousingResourcesBaseListForTime	vwHRBLFT	
    where EXISTS (SELECT 1 FROM CTE C WHERE C.HousingResourcesID=  vwHRBLFT.housingResourcesID)
    

    Best Regards,

    Albert Zhang

    • 已标记为答案 lctk 2016年9月14日 2:35
    2016年9月12日 9:50