: aksineDatepart (yıl, ...) vs. Yıl (...) aşağıdaki üst üste kullanmanın avantajları nelerdir
DATEPART(YEAR, GETDATE())
için:
YEAR(GETDATE())
Bir performans farkı var mı? Eğer öyleyse hangisi en hızlı?
: aksineDatepart (yıl, ...) vs. Yıl (...) aşağıdaki üst üste kullanmanın avantajları nelerdir
DATEPART(YEAR, GETDATE())
için:
YEAR(GETDATE())
Bir performans farkı var mı? Eğer öyleyse hangisi en hızlı?
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ışı.
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())
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="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())
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>
İlginç, aslında bunu görmüyorum. [SQL Fiddle] (http://sqlfiddle.com/#!3/ab2f5/1/0). Neyi kaçırıyorum? –
[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. –
@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! –