我们知道sql在底层的执行给我们上层人员开了一个窗口,那就是执行计划,有了执行计划之后,我们就清楚了那些烂sql是怎么执行的,这样 就可以方便的找到sql的缺陷和优化点。 一:执行计划生成过程 说到执行计划,首先要知道的是执行计划大概生成的过程,这样
我们知道sql在底层的执行给我们上层人员开了一个窗口,那就是执行计划,有了执行计划之后,我们就清楚了那些烂sql是怎么执行的,这样
就可以方便的找到sql的缺陷和优化点。
一:执行计划生成过程
说到执行计划,首先要知道的是执行计划大概生成的过程,这样就可以做到就心中有数了,下面我画下简图:
1. 分析过程
这三个比较容易理解,首先我们要保证sql的语法不能错误,select和join的表是必须存在的,以及你是有执行这个sql的权限,对不对。。。
这样我们就走完了执行计划生命周期的第一个流程。
2. 编译过程
保证了上面sql这三点的话,引擎就必须硬着头皮看你这么一大坨烂sql,该删的删,该改的改,该转换的转换,比如说你的[子查询]会转化为
[表连接]等等。。。其实也挺难为引擎的,举个例子吧。
子查询生成的sql:
join生成的sql:
从上面的两个结果中,你可以看到,大家都是玩join的,如果你仔细看的话,会发现一个是[哈希匹配],一个是[嵌套循环],为什么不一样,这
当然是引擎根据很多情况综合评选出来的,比如说:磁盘IO,逻辑读,资源占用,硬件环境等等。。。这也是所谓的[计划选优]操作。
3.执行过程
既然执行计划都选出来了,理所当然就要执行了,执行完后会把sql和执行计划放入缓存,这样下次有同样的sql过来的时候就可以直接从
Cache中提取了,不需要再次生成计划了,你也看到,生成执行计划还是比较消耗CPU时间的。
二:看看sql和执行的计划的缓存
刚才也说了,sql和plan都已经放入缓存了,那我的好奇心比较强,我就想看看sql和plan到底在哪,并且长的是个什么丑样子,刚好
sqlserver还是比较能够满足我们G点的。
1. 为了方便查看缓存,我需要先将所有的缓存清空,比如下面的语句。
DBCC freeproccache SELECT c. * FROM dbo.Category AS c JOIN dbo.Product AS p ON c.CategoryId = p.CategoryId WHERE c.CategoryId = 23794
2. 通过sys.dm_exec_cached_plans拿到sql和plan的指针(plan_handle),如下图
SELECT * FROM sys.dm_exec_cached_plans
从图中你看到了两个adhoc(即时查询),分别是我在第一步执行的join查询和我在第二步执行的这个select。
3. 现在我们已经拿到了2个adhoc的plan_handle,然后通过dm_exec_sql_text查看他们的sql分别是怎样?
4. 看完text缓存,接下来我们继续看看sql的plan缓存在哪?可以通过dm_exec_query_plan来查看。
上面的query_plan字段就是所谓的执行计划,以xml的形式保存在字段中。。。所以说解析这个xml还是很费时间的。。。
1 xml version="1.0" ?>
2 ShowPlanXML xmlns ="http://schemas.microsoft测试数据/sqlserver/2004/07/showplan" Version ="1.1" Build ="10.0.1600.22" >
3 BatchSequence >
4 Batch >
5 Statements >
6 StmtSimple StatementText ="SELECT c.* FROM dbo.Category AS c
7 JOIN dbo.Product AS p
8 ON c.CategoryId=p.CategoryId
9 WHERE c.CategoryId=23794" StatementId ="1" StatementCompId ="1" StatementType ="SELECT" StatementSubTreeCost ="1.33278" StatementEstRows ="1.03803" StatementOptmLevel ="FULL" QueryHash ="0xB10B821B9B5E6396" QueryPlanHash ="0x8C7B3B1660E28D16" >
10 StatementSetOptions QUOTED_IDENTIFIER ="true" ARITHABORT ="true" CONCAT_NULL_YIELDS_NULL ="true" ANSI_NULLS ="true" ANSI_PADDING ="true" ANSI_WARNINGS ="true" NUMERIC_ROUNDABORT ="false" />
11 QueryPlan CachedPlanSize ="16" CompileTime ="2" CompileCPU ="2" CompileMemory ="168" >
12 MissingIndexes >
13 MissingIndexGroup Impact ="99.4633" >
14 MissingIndex Database ="[MYPETSHOP]" Schema ="[dbo]" Table ="[Product]" >
15 ColumnGroup Usage ="EQUALITY" >
16 Column Name ="[CategoryId]" ColumnId ="2" />
17 ColumnGroup >
18 MissingIndex >
19 MissingIndexGroup >
20 MissingIndexGroup Impact ="99.4636" >
21 MissingIndex Database ="[MYPETSHOP]" Schema ="[dbo]" Table ="[Product]" >
22 ColumnGroup Usage ="EQUALITY" >
23 Column Name ="[CategoryId]" ColumnId ="2" />
24 ColumnGroup >
25 MissingIndex >
26 MissingIndexGroup >
27 MissingIndexes >
28 RelOp NodeId ="0" PhysicalOp ="Nested Loops" LogicalOp ="Inner Join" EstimateRows ="1.03803" EstimateIO ="0" EstimateCPU ="4.33898e-006" AvgRowSize ="97" EstimatedTotalSubtreeCost ="1.33278" Parallel ="0" EstimateRebinds ="0" EstimateRewinds ="0" >
29 OutputList >
30 ColumnReference Database ="[MYPETSHOP]" Schema ="[dbo]" Table ="[Category]" Alias ="[c]" Column ="CategoryId" />
31 ColumnReference Database ="[MYPETSHOP]" Schema ="[dbo]" Table ="[Category]" Alias ="[c]" Column ="Name" />
32 ColumnReference Database ="[MYPETSHOP]" Schema ="[dbo]" Table ="[Category]" Alias ="[c]" Column ="Image" />
33 OutputList >
34 NestedLoops Optimized ="0" >
35 RelOp NodeId ="1" PhysicalOp ="Clustered Index Seek" LogicalOp ="Clustered Index Seek" EstimateRows ="1" EstimateIO ="0.003125" EstimateCPU ="0.0001581" AvgRowSize ="97" EstimatedTotalSubtreeCost ="0.0032831" TableCardinality ="1.00001e+006" Parallel ="0" EstimateRebinds ="0" EstimateRewinds ="0" >
36 OutputList >
37 ColumnReference Database ="[MYPETSHOP]" Schema ="[dbo]" Table ="[Category]" Alias ="[c]" Column ="CategoryId" />
38 ColumnReference Database ="[MYPETSHOP]" Schema ="[dbo]" Table ="[Category]" Alias ="[c]" Column ="Name" />
39 ColumnReference Database ="[MYPETSHOP]" Schema ="[dbo]" Table ="[Category]" Alias ="[c]" Column ="Image" />
40 OutputList >
41 IndexScan Ordered ="1" ScanDirection ="FORWARD" ForcedIndex ="0" ForceSeek ="0" NoExpandHint ="0" >
42 DefinedValues >
43 DefinedValue >
44 ColumnReference Database ="[MYPETSHOP]" Schema ="[dbo]" Table ="[Category]" Alias ="[c]" Column ="CategoryId" />
45 DefinedValue >
46 DefinedValue >
47 ColumnReference Database ="[MYPETSHOP]" Schema ="[dbo]" Table ="[Category]" Alias ="[c]" Column ="Name" />
48 DefinedValue >
49 DefinedValue >
50 ColumnReference Database ="[MYPETSHOP]" Schema ="[dbo]" Table ="[Category]" Alias ="[c]" Column ="Image" />
51 DefinedValue >
52 DefinedValues >
53 Object Database ="[MYPETSHOP]" Schema ="[dbo]" Table ="[Category]" Index ="[PK_Category]" Alias ="[c]" IndexKind ="Clustered" />
54 SeekPredicates >
55 SeekPredicateNew >
56 SeekKeys >
57 Prefix ScanType ="EQ" >
58 RangeColumns >
59 ColumnReference Database ="[MYPETSHOP]" Schema ="[dbo]" Table ="[Category]" Alias ="[c]" Column ="CategoryId" />
60 RangeColumns >
61 RangeExpressions >
62 ScalarOperator ScalarString ="(23794)" >
63 Const ConstValue ="(23794)" />
64 ScalarOperator >
65 RangeExpressions >
66 Prefix >
67 SeekKeys >
68 SeekPredicateNew >
69 SeekPredicates >
70 IndexScan >
71 RelOp >
72 RelOp NodeId ="2" PhysicalOp ="Clustered Index Scan" LogicalOp ="Clustered Index Scan" EstimateRows ="1.03803" EstimateIO ="1.18831" EstimateCPU ="0.0983419" AvgRowSize ="11" EstimatedTotalSubtreeCost ="1.28665" TableCardinality ="89259" Parallel ="0" EstimateRebinds ="0" EstimateRewinds ="0" >
73 OutputList />
74 IndexScan Ordered ="0" ForcedIndex ="0" NoExpandHint ="0" >
75 DefinedValues />
76 Object Database ="[MYPETSHOP]" Schema ="[dbo]" Table ="[Product]" Index ="[PK_Product]" Alias ="[p]" IndexKind ="Clustered" />
77 Predicate >
78 ScalarOperator ScalarString ="[MYPETSHOP].[dbo].[Product].[CategoryId] as [p].[CategoryId]=(23794)" >
79 Compare CompareOp ="EQ" >
80 ScalarOperator >
81 Identifier >
82 ColumnReference Database ="[MYPETSHOP]" Schema ="[dbo]" Table ="[Product]" Alias ="[p]" Column ="CategoryId" />
83 Identifier >
84 ScalarOperator >
85 ScalarOperator >
86 Const ConstValue ="(23794)" />
87 ScalarOperator >
88 Compare >
89 ScalarOperator >
90 Predicate >
91 IndexScan >
92 RelOp >
93 NestedLoops >
94 RelOp >
95 QueryPlan >
96 StmtSimple >
97 Statements >
98 Batch >
99 BatchSequence >
100 ShowPlanXML >
View Code
查看更多关于SqlServer之旅第十一站简单说说sqlserver的执行计划的详细内容...