当前位置: 代码迷 >> Sql Server >> 关于执行存储过程时间太长的有关问题
  详细解决方案

关于执行存储过程时间太长的有关问题

热度:65   发布时间:2016-04-24 09:45:00.0
关于执行存储过程时间太长的问题
本帖最后由 ufo9_2010 于 2014-10-27 15:53:53 编辑

直接执行的话只要2分钟多一点,当我把这段sql转换成存储过程,如:exec [RUN_Daily_Report_by_Channel_Month_City] '2014-10-21',1却跑了20分钟都没有出结果,我分段传上来,最后又一段展示的对结果印象不大我就不传了。我研究下来应该是卡在了按年处理这块,但是没想通为啥放在外面执行可以很快,放在存储过程里执行就会那么慢,之前在建索引那块代码是分别在createtime和mamaid上建聚集和非聚集索引的,那样的话要跑3-4分钟,现在改成在把2个字段都建在聚集索引上了就出问题了。

DECLARE @Month_income DATETIME,@Year_income DATETIME,@InputDate DATETIME,@param INT--计算当月第一天,计算当年第一天
    SET @Month_income=CONVERT(DATETIME,(CONVERT(NVARCHAR,(YEAR(@InputDate)))+'-'+CONVERT(NVARCHAR,(MONTH(@InputDate)))+'-'+'1'))
SET @Year_income =CONVERT(DATETIME,(CONVERT(NVARCHAR,(YEAR(@InputDate)))+'-01-01'))
SET @InputDate='2014-10-21'
SET @param=1
SET @InputDate = CONVERT(DATETIME,@InputDate)


IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE id=OBJECT_ID('tempdb..#Daily_Mother'))  
BEGIN
DROP TABLE  #Daily_Mother       
END 
IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE id=OBJECT_ID('tempdb..#LogDetail_Clup'))  
BEGIN
DROP TABLE  #LogDetail_Clup       
END 
IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE id=OBJECT_ID('tempdb..#LogDetail_ttnmc'))  
BEGIN
DROP TABLE  #LogDetail_ttnmc       
END 
IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE id=OBJECT_ID('tempdb..#LogDetail_BarCode'))  
BEGIN
DROP TABLE  #LogDetail_BarCode       
END
IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE id=OBJECT_ID('tempdb..#LogDetail_Team'))  
BEGIN
DROP TABLE  #LogDetail_Team       
END  
IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE id=OBJECT_ID('tempdb..#LogDetail_coolpj'))  
BEGIN
DROP TABLE  #LogDetail_coolpj       
END                 
--SR(商场首次),MA(妈妈首次),PRO(医务首次)取3个渠道的总数据
IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE id=OBJECT_ID('tempdb..#New_Income'))  
BEGIN
DROP TABLE  #New_Income       
END 

--CREATE TABLE #New_Income (MARK NVARCHAR(100),MamaID NVARCHAR(50),JoinDate DATETIME)
--SR
--INSERT INTO #New_Income  ( MARK ,MamaID ,JoinDate)
SELECT mamaid,CreateTime,ErrorDescription INTO #LogDetail_Clup FROM [10.237.70.205].crm_import.[dbo].[LogDetail_Clup] 
WHERE ISNULL(mamaid,'')<>'' AND CreateTime >= '2014-01-01' AND CreateTime<@InputDate+1

SELECT mamaid,CreateTime,ErrorDescription,ChannelName INTO #LogDetail_ttnmc FROM [10.237.70.205].crm_import.[dbo].[LogDetail_ttnmc] 
WHERE ISNULL(mamaid,'')<>'' AND ISNULL(mamaid,'')<>'' AND CreateTime >= '2014-01-01' AND CreateTime<@InputDate+1

SELECT mamaid,CreateTime,ErrorDescription,WXOpenID,MA_City,HCPNo,RecommendCode INTO #LogDetail_BarCode FROM 
[10.237.70.205].crm_import.dbo.LogDetail_BarCode WHERE CreateTime >= '2014-01-01' AND CreateTime<@InputDate+1

SELECT mamaid,CreateTime,ErrorDescription INTO #LogDetail_Team FROM [10.237.70.205].crm_import.dbo.LogDetail_Team 
WHERE  ISNULL(Mamaid,'')<>'' AND CreateTime >= '2014-01-01' AND CreateTime<@InputDate+1

SELECT mamaid,CreateTime,ErrorDescription INTO #LogDetail_coolpj FROM [10.237.70.205].crm_import.dbo.LogDetail_coolpj 
WHERE ISNULL(mamaid,'')<>''  AND CreateTime >= '2014-01-01' AND CreateTime<@InputDate+1

