SQL查询优化 [英] SQL Query Optimisation

查看:60
本文介绍了SQL查询优化的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

以下查询需要8分钟。执行。

有人请帮我优化这个查询

i到目前为止我已经尽力了...



Below query is taking 8 min. to execute.
Somebody please help me for optimising this query
i have tried my best so far..

    Declare @Project_Code varchar(50)
      Declare @User_Level int
      Declare @User_Name varchar(50)
  set @Project_Code='PE081507' set @User_Level='9' set @User_Name='mwebber'    
      
Declare @FullQuery as varchar (max)       
Declare @MainHeader as varchar (5000)                   
Declare @SubHeader as varchar (5000)        
DECLARE @GridHeader VARCHAR(MAX)      
set @GridHeader = 'Queue#'      
DECLARE @TOTALCOUNT INT;        
 SET @MainHeader = '['                  
 SET @SubHeader = '['                  
              
      
                   
;with InvTypeHead            
AS            
(            
SELECT DISTINCT LR.InvType AS InvTypeCode , DT.Description AS InvTypeName,DT.GridOrder,DG.GroupName as DocumentGroup       
FROM LevelRights LR                      
      Inner JOIN                   
   invtypemaster DT ON LR.ProjectCode= DT.ProjectCode and LR.InvType = DT.Type             
   Left  Join           
Phase2GroupMaster DG          
on           
DT.projectCode = Dg.Project_Code           
and DT.GroupId = DG.GroupID                
      WHERE LR.ProjectCode=@Project_Code and Ulevel = @User_Level   and Display_MyWorkQueue = 1          
                  
)      
                  
SELECT   @MainHeader= COALESCE(@MainHeader,'') +  InvTypeCode    + '] as [' + InvTypeName + '],[',            
@SubHeader =  COALESCE(@SubHeader,'') + InvTypeCode + '],[',      
 @GridHeader = COALESCE(@GridHeader,' ') +     DocumentGroup  + '|' +  InvTypeName + '#'  FROM InvTypeHead order by GridOrder          
        
  IF (LEN(@MainHeader) > 2)          
BEGIN        
Print 'Main Header length is greater than 2'        
 Set  @MainHeader = SUBSTRING(@MainHeader,0,len(@MainHeader) - 1)                   
 Set  @SubHeader = SUBSTRING(@SubHeader,0,len(@SubHeader) - 1)         
      print Convert(Varchar(20),getdate(),109)
    Set @FullQuery =          
'      
IF OBJECT_ID(''[TypeHeader_' + @User_Name + ']'') IS NOT NULL            
DROP TABLE [TypeHeader_' + @User_Name + ']       
IF OBJECT_ID(''[QcodeDetails_' + @User_Name + ']'') IS NOT NULL            
DROP TABLE [QcodeDetails_' + @User_Name + ']       
IF OBJECT_ID(''[InvoiceData_' + @User_Name + ']'') IS NOT NULL            
DROP TABLE [InvoiceData_' + @User_Name + ']       
IF OBJECT_ID(''[FinalData_' + @User_Name + ']'') IS NOT NULL            
DROP TABLE [FinalData_' + @User_Name + ']       
;      
      
      
Declare @MainQuery as varchar (max)                   
       
      
              
DECLARE @TOTALCOUNT INT;      
set nocount on      
             print Convert(Varchar(20),getdate(),109)
SELECT Distinct LR.InvType AS InvTypeCode , DT.Description AS InvTypeName,DT.GridOrder into [TypeHeader_' + @User_Name + '] FROM  LevelRights LR with(nolock,nowait)                      
      Inner JOIN                   
   invtypemaster DT with(nolock,nowait) ON LR.ProjectCode= DT.ProjectCode and LR.InvType = DT.Type             
               
      WHERE LR.ProjectCode=''' + @Project_Code + ''' and Ulevel =''' + CONVERT(varchar(5),@User_Level) + ''' and Display_MyWorkQueue = 1        
                   print Convert(Varchar(20),getdate(),109) 
