2013-02-13 18 views

cevap

12

Aslında - bir deterministik fonksiyon olarak kabul beri, benim için tercihen YEAR(..) kullanılarak, bu yüzden bir hesaplanan sütun tanımında bu kullanırsanız

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

Ben kalıcı Bu sütunu yapabilirsiniz (ve tabloya saklayın):

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

Bu DATEPART(YEAR, SomeDateColumn) için çalışıyor (bana neden sorma - sadece bu sezgisel olarak fark ettim).

Aynı şey MONTH(SomeDate) vs DATEPART(MONTH, SomeDate) için geçerlidir. Eğer bir tarih ay ve yıl dayanan seçim yapmanız gerektiğinde tablolar varsa

(gibi SalesDate veya şey), sürdükçe sonra ay ve yıl olan (ve onları indeksleme) büyük olabilir sütun bilgisayarlı performans artışı.

+0

İlginç, aslında bunu görmüyorum. [SQL Fiddle] (http://sqlfiddle.com/#!3/ab2f5/1/0). Neyi kaçırıyorum? –

+0

[SQL Server 2008 ve 2012] belgesindeki belgeler (http://msdn.microsoft.com/en-us/library/ms186724 (v = sql.110) .aspx), datepart'ın nondeterministic olduğunu söylüyor. [SQL Server 2005] için (http://msdn.microsoft.com/en-us/library/ms186724 (v = sql.90) .aspx) 'datepart' için nondeterministic argümanların bir listesi vardır. Belgelerin değişmiş gibi görünüyor ama SQL Server yok. –

+0

@MikaelEriksson: ilginç .... Ben ** yemin etmiş olabilir ** bunu çalıştığında DATEPART() AS PERSISTED ile çalışmadı ...... ama şimdi yapar. Netleştirdiğiniz için teşekkürler! –

22

Fark yoktur. Uygulama planında her ikisi de datepart(year,getdate()) olarak çevrilmiştir.

Bu SQL Server 2005, 2008 ve 2012.

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

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

Yürütme planı için de geçerlidir.

<?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> 
İlgili konular