--INSERT INTO #Details  ( MARK ,MamaID ,JoinDate)
SELECT  'SR' AS MARK ,mamaid ,CAST(SUBSTRING(CONVERT(NVARCHAR,CreateTime),1,10) AS DATETIME) AS JoinDate
into  #Details      
FROM #LogDetail_Clup WHERE ISNULL(mamaid,'')<>''  
UNION ALL
SELECT  'SR' AS MARKK ,mamaid ,CAST(SUBSTRING(CONVERT(NVARCHAR,CreateTime),1,10) AS DATETIME) AS JoinDate   
FROM #LogDetail_ttnmc WHERE ChannelName<>'医生推荐' AND ISNULL(mamaid,'')<>''  
UNION ALL
SELECT  'SR' AS MARK ,mamaid ,CAST(SUBSTRING(CONVERT(NVARCHAR,CreateTime),1,10) AS DATETIME)  AS JoinDate 
FROM  #LogDetail_BarCode WHERE ISNULL(WXOpenID,'')<>'' AND ISNULL(RecommendCode,'')<>''  
AND ISNULL(mamaid,'')<>''

--MA 
UNION ALL
SELECT  'MA' AS MARK ,mamaid ,CAST(SUBSTRING(CONVERT(NVARCHAR,CreateTime),1,10) AS DATETIME) AS JoinDate  
FROM #LogDetail_Team WHERE ISNULL(Mamaid,'')<>''  
UNION ALL
SELECT  'MA' AS MARK ,Mamaid ,CAST(SUBSTRING(CONVERT(NVARCHAR,CreateTime),1,10) AS DATETIME)  AS JoinDate  
FROM #LogDetail_BarCode WHERE ISNULL(MA_City,'')<>''  AND ISNULL(mamaid,'')<>''  

--PRO
UNION ALL
SELECT  'PRO' AS MARK ,Mamaid ,CAST(SUBSTRING(CONVERT(NVARCHAR,CreateTime),1,10) AS DATETIME)  AS JoinDate 
FROM #LogDetail_ttnmc WHERE ChannelName='医生推荐'AND ISNULL(mamaid,'')<>''  
UNION ALL
SELECT  'PRO' AS MARK ,Mamaid ,CAST(SUBSTRING(CONVERT(NVARCHAR,CreateTime),1,10) AS DATETIME) AS JoinDate  
FROM   #LogDetail_BarCode WHERE ISNULL(WXOpenID,'')<>'' AND ISNULL(HCPNo,'')<>''  
AND ISNULL(mamaid,'')<>''
UNION ALL 
SELECT  'PRO' AS MARK ,Mamaid ,CAST(SUBSTRING(CONVERT(NVARCHAR,CreateTime),1,10) AS DATETIME)  AS JoinDate 
FROM #LogDetail_coolpj WHERE ISNULL(mamaid,'')<>''   



SELECT  'SR' AS MARK,mamaid ,CAST(SUBSTRING(CONVERT(NVARCHAR,CreateTime),1,10) AS DATETIME)  as joindate 
into #New_Income 
FROM #LogDetail_Clup WHERE ISNULL(mamaid,'')<>'' AND ErrorDescription IN ('新增资料','超龄资料','新增不合规资料') 
 
UNION 
SELECT   'SR' AS MARK,mamaid ,CAST(SUBSTRING(CONVERT(NVARCHAR,CreateTime),1,10) AS DATETIME)  
FROM #LogDetail_ttnmc WHERE ChannelName<>'医生推荐' AND ISNULL(mamaid,'')<>'' AND ErrorDescription IN ('超龄资料','新增不合规资料','新增资料') 
 
UNION 
SELECT   'SR' AS MARK,mamaid ,CAST(SUBSTRING(CONVERT(NVARCHAR,CreateTime),1,10) AS DATETIME)  
FROM  #LogDetail_BarCode WHERE ISNULL(WXOpenID,'')<>'' AND ISNULL(RecommendCode,'')<>'' AND ErrorDescription IN ('新增数据')
 

--MA 
union 
SELECT   'MA' AS MARK,mamaid ,CAST(SUBSTRING(CONVERT(NVARCHAR,CreateTime),1,10) AS DATETIME)  
FROM #LogDetail_Team WHERE ISNULL(Mamaid,'')<>'' AND LEFT(ErrorDescription,4)='成功导入' 
 
UNION
SELECT   'MA' AS MARK,mamaid ,CAST(SUBSTRING(CONVERT(NVARCHAR,CreateTime),1,10) AS DATETIME)  
FROM #LogDetail_BarCode WHERE ISNULL(MA_City,'')<>''  AND ISNULL(mamaid,'')<>'' AND ErrorDescription IN ('新增数据') 
 

--PRO
union
SELECT   'PRO' AS MARK,mamaid ,CAST(SUBSTRING(CONVERT(NVARCHAR,CreateTime),1,10) AS DATETIME)  
FROM #LogDetail_ttnmc WHERE ChannelName='医生推荐'AND ISNULL(mamaid,'')<>'' AND ErrorDescription IN ('超龄资料','新增不合规资料','新增资料')
 
