Week 9: Understanding Execution Plans
Why Execution Plans?
许多人会问什么在SQL Server里需要执行计划, 首先我们来讲下SQL语言,也就是T-SQL. t-sql是一种声明语言. 我们用逻辑的方式来描述我们想要返回哪些数据(Select),或者改变哪些数据(insert,update,delete). 来看下面的查询:
SELECT A.*, B.* FROM A INNER JOIN B ON A.ID = B.ID WHERE A.X = 'SomeValue'
这个查询告诉数据库:
- 我们想从A和B表中检索数据
- 两个表是用ID列交联的
- 用A表的X列来筛选数据
我们只是通过SQL语句描述我们想要从数据库查询的结果, 没有告诉SQL Server怎样执行这个查询,怎样处理请求数据.
所以SQL Server需要一个物理的执行计划来决定怎样一步一步的检索或改变数据. 而执行计划就是查询优化器用来处理数据的策略.
用我们真实的生活举个例子,比如我们想从一个城市去另一个城市旅行,我们说从伦敦去往巴黎,这是一个逻辑的表达,要实现这个旅行有多个选择:
- 我们从伦敦步行到巴黎
- 我们骑自行车去
- 我们乘坐交通工具(火车,飞机,汽车)
你现在的工作就是找到其中一种方式,比如乘坐飞机. 查询优化器也是做的同样的工作,它会挑出一个满足查询而又开销最小的执行计划.
在查询空间里找到足够好的执行计划是查询优化器的挑战, 而当查询包含的表和索引非常多的时候,查询空间也会变的异常巨大.
How to read Execution Plans
当我们第一次接触执行计划时,可能会一头雾水,看不明白:
上图中,可以看到执行计划包含了很多的步骤,我们称之为操作子(Operators),而这些操作子在SQL Server中按照从从右向左的顺序被一一调用, 在这个例子中, 第一步执行的是Address表上的Index Seek(Non Clustered)操作, 扫描后的每条记录都来到后面的操作子Nested Loops,然后SQL Server对这些记录进行一个Key Lookup(Clustered)的操作(Bookmark lookup). 如果有对应的行,就进入到SELECT操作子中,最后返回给应用程序.
按照从右向左的顺序来看这个图示就比较容易理解执行计划的含义了.如果想知道更多不同操作子的细节,强烈推荐一本免费的电子书:
Complete Showplan Operators by Fabiano Amorim.