-1

なぜこれは最初は遅いのですか? これを避けるにはどうすればよいですか?

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   
4

1 に答える 1

2

SQL はクエリを初めて実行するときに、クエリをコンパイルし、以降の実行用にクエリ プランを作成します。したがって、最初の遅延は、スキーマ、インデックス、および統計に基づいて、最も効果的にデータを見つけるために使用するロジックを SQL が見つけようとすることです。

そこにあるクエリは特にクレイジーではありませんが、これらすべてのサブセレクトを使用すると、サーバーが正しいプランを決定するのに少し時間がかかる理由がわかります。1 つの巨大なクエリをいくつかのステージングされたクエリに分割し、単純なテーブルを構築して最終結果を結合することを検討してください。

クエリ プランの詳細 - http://en.wikipedia.org/wiki/Query_plan

これも問題になる可能性があります。where 句に追加する前に、この値を計算してください。そうしないと、SQL はすべての行比較に対して GETDATE() を計算し、さらに遅くなる可能性があります。同様に、関数呼び出しは各行の値を解析しようとする場合があります (その場合も、コンパイルに時間がかかる原因になっている可能性があります)。

getdate() - @NumberOfDays
fnParseDelimString
于 2013-09-11T18:22:18.160 に答える