UNION 
SELECT  'PRO' AS MARK,mamaid ,CAST(SUBSTRING(CONVERT(NVARCHAR,CreateTime),1,10) AS DATETIME)  
FROM   #LogDetail_BarCode WHERE ISNULL(WXOpenID,'')<>'' AND ISNULL(HCPNo,'')<>'' AND ErrorDescription IN ('新增数据')
AND ISNULL(mamaid,'')<>''  
UNION 
SELECT  'PRO' AS MARK,mamaid ,CAST(SUBSTRING(CONVERT(NVARCHAR,CreateTime),1,10) AS DATETIME)  
FROM #LogDetail_coolpj WHERE ISNULL(mamaid,'')<>'' AND ErrorDescription ='新增资料' 



--根据mother表取宝宝生日,
IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE id=OBJECT_ID('tempdb..#Mother'))  
BEGIN
DROP TABLE  #Mother       
END 

--CREATE TABLE #Mother (Site1 NVARCHAR(100),Site2 NVARCHAR(100),MARK NVARCHAR(100),MamaID NVARCHAR(50),Monthage INT ,FirstSource NVARCHAR(2) , Frozen NVARCHAR(2),JoinDate DATETIME )

--INSERT INTO #Mother(Site1,Site2,MARK,MamaID,Monthage,FirstSource,Frozen,JoinDate)
SELECT Site1,Site2,'MOTHER' AS MARK,mamaid,
CASE WHEN DATEDIFF(DD,bbirthday,JoinDate)<0 THEN 1 --孕期
     WHEN DATEDIFF(DD,bbirthday,JoinDate) BETWEEN 0 AND 365 THEN 2 --宝宝0-12M
ELSE 3 END AS Monthage --宝宝12M+
,FirstSource,Frozen,CAST(SUBSTRING(CONVERT(NVARCHAR,JoinDate),1,10) AS DATETIME)  AS JoinDate
into #Mother 
FROM CRM.dbo.v_mother WHERE JoinDate >= '2014-01-01' AND JoinDate<@InputDate+1



SELECT  a.Site1,a.Site2,MARK,a.MamaID ,a.Monthage,a.FirstSource,a.Frozen,a.JoinDate AS CreateTime INTO #Daily_Mother
FROM    #Mother a 


SELECT a.MARK,a.MamaID,a.JoinDate AS CreateTime INTO #Daily_Channel
FROM   #New_income  a


SELECT a.MARK,a.MamaID,a.JoinDate AS CreateTime INTO #Daily_ALL
FROM   #Details a

IF EXISTS (SELECT name from tempdb.sys.indexes
             WHERE name = N'IX_#Daily_Mother')
    DROP INDEX IX_#Daily_Mother ON #Daily_Mother

CREATE CLUSTERED INDEX IX_#Daily_Mother 
    ON #Daily_Mother(CreateTime,mamaid)
    
 --   IF EXISTS (SELECT name from sys.indexes
 --            WHERE name = N'IX1_#Daily_Mother')
 --   DROP INDEX IX1_#Daily_Mother ON #Daily_Mother

--CREATE NONCLUSTERED INDEX IX1_#Daily_Mother 
 --   ON #Daily_Mother(mamaid)
    SELECT  Site1 ,
            Site2 ,
            MARK ,
            mamaid ,
            Monthage ,
            FirstSource ,
            Frozen ,
            CreateTime FROM #Daily_Mother
SELECT * FROM #Daily_Channel


IF EXISTS (SELECT name from tempdb.sys.indexes
             WHERE name = N'IX_#Daily_Channel')
    DROP INDEX IX_#Daily_Channel ON #Daily_Channel


CREATE CLUSTERED INDEX IX_#Daily_Channel 
    ON #Daily_Channel(CreateTime,mamaid)
    
 --   IF EXISTS (SELECT name from sys.indexes
 --            WHERE name = N'IX1_#Daily_Channel')
 --   DROP INDEX IX1_#Daily_Channel ON #Daily_Channel


--CREATE NONCLUSTERED INDEX IX1_#Daily_Channel 
 --   ON #Daily_Channel(mamaid)

IF EXISTS (SELECT name from tempdb.sys.indexes
             WHERE name = N'IX_#Daily_ALL')
    DROP INDEX IX_#Daily_ALL ON #Daily_ALL


CREATE CLUSTERED INDEX IX_#Daily_ALL
    ON #Daily_ALL(CreateTime,mamaid)
    
 --   IF EXISTS (SELECT name from sys.indexes
 --            WHERE name = N'IX1_#Daily_ALL')
 --   DROP INDEX IX1_#Daily_ALL ON #Daily_ALL


--CREATE NONCLUSTERED INDEX IX1_#Daily_ALL
 --   ON #Daily_ALL(mamaid)

------解决思路----------------------
补充一下,直接执行的话,它会重新编译,而存储过程是先判断有没有已经编译好的执行计划,存在的话,不会再编译,直接按照原先以编译好的计划执行。。

  相关解决方案