SELECT DISTINCT LR.Ulevel,LR.QCode,Q.QName,Q.Appearing_Sequence into [QcodeDetails_' + @User_Name + '] FROM LevelRights LR with(nolock,nowait)
INNER JOIN                    
QMaster Q with(nolock,nowait) ON LR.ProjectCode=Q.ProjectCode and LR.QCode=Q.QCode                       
WHERE LR.ProjectCode=''' + @Project_Code +''' AND   Display_MyWorkQueue = 1 and Ulevel =''' + CONVERT(varchar(5),@User_Level) + '''                  
                print Convert(Varchar(20),getdate(),109)
SELECT  case when Currentuser =''' + @User_Name + ''' then ''CCU'' else QD.QCode end as QCode, case when Currentuser = ''' + @User_Name + ''' then ''My Queue'' else QD.QName end as QName,      
TH.InvTypeCode,TH.InvTypeName, case when Currentuser = ''' + @User_Name + ''' then ''0'' else QD.Appearing_Sequence end as Appearing_Sequence,TD.irn into [InvoiceData_' + @User_Name + '] FROM Invpage TD               
right JOIN [QcodeDetails_' + @User_Name + '] QD ON TD.dtl_Status = QD.QCode                   
full JOIN [TypeHeader_' + @User_Name + '] TH ON TD.InvType = TH.InvTypeCode                  
WHERE (Currentuser = '''' or Currentuser is null or Currentuser =''' + @User_Name + ''') and Qd.QCode is not null  and TD.[C-JamPrjCode]=''' + @Project_Code + '''      
                   print Convert(Varchar(20),getdate(),109)
Select case when I.QCode is null then Q.QCode else I.QCode end as QCode, case when I.QName is null then Q.QName else I.QName end as QName ,            
I.InvTypeCode,I.InvTypeName,I.irn, case when I.Appearing_Sequence is null then Q.Appearing_Sequence else I.Appearing_Sequence end as Appearing_Sequence      
into [FinalData_' + @User_Name + '] from [InvoiceData_' + @User_Name + '] I full join [QcodeDetails_' + @User_Name + '] Q on I.QCode = Q.QCode            
                   print Convert(Varchar(20),getdate(),109) 
set nocount Off       
 '      
      
      
--Print @MainHeader      
--Print @SubHeader      
--Print @GridHeader      
      
        
 Set @FullQuery = @FullQuery + ' SELECT  QName as Queue,' + @MainHeader +                   
        --[TPO] as PO,[TNP] as NONPO,[MPO] as PO,[TNP] as NONPO,[DPO] as PO,[DNP] as NONPO                  
      ' FROM                  
      (                  
                     
      SELECT  QName,InvTypeCode,IRN,Appearing_Sequence from [FinalData_' + @User_Name + '] ) as p                  
                     
      PIVOT                  
      (                  
      count(IRN)                  
      FOR   InvTypeCode IN                  
      ('                   
     +  @SubHeader  +                   
      -- [TPO],[TNP],[DPO],[DNP],[MNP],[MPO]                  
      ')                  
      ) AS pvt Order by Appearing_Sequence      
            
       '          
         
END      
print @FullQuery            
      
Execute(@FullQuery)      
  SET @TOTALCOUNT = (Select @@rowcount)              
     print Convert(Varchar(20),getdate(),109)   
  Execute (' IF OBJECT_ID(''[TypeHeader_' + @User_Name + ']'') IS NOT NULL            
DROP TABLE [TypeHeader_' + @User_Name + ']       
IF OBJECT_ID(''[QcodeDetails_' + @User_Name + ']'') IS NOT NULL            
DROP TABLE [QcodeDetails_' + @User_Name + ']       
IF OBJECT_ID(''[InvoiceData_' + @User_Name + ']'') IS NOT NULL            
DROP TABLE [InvoiceData_' + @User_Name + ']       
IF OBJECT_ID(''[FinalData_' + @User_Name + ']'') IS NOT NULL            
DROP TABLE [FinalData_' + @User_Name + '] ')      





谢谢&此致,

Sunil Mali。



Thanks & Regards,
Sunil Mali.

推荐答案

根据对问题的评论,我建议访问 CodeProject KnowledgeBase 。在那里你会发现很多建议如何提高查询的性能。
As per comments to the question, i'd suggest to visit CodeProject KnowledgeBase. There you'll find tons of advices how to improve performance of query.


这篇关于SQL查询优化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