前一篇总结了Sql Server Profiler,它主要用来监控数据库,并跟踪生成的sql语句。但是只拿到生成的sql语句没有什么用,我们可以利用这些sql语句,然后结合执行计划来分析sql语句的性能问题,这才是我们的最终目的,那么如何使用执行计划呢?我准备从以下几点来总结。
- 如何启动执行计划
- 执行计划结果要看什么
- Sql Server的五种查找方式
- 查看更具体的执行过程
如何启动执行计划
运行一条sql,并且在工具栏中选中'Include Actual Execution Plan'按钮,此时就启动了执行计划,如下图。
Sql语句:
USE TSQLFundamentals2008;
GO
-- 查询2006年7月1日到2007年7月31日的所有订单,并按requireddate字段排序
SELECT orderid,orderdate,requireddate,shippeddate,shipname,shipaddress FROM Sales.Orders
WHERE orderdate>='20060701' AND orderdate<'20070801'
ORDER BY requireddate;
执行查询,可以在结果栏中看到执行计划结果,如下图。
执行计划结果要看什么
执行计划结果出来了,那我们要怎么看呢?一般我们只需关注以下几个参数。
- 哪一步开销较高。开销较高的地方说明这个地方查询比较耗时。
- 哪些步骤所影响的数据行较多。这个可以通过连接线条的粗细来判断。
- 每一步做了些什么事情。
Sql Server的五种查询方式
要了解Sql Server的五种查询方式之前,我们要弄明白两个概念,Sql Server中的两种索引,聚集索引和非聚集索引。【聚集索引】直接决定了记录的存放位置,或者说,根据聚集索引可以直接获取到该记录,一般我们表的主键都是用聚集索引。【非聚集索引】则保存了二个信息,1.相应索引字段的值。2.记录对应聚集索引的位置(如果表没有聚集索引则保存记录指针)。因此,如果能通过聚集索引来查找记录,则速度是最快的。
下面是Sql Server查询数据的五种方式,这对我们理解执行计划非常重要。五种方式如下。
- 【Table Scan】:遍历整个表来查找匹配的数据行,速度最慢。
- 【Index Scan】:依据索引先从表中过滤出一部分记录,然后再查找所有匹配的数据行。查询速度比Table Scan稍快。
- 【Index Seek】:依据索引,定位记录的存放位置,然后再取得记录,因此,其查询速度比前面两种都快。
- 【Clustered Index Scan】:按聚集索引(一般是主键)遍历整个表,因为它的记录就是按聚集索引来顺序存放的。注意它与Table Scan的区别,其实它们都是进行全表扫描,只不过Table Scan是不带索引的扫描,而Clustered Index Scan是按聚集索引扫描的。
- 【Clustered Index Seek】:聚集索引获取记录,它是直接拿到那条记录,而没有进行全表扫描,因此它的查询速度是最快的。
当我们查看执行计划结果的时候,如果看到【Table Scan】,说明这个表没有建立任何索引,包括聚集索引。但往往看到更多的是【Clustered Index Scan】,表示该查询还是扫描了速个表,只不过是按聚集索引,实际效果还是和【Table Scan】没什么区别,因此,这时候我们可能要考虑建立'组合字段索引'。
查看更具体的执行过程
能过执行计划的结果图我们只能看出哪一块比较耗时,但是看不到Sql Server具体是怎么执行的。为了看得更明白,我们可以通过一条sql命令来查看,如下代码。
SET STATISTICS PROFILE ON;
执行结果除了返回数据集和执行计划外,还返回了一个表显示具体的执行过程,如下图。
这个结果我们重点要关注以下几点:
- Stmt Text:所执行的步骤详细描述,一般从最内层往外看。
- Rows:表示该执行步骤所产生的记录数。
- Executes:表示某执行步骤被执行的记录数。
参考资料
1,Fish Li的 看懂SqlServer查询计划
2,田园里的蟋蟀的 程序员眼中的 SQL Server-执行计划教会我如何创建索引?