zoukankan      html  css  js  c++  java
  • 了解Sql Server的执行计划

      前一篇总结了Sql Server Profiler,它主要用来监控数据库,并跟踪生成的sql语句。但是只拿到生成的sql语句没有什么用,我们可以利用这些sql语句,然后结合执行计划来分析sql语句的性能问题,这才是我们的最终目的,那么如何使用执行计划呢?我准备从以下几点来总结。

    1. 如何启动执行计划
    2. 执行计划结果要看什么
    3. Sql Server的五种查找方式
    4. 查看更具体的执行过程

    如何启动执行计划

      运行一条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;

      执行查询,可以在结果栏中看到执行计划结果,如下图。

      

    执行计划结果要看什么

      执行计划结果出来了,那我们要怎么看呢?一般我们只需关注以下几个参数。

    1. 哪一步开销较高。开销较高的地方说明这个地方查询比较耗时。
    2. 哪些步骤所影响的数据行较多。这个可以通过连接线条的粗细来判断。
    3. 每一步做了些什么事情。

    Sql Server的五种查询方式

       要了解Sql Server的五种查询方式之前,我们要弄明白两个概念,Sql Server中的两种索引,聚集索引和非聚集索引。【聚集索引】直接决定了记录的存放位置,或者说,根据聚集索引可以直接获取到该记录,一般我们表的主键都是用聚集索引。【非聚集索引】则保存了二个信息,1.相应索引字段的值。2.记录对应聚集索引的位置(如果表没有聚集索引则保存记录指针)。因此,如果能通过聚集索引来查找记录,则速度是最快的。

      下面是Sql Server查询数据的五种方式,这对我们理解执行计划非常重要。五种方式如下。

    1. 【Table Scan】:遍历整个表来查找匹配的数据行,速度最慢。
    2. 【Index Scan】:依据索引先从表中过滤出一部分记录,然后再查找所有匹配的数据行。查询速度比Table Scan稍快。
    3. 【Index Seek】:依据索引,定位记录的存放位置,然后再取得记录,因此,其查询速度比前面两种都快。
    4. 【Clustered Index Scan】:按聚集索引(一般是主键)遍历整个表,因为它的记录就是按聚集索引来顺序存放的。注意它与Table Scan的区别,其实它们都是进行全表扫描,只不过Table Scan是不带索引的扫描,而Clustered Index Scan是按聚集索引扫描的。
    5. 【Clustered Index Seek】:聚集索引获取记录,它是直接拿到那条记录,而没有进行全表扫描,因此它的查询速度是最快的。

      当我们查看执行计划结果的时候,如果看到【Table Scan】,说明这个表没有建立任何索引,包括聚集索引。但往往看到更多的是【Clustered Index Scan】,表示该查询还是扫描了速个表,只不过是按聚集索引,实际效果还是和【Table Scan】没什么区别,因此,这时候我们可能要考虑建立'组合字段索引'。

    查看更具体的执行过程

      能过执行计划的结果图我们只能看出哪一块比较耗时,但是看不到Sql Server具体是怎么执行的。为了看得更明白,我们可以通过一条sql命令来查看,如下代码。

    SET STATISTICS PROFILE ON;

      执行结果除了返回数据集和执行计划外,还返回了一个表显示具体的执行过程,如下图。

      这个结果我们重点要关注以下几点:

    1. Stmt Text:所执行的步骤详细描述,一般从最内层往外看。
    2. Rows:表示该执行步骤所产生的记录数。
    3. Executes:表示某执行步骤被执行的记录数。

    参考资料

    1,Fish Li的 看懂SqlServer查询计划

    2,田园里的蟋蟀的 程序员眼中的 SQL Server-执行计划教会我如何创建索引?

  • 相关阅读:
    构造函数的继承
    创建一个不被销毁的空间 闭包小应用
    如何在Linux上恢复误删除的文件或目录
    一文详解 Ansible 自动化运维
    Shell 脚本编程最佳实践
    10 分钟看懂 Docker 和 K8S!
    BGP路由协议详解(完整版)
    浅析 Linux 中的零拷贝技术
    2020年DevOps工程师入门指南
    一条更新的SQL如何执行
  • 原文地址:https://www.cnblogs.com/mcgrady/p/4174185.html
Copyright © 2011-2022 走看看