突然查询慢慢执行

时间:2015-05-27 09:56:34

标签: sql sql-server

我有一个非常典型的情况,我做错了。我有一些查询,它们最初执行速度很快,但后来需要花费大量时间来执行.. 我的问题:

Declare     
 @fromdate varchar(20) = '01/01/2014',         
 @todate varchar(20)= '27/05/2015',        
 @SERVICE_ID CHAR(5) = '123'                   


DECLARE  @FDATE DATETIME ,             
   @TDATE DATETIME   

SET @FDATE = (CONVERT(DATETIME,@fromdate,103))                
SET @TDATE = (CONVERT(DATETIME,@todate,103))   

IF OBJECT_ID('tempdb..#RUID') IS NOT NULL  

 DROP TABLE #RUID  

 CREATE TABLE #RUID(  
    OFFICEID INT,  
    OFFICE_TITTLE INT,  
    MAIN_OFFICE_TITTLE VARCHAR(50),  
    RLB_NAME VARCHAR(20),  
    DIST_NAME INT,  
    district_description VARCHAR(30))    

CREATE CLUSTERED INDEX IDX_C_RUID_ID ON #RUID(OFFICEID)  

CREATE NONCLUSTERED  INDEX IDX_RUID_Name ON #RUID(OFFICE_TITTLE,DIST_NAME)INCLUDE(district_description)  
INSERT INTO #RUID      
SELECT OFFICEID,  
       OFFICE_TITTLE,  
       MAIN_OFFICE_TITTLE,  
       RLB_NAME,  
       DIST_NAME,  
       D.district_description        
FROM  APSDC..DISTRICT D       
INNER JOIN cdma..Unified_RUID_WARD_MSTR I WITH(NOLOCK)    
 ON D.CDMA_DistrictID = I.DIST_NAME        
WHERE                 RLB_NAME in(3) AND I.STATEID ='01'   

select C.MAIN_OFFICE_TITTLE AS 'OFFICE_TITTLE',C.officeid, C.DIST_NAME AS DistrictName, C.district_description,               
ISNULL(count(I.ApplicationNumber),0) 'Total_Trans',                   
isnull(sum(case when Data_Available='Y' AND DataTampered = 'N' then 1 else 0 end),0) 'CategoryA'              
from #RUID c with(nolock)               
LEFT  JOIN Unified_BirthDeathAppDetails I WITH(NOLOCK) ON                
(C.OFFICE_TITTLE=I.RUID AND C.DIST_NAME=I.DistrictName)        
  AND I.Service_Type= '01' AND                
(DATEADD(DD,0,DATEDIFF(DD,0,I.Created_Date))) BETWEEN @FDATE AND @TDATE               
 AND NOT EXISTS(select application_number from reversal_details  WITH(NOLOCK)  WHERE ApplicationNumber <> i.ApplicationNumber AND service_id='123' )                                  
group by  C.MAIN_OFFICE_TITTLE,C.officeid, C.DIST_NAME,C.district_description                
order by C.district_description ,C.MAIN_OFFICE_TITTLE                             

我尝试使用#temp表和table variable,但它甚至没有显示任何结果集。但是在2秒内执行相同的查询现在需要花费很多时间。我在这张桌子上尝试了 UPDATE Statstics ,我也检查了锁定。我需要做的是我遵循其他所有性能优化的技术。

1 个答案:

答案 0 :(得分:0)

尝试:

Declare     
 @FDate Date = '01/01/2014',         
 @TDate Date= '27/05/2015',        
 @SERVICE_ID CHAR(5) = '123'                   


;WITH RUID
AS
(
   SELECT OFFICEID,  
          OFFICE_TITTLE,  
          MAIN_OFFICE_TITTLE,  
          RLB_NAME,  
          DIST_NAME,  
          D.district_description        
   FROM  APSDC..DISTRICT D       
   INNER JOIN cdma..Unified_RUID_WARD_MSTR I     
     ON D.CDMA_DistrictID = I.DIST_NAME        
   WHERE  RLB_NAME in(3) AND I.STATEID ='01'  
),
AppDetails
AS
(
   SELECT ApplicationNumber,                   
          CASE WHEN Data_Available='Y' AND DataTampered = 'N' 
             THEN 1 
             ELSE 0 
          END CategoryA
   FROM Unified_BirthDeathAppDetails I 
   WHERE I.CreateDate >= @FDate AND I.CreatedDate < @TDate AND
     NOT EXISTS
         (  select application_number 
            FROM reversal_details 
            WHERE I.Service_Type= '01' AND
                  ApplicationNumber <> i.ApplicationNumber AND
                  service_id= @Service_iD
         ) 
)
SELECT C.MAIN_OFFICE_TITTLE AS OFFICE_TITTLE
      ,C.officeid, C.DIST_NAME AS DistrictName
      , C.district_description
      ,ISNULL(count(I.ApplicationNumber),0) Total_Trans
      ,isnull(sum(CategoryA),0) CategoryA 
FROM RUID c                
LEFT  JOIN AppDetails I 
      ON C.OFFICE_TITTLE=I.RUID AND C.DIST_NAME=I.DistrictName
GROUP BY  C.MAIN_OFFICE_TITTLE
         ,C.officeid
         ,C.DIST_NAME
         ,C.district_description
ORDER BU C.district_description 
        ,C.MAIN_OFFICE_TITTLE     

确保您在RLB_name,StateId,CDMA_DistrictId,Dist_Name,CreatedDate等上拥有不错的索引。