执行计划相关知识
执行计划相关知识
msdn参考:http://technet.microsoft.com/zh-cn/library/ms191158.aspx
SET STATISTICS XML ON
SET SHOWPLAN_XML ON
输出下面内容
1 <?xml version="1.0" encoding="utf-16"?> 2 <ShowPlanXML xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Version="1.2" Build="11.0.9120.5" xmlns="http://schemas.microsoft.com/sqlserver/2004/07/showplan"> 3 <BatchSequence> 4 <Batch> 5 <Statements> 6 <StmtSimple StatementCompId="1" StatementEstRows="11.5571" StatementId="1" StatementOptmLevel="FULL" StatementOptmEarlyAbortReason="GoodEnoughPlanFound" CardinalityEstimationModel110="OFF" StatementSubTreeCost="0.105026" StatementText="SELECT BusinessEntityID,FirstName,LastName
FROM Person.Person
WHERE UPPER(FirstName)='Gustavo'" StatementType="SELECT" QueryHash="0xA8917389A994847E" QueryPlanHash="0xB3A976F142350334" RetrievedFromCache="true"> 7 <StatementSetOptions ANSI_NULLS="true" ANSI_PADDING="true" ANSI_WARNINGS="true" ARITHABORT="true" CONCAT_NULL_YIELDS_NULL="true" NUMERIC_ROUNDABORT="false" QUOTED_IDENTIFIER="true" /> 8 <QueryPlan DegreeOfParallelism="1" CachedPlanSize="16" CompileTime="2" CompileCPU="2" CompileMemory="232"> 9 <MemoryGrantInfo SerialRequiredMemory="0" SerialDesiredMemory="0" /> 10 <OptimizerHardwareDependentProperties EstimatedAvailableMemoryGrant="205727" EstimatedPagesCached="51431" EstimatedAvailableDegreeOfParallelism="2" /> 11 <RelOp AvgRowSize="78" EstimateCPU="0.0221262" EstimateIO="0.0809028" EstimateRebinds="0" EstimateRewinds="0" EstimatedExecutionMode="Row" EstimateRows="11.5571" LogicalOp="Index Scan" NodeId="1" Parallel="false" PhysicalOp="Index Scan" EstimatedTotalSubtreeCost="0.103029" TableCardinality="19972"> 12 <OutputList> 13 <ColumnReference Database="[AdventureWorks2012]" Schema="[Person]" Table="[Person]" Column="BusinessEntityID" /> 14 <ColumnReference Database="[AdventureWorks2012]" Schema="[Person]" Table="[Person]" Column="FirstName" /> 15 <ColumnReference Database="[AdventureWorks2012]" Schema="[Person]" Table="[Person]" Column="LastName" /> 16 </OutputList> 17 <RunTimeInformation> 18 <RunTimeCountersPerThread Thread="0" ActualRows="2" ActualEndOfScans="1" ActualExecutions="1" /> 19 </RunTimeInformation> 20 <IndexScan Ordered="false" ForcedIndex="false" ForceSeek="false" ForceScan="false" NoExpandHint="false" Storage="RowStore"> 21 <DefinedValues> 22 <DefinedValue> 23 <ColumnReference Database="[AdventureWorks2012]" Schema="[Person]" Table="[Person]" Column="BusinessEntityID" /> 24 </DefinedValue> 25 <DefinedValue> 26 <ColumnReference Database="[AdventureWorks2012]" Schema="[Person]" Table="[Person]" Column="FirstName" /> 27 </DefinedValue> 28 <DefinedValue> 29 <ColumnReference Database="[AdventureWorks2012]" Schema="[Person]" Table="[Person]" Column="LastName" /> 30 </DefinedValue> 31 </DefinedValues> 32 <Object Database="[AdventureWorks2012]" Schema="[Person]" Table="[Person]" Index="[IX_Person_LastName_FirstName_MiddleName]" IndexKind="NonClustered" Storage="RowStore" /> 33 <Predicate> 34 <ScalarOperator ScalarString="upper([AdventureWorks2012].[Person].[Person].[FirstName])=N'Gustavo'"> 35 <Compare CompareOp="EQ"> 36 <ScalarOperator> 37 <Intrinsic FunctionName="upper"> 38 <ScalarOperator> 39 <Identifier> 40 <ColumnReference Database="[AdventureWorks2012]" Schema="[Person]" Table="[Person]" Column="FirstName" /> 41 </Identifier> 42 </ScalarOperator> 43 </Intrinsic> 44 </ScalarOperator> 45 <ScalarOperator> 46 <Const ConstValue="N'Gustavo'" /> 47 </ScalarOperator> 48 </Compare> 49 </ScalarOperator> 50 </Predicate> 51 </IndexScan> 52 </RelOp> 53 </QueryPlan> 54 </StmtSimple> 55 </Statements> 56 </Batch> 57 </BatchSequence> 58 </ShowPlanXML>
StatementOptmEarlyAbortReason="GoodEnoughPlanFound"
RelOp AvgRowSize="78" EstimateCPU="0.0221262" EstimateIO="0.0809028" EstimateRebinds="0" EstimateRewinds="0"
Rewinds和Rebinds的解释:
Init():Init() 方法使物理运算符初始化自身并设置所有需要的数据结构。 尽管一个物理运算符通常只接收一次 Init() 调用,但也可以接收许多次调用。
GetNext():GetNext() 方法使物理运算符获得数据的第一行或后续行。 物理运算符可以不接收 GetNext() 调用,也可以接收许多次调用。
Close():Close() 方法使物理运算符执行某些清除操作,然后关闭。 一个物理运算符只接收一个 Close() 调用。
GetNext() 方法返回一个数据行,它的调用次数作为 ActualRows 显示在使用 SET STATISTICS PROFILE ON 或 SET STATISTICS XML ON 生成的显示计划输出中。 有关这些 SET 选项的详细信息,请参阅 SET STATISTICS PROFILE (Transact-SQL) 和 SET STATISTICS XML (Transact-SQL)。
显示计划输出中显示的 ActualRebinds 和 ActualRewinds 计数是指 Init() 方法被调用的次数。 除非运算符位于循环联接的内侧,否则 ActualRebinds 等于一,ActualRewinds 等于零。 如果运算符位于循环联接的内侧,那么重新绑定次数和重绕次数之和应等于联接外侧所处理的行数。 重新绑定意味着联接的一个或多个相关参数发生更改后,必须重新计算联接的内侧。 重绕意味着任何相关参数都没有发生更改,可以重用之前的内侧结果集。
ActualRebinds 和 ActualRewinds 显示在使用 SET STATISTICS XML ON 生成的 XML 显示计划输出中。 它们只为 Nonclustered Index Spool、Remote Query、Row Count Spool、Sort、Table Spool 和 Table-valued Function 运算符填充。 如果 StartupExpression 属性设置为 TRUE,也会为 Assert 和 Filter 运算符填充 ActualRebinds 和 ActualRewinds。
当 ActualRebinds 和 ActualRewinds 显示在 XML 显示计划中时,它们可以与 EstimateRebinds 和 EstimateRewinds 相比较。 如果它们没有显示,则预计的行数 (EstimateRows) 可以与实际的行数 (ActualRows) 相比较。 注意,如果它们没有显示,实际的图形显示计划输出中将实际的重新绑定次数和重绕次数均显示为零。
只有在显示计划输出是使用 SET STATISTICS XML ON 生成的情况下,相关计数器 ActualEndOfScans 才可用。 只要物理运算符到达其数据流的结尾,此计数器就增加一。 物理运算符可以到达其数据流结尾零次、一次或多次。 对于重新绑定次数和重绕次数,只有在运算符位于循环联接的内侧时,扫描结束的次数才可以多于一次。 扫描结束的次数应少于或等于重新绑定次数与重绕次数之和。
逻辑运算符和物理运算符
1 USE [GPOSDB] 2 GO 3 SET STATISTICS PROFILE ON 4 GO 5 SELECT * FROM [dbo].[SystemPara] WHERE [RecordNo]=12
和XML输出是一样的
SET STATISTICS XML ON
SET SHOWPLAN_XML ON
StatementOptmEarlyAbortReason="GoodEnoughPlanFound"
GetNext():GetNext() 方法使物理运算符获得数据的第一行或后续行。 物理运算符可以不接收 GetNext() 调用,也可以接收许多次调用。
GetNext() 方法返回一个数据行,它的调用次数作为 ActualRows 显示在使用 SET STATISTICS PROFILE ON 或 SET STATISTICS XML ON 生成的显示计划输出中。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南