SQL Server存储过程第一次运行缓慢

时间:2013-09-11 17:15:06

标签: sql sql-server stored-procedures

为什么第一次运行缓慢?我该怎么做才能避免这种情况?

create PROCEDURE [dbo].[GetMicrosoftXmlFeedData]   
    @PageTemplateIds varchar(500),  
    @PageTemplateLocationIds varchar(500),  
    @ContentTypeIds varchar(500),  
    @PageSourceIds varchar(500),  
    @NumberOfDays int  = 1  
    AS  
      BEGIN  
          select    
           P.pageid  
      , P.maskurl as ArticleURL  
      , C.ContentID  
      , cast(C.ContentXML as xml).value('Content[1]/Headline[1]','varchar(200)') as Headline   
      , cast(C.ContentXML as xml).value('Content[1]/Byline [1]','varchar(200)') as AuthorName  
      , cast(C.ContentXML as xml).value('Content[1]/Deck[1]','varchar(200)') as Description  
      , cast(C.ContentXML as xml).value('Content[1]/BodyContent[1]','varchar(max)') as ArticleDetails  
      , C.DateCreated as POSTING_DATETIME
from cmspage(nolock) P 
   join cmspagecontent(nolock)  PC on P.pageid = PC.pageid  
   join cmsContent(nolock) C on PC.contentid = C.contentid  
   join cmsContentType(nolock) CT on C.ContentTypeId = CT.ContentTypeId  
      where  C.DateCreated > getdate() - @NumberOfDays --100  
        AND    P.pagetemplateid in  (  
          select value from dbo.fnParseDelimString(@PageTemplateIds, ',')  
         --15252, --Article  
        --16543 -- Article - Infogram  
         )   
        and    PC.pagetemplatelocationid in  (  
          select value from dbo.fnParseDelimString(@PageTemplateLocationIds, ',')  
          --17163,  
           --15250  
           )   
        and    CT.contenttypeid in (select value from     dbo.fnParseDelimString(@ContentTypeIds, ','))--(6)   
        and    P.isactive = 1  
        and    P.HasBeenPublished = 1  
        and    P.IsRedirect = 0   
        --and  
            --C.DateCreated > getdate() - @NumberOfDays --100  
        and  
            P.pagesourceid in (select value from dbo.fnParseDelimString(@PageSourceIds,      ','))--(16,1896)  

      END   

1 个答案:

答案 0 :(得分:2)

当SQL第一次运行查询时,它会编译查询并为后续执行创建查询计划。因此,最初的延迟是SQL试图找出基于模式,索引和统计信息使用什么逻辑来最有效地查找数据。

你在那里的查询并不是特别疯狂,但是对于所有这些子选择,我可以看到为什么服务器可能需要一点来确定正确的计划。考虑将一个巨型查询分解为几个阶段的查询并构建简单的表以加入最终结果。

有关查询计划的更多信息 - http://en.wikipedia.org/wiki/Query_plan

这也可能有问题,在将其添加到where子句之前计算此值。否则,SQL可能会为每个行比较计算GETDATE(),从而导致额外的缓慢。类似地,函数调用可能会尝试解析每一行的值(然后它可能只是导致编译花费这么长时间的原因)。

getdate() - @NumberOfDays
fnParseDelimString