2013-02-13 5 views
10

次に他の上のいずれかを使用する利点は何ですか:DATEPART(年、...)対イヤー(...)

YEAR(GETDATE()) 
:とは対照的に

DATEPART(YEAR, GETDATE()) 

パフォーマンスに違いはありますか?もしそうなら、どちらが最速ですか?

答えて

12

- それは決定論機能と考えられていますので、私は計算列の定義

ALTER TABLE dbo.MyTable 
ADD YearOfDate AS YEAR(SomeDateColumn) 

でこれを使用している場合、私はこのコラムを持続させることができるのでYEAR(..)を使用して、私のためであることが好ましく、 (テーブルに格納):

ALTER TABLE dbo.MyTable 
ADD YearOfDate AS YEAR(SomeDateColumn) PERSISTED 

これは0123ですはではなく、DATEPART(YEAR, SomeDateColumn)で動作します(私には質問しないでください - これは発見的に気づいただけです)。

MONTH(SomeDate)DATEPART(MONTH, SomeDate)についても同様です。

あなたは日付(のようなSalesDateか何か)の月と年に基づいてから選択する必要がテーブルを持っている場合は、として、月と年を持つことが、計算列を持続(およびそれらのインデックスを作成する)は、巨大なことができますパフォーマンスの向上。

+0

興味深いことに、私は実際これを見ません。 [SQL Fiddle](http://sqlfiddle.com/#!3/ab2f5/1/0)。私は何が欠けていますか? –

+0

[SQL Server 2008および2012](http://msdn.microsoft.com/en-us/library/ms186724(v = sql.110).aspx)のドキュメントでは、 'datepart'は非決定論的です。 [SQL Server 2005](http://msdn.microsoft.com/en-us/library/ms186724(v = sql.90).aspx)には、 'datepart'に対する非決定的な引数のリストがあります。ドキュメントは変更されたようですが、SQL Serverは変更されていません。 –

+0

@MikaelEriksson:興味深い....私は**誓った**私はそれを試したときに 'DATEPART()AS PERSISTED 'とうまくいかなかったかもしれない......しかしそれは今行う。明確にしてくれてありがとう! –

22

違いはありません。実行計画では、両方ともdatepart(year,getdate())に変換されます。

これは、SQL Server 2005、2008年と2012年

select datepart(year, getdate()) 
from (select 1 x) x 

select year(getdate()) 
from (select 1 x) x 

実行計画についても同様です。

実際
<?xml version="1.0" encoding="utf-16"?> 
<ShowPlanXML xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Version="1.0" Build="9.00.5057.00" xmlns="http://schemas.microsoft.com/sqlserver/2004/07/showplan"> 
    <BatchSequence> 
    <Batch> 
     <Statements> 
     <StmtSimple StatementCompId="1" StatementEstRows="1" StatementId="1" StatementOptmLevel="TRIVIAL" StatementSubTreeCost="1.157E-06" StatementText="select datepart(year, getdate())&#xD;&#xA;from (select 1 x) x&#xD;&#xA;&#xD;" StatementType="SELECT"> 
      <StatementSetOptions ANSI_NULLS="false" ANSI_PADDING="false" ANSI_WARNINGS="false" ARITHABORT="true" CONCAT_NULL_YIELDS_NULL="false" NUMERIC_ROUNDABORT="false" QUOTED_IDENTIFIER="false" /> 
      <QueryPlan DegreeOfParallelism="0" CachedPlanSize="8" CompileTime="23" CompileCPU="23" CompileMemory="64"> 
      <RelOp AvgRowSize="11" EstimateCPU="1.157E-06" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="1" LogicalOp="Constant Scan" NodeId="0" Parallel="false" PhysicalOp="Constant Scan" EstimatedTotalSubtreeCost="1.157E-06"> 
       <OutputList> 
       <ColumnReference Column="Expr1001" /> 
       </OutputList> 
       <RunTimeInformation> 
       <RunTimeCountersPerThread Thread="0" ActualRows="1" ActualEndOfScans="1" ActualExecutions="1" /> 
       </RunTimeInformation> 
       <ConstantScan> 
       <Values> 
        <Row> 
        <ScalarOperator ScalarString="datepart(year,getdate())"> 
         <Identifier> 
         <ColumnReference Column="ConstExpr1002"> 
          <ScalarOperator> 
          <Intrinsic FunctionName="datepart"> 
           <ScalarOperator> 
           <Const ConstValue="(0)" /> 
           </ScalarOperator> 
           <ScalarOperator> 
           <Intrinsic FunctionName="getdate" /> 
           </ScalarOperator> 
          </Intrinsic> 
          </ScalarOperator> 
         </ColumnReference> 
         </Identifier> 
        </ScalarOperator> 
        </Row> 
       </Values> 
       </ConstantScan> 
      </RelOp> 
      </QueryPlan> 
     </StmtSimple> 
     </Statements> 
    </Batch> 
    <Batch> 
     <Statements> 
     <StmtSimple StatementCompId="2" StatementEstRows="1" StatementId="2" StatementOptmLevel="TRIVIAL" StatementSubTreeCost="1.157E-06" StatementText="select year(getdate())&#xD;&#xA;from (select 1 x) x" StatementType="SELECT"> 
      <StatementSetOptions ANSI_NULLS="false" ANSI_PADDING="false" ANSI_WARNINGS="false" ARITHABORT="true" CONCAT_NULL_YIELDS_NULL="false" NUMERIC_ROUNDABORT="false" QUOTED_IDENTIFIER="false" /> 
      <QueryPlan DegreeOfParallelism="0" CachedPlanSize="8" CompileTime="0" CompileCPU="0" CompileMemory="64"> 
      <RelOp AvgRowSize="11" EstimateCPU="1.157E-06" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="1" LogicalOp="Constant Scan" NodeId="0" Parallel="false" PhysicalOp="Constant Scan" EstimatedTotalSubtreeCost="1.157E-06"> 
       <OutputList> 
       <ColumnReference Column="Expr1001" /> 
       </OutputList> 
       <RunTimeInformation> 
       <RunTimeCountersPerThread Thread="0" ActualRows="1" ActualEndOfScans="1" ActualExecutions="1" /> 
       </RunTimeInformation> 
       <ConstantScan> 
       <Values> 
        <Row> 
        <ScalarOperator ScalarString="datepart(year,getdate())"> 
         <Identifier> 
         <ColumnReference Column="ConstExpr1002"> 
          <ScalarOperator> 
          <Intrinsic FunctionName="datepart"> 
           <ScalarOperator> 
           <Const ConstValue="(0)" /> 
           </ScalarOperator> 
           <ScalarOperator> 
           <Intrinsic FunctionName="getdate" /> 
           </ScalarOperator> 
          </Intrinsic> 
          </ScalarOperator> 
         </ColumnReference> 
         </Identifier> 
        </ScalarOperator> 
        </Row> 
       </Values> 
       </ConstantScan> 
      </RelOp> 
      </QueryPlan> 
     </StmtSimple> 
     </Statements> 
    </Batch> 
    </BatchSequence> 
</ShowPlanXML> 
関連する問題