概念简介

我们平时所说的查询在SQLServer 中主要有两部分来实现:

  1. 编译查询,主要包括了五个环节(缓存查找、分析、代数化、优化、缓存新计划)

流程描述: 首先,在计划缓存中查找是否包含新的查询,如果包含则直接交由执行引擎来执行该缓存计划,跳过编译阶段。

其次,如果没有匹配则执行分析阶段(包括参数化、并将SQL文本转化成逻辑树作为下一个阶段的输入),

再次检查缓存后是否包含,包含则交给执行引擎,否则继续下一步。

第三,代数化。

第四,优化并将新计划交给执行引擎。

这里需要有个概念的介绍:执行计划缓存,

SQL Server 有一个用于存储执行计划和数据缓冲区的内存池。池内分配给执行计划或数据缓冲区的百分比随系统状态动态波动。

内存池中用于存储执行计划的部分称为过程缓存。

执行计划缓存主要包含了查询计划和执行上下文。

2. 执行查询计划(生成执行计划--产生查询结果),在下一篇中介绍。

编译和重新编译

SQL Server 有一个高效的算法,可查找用于任何特定 SQL 语句的现有执行计划。SQL Server 将重新使用找到的任何现有计划,从而节省重新编译 SQL 语句的开销。如果没有现有执行计划,SQL Server 将为查询生成新的执行计划。由此我们要做的就是如何高效的应用执行计划的缓存,又在合适重新编译执行计划,来提高查询效率,减少性能的损耗。

首先我们要知道什么情况下会有重新编译产生新的执行计划,我简单总结了几种比较常见的情况:

1.使用WITH REPCOMPILE 或者调用sp_repcompile,将不会缓存计划。

2.架构的变更比如表或试图中添加索引,增加或者删除列等。

如图,当执行架构名称不同的时候会引发重新编译,执行计划缓存不能复用,这个问题需要开发人员注意,经常会有不自觉添加或者减少架构名称的举动。不仅会影响性能,当服务器间移动代码时会引起太多问题,建议使用schema.object(dbo.ExcutionTest)这样的统一规范。

如果是增删索引的话,根据实际情况会生成完全不同的执行计划。如图:

建立索引后有表扫描变为了索引查找,这部分内容我在聚集索引的章节已经有过介绍这里就不详细展开了。

3.SET选项,包括:ANSI_NULLS\ANSI_WARNINGS\CURSOR_CLOSE_ON_COMMIT_INPLICIT_TRANSACTIONS\ANSI_PADDING\QUOTED_IDENTIFIER,这些选项状态的变化,会引起执行计划的重新编译。建议,尽量采用数据库默认的设置,不要在存储过程中假如不必要的set选项。

4.根据计划的优化程度:如果对键的大量更改(对由查询引用的表使用 INSERT 、UPDATE或 DELETE 语句所产生的修改)。

分析、代数化和优化

1.分析,会将SQL文本转换为逻辑树,为每一个语句创建逻辑树。

2.代数化,主要完成检查语义是否正确。

同时还会完成三个任务:

  • 名称解析:查询每个对象的名称是否存在正确,作用域是否可见;
  • 类型派生:在分析树种各节点的字段类型等,如表链接后的字段类型。
  • 聚集绑定:根据语法判定聚集的实际操作在宿主查询中。
  • 分组绑定:验证group by 语法是否正确(select 后面的非聚集列必须是group by后面的)。

3.优化

查询优化是处理查询中最复杂部分,这部分由系统自动完成,如果说前面的环节告诉我们“做什么”,那么优化器就是描述“如何做”,查询优化器希望尽可能选择高效的执行计划。这部分将在本系列最后做一个专题。详细的阐述这里现提出流程(简化--探索--实现)。

总结:

本篇系统的介绍了编译查询的流程,以及产生缓存、复用缓存、重新编译等具体内容。对于优化我们的T-SQL语句来说有不少值得注意的地方,执行计划缓存的命中越多相应的我们的查询消耗也就越低,但是这种情况也不是绝对的。最后附加一个用于重新编译的工具和命令的超链接,里面有不少便于查询分析执行计划是否高效甚至存在问题功能和方法,http://www.cnblogs.com/wenBlog/p/4966991.html。

T-SQL性能调整(一)--编译和重新编译的更多相关文章

  1. spark SQL(六)性能调整

    spark SQL 性能调整 对于某些工作负载,可以通过在内存中缓存数据或打开一些实验选项来提高性能. 1,在内存中缓存数据        Spark SQL可以通过调用spark.catalog.c ...

  2. oracle管理优化必备语句以及oracle SQL语句性能调整

    本文转自http://www.dataguru.cn/article-3302-1.html oracle数据库管理优化必备语句: 1. SELECT T.START_TIME,T.USED_UBLK ...

  3. Oracle SQL性能优化技巧大总结

    http://wenku.baidu.com/link?url=liS0_3fAyX2uXF5MAEQxMOj3YIY4UCcQM4gPfPzHfFcHBXuJTE8rANrwu6GXwdzbmvdV ...

  4. DB2数据库性能调整和优化(第2版)

    <DB2数据库性能调整和优化(第2版)> 基本信息 作者: 牛新庄 出版社:清华大学出版社 ISBN:9787302325260 上架时间:2013-7-3 出版日期:2013 年7月 开 ...

  5. Oracle 优化和性能调整

    分析评价Oracle数据库性能主要有数据库吞吐量.数据库用户响应时间两项指标.数据库用户响应时间又可以分为系统服务时间和用户等待时间两项,即:  数据库用户响应时间=系统服务时间+用户等待时间  因此 ...

  6. SQL性能优化案例分析

    这段时间做一个SQL性能优化的案例分析, 整理了一下过往的案例,发现一个比较有意思的,拿出来给大家分享. 这个项目是我在项目开展2期的时候才加入的, 之前一期是个金融内部信息门户, 里面有个功能是收集 ...

  7. SQL性能优化

    引言: 以前在面试的过程中,总有面试官问道:你做过sql性能优化吗?对此,我的答复是没有.一次没有不是自己的错误,两次也不是,但如果是多次呢?今天痛下决心,把有关sql性能优化的相关知识总结一下,以便 ...

  8. 关于Oracle的性能调整(一)

    Oracle Tuning的一些总结 关于Oracle的性能调整,一般包括两个方面,一是指Oracle数据库本身的调整,比如SGA.PGA的优化设置,二是连接Oracle的应用程序以及SQL语句的优化 ...

  9. 【翻译】Netscaler真实表现性能调整

    源地址:https://msandbu.wordpress.com/2014/10/31/netscaler-and-real-performance-tuning/ 作者显然不是以英语为母语的,所以 ...

随机推荐

  1. 【C#进阶系列】17 委托

    委托主要是为了实 现回调函数机制,可以理解为函数指针(唯一不同的在于多了委托链这个概念). 然而用的时候可以这么理解,但是委托的内部机制是比较复杂的. 一个委托的故事 delegate void ra ...

  2. 放弃OT了,找了个新框架ThinkCMF

    放弃OT了,找了个新框架ThinkCMF,感觉还不错,用用看. 选择OT的原因: 1. OT基于ThinkPHP 2. OT对ThinkPHP进行了封装,使得开发应用更加简单 3. yershop应用 ...

  3. [Linux] ubuntu安装配置vsftpd并锁定目录

    系统环境 ubuntu 14.04 LTS vsftpd安装 apt-get install vsftpd 配置文件 默认配置文件的位置为 /etc/vsftpd.conf local_enable= ...

  4. python队列Queue

    Queue Queue是python标准库中的线程安全的队列(FIFO)实现,提供了一个适用于多线程编程的先进先出的数据结构,即队列,用来在生产者和消费者线程之间的信息传递 基本FIFO队列 clas ...

  5. PHP curl超时问题

    今天调试一个非常老的代码时  发现nginx服务器超时  改了下nginx配置 发现是后台脚本一直等待  排查到最后发现是curl 超时引起的等待 具体解决方案: curl_setopt( $this ...

  6. php ci 2.0框架 ORM

    很早知道ci出了2.0版本了.这几天正好有项目要用ci开发 虽然项目不大.不过也从开发项目的过程中熟悉了CI框架 因为是个电商项目 本来想用个YII2 的. 封装的虽然厉害不过功能强大 因为另个兄弟坚 ...

  7. CentOS6.5下安装PostgreSQL

    一.配置 YUM 仓库 修改原始的 yum 仓库配置: vim /etc/yum.repos.d/CentOS-Base.repo 在[base]和[updates] 节(section)部分的尾部插 ...

  8. Exception loading sessions from persistent storage

    严重: Exception loading sessions from persistent storage java.io.EOFException 删除Tomcat里面的work/Catalina ...

  9. clip-path

    html代码: <div> <img src="BC0C62C1B1962A8A.jpg"> </div> css代码: img{ clip-p ...

  10. bootstrap源码分析之tab(选项卡)

    实现tab选项卡的应用,此插件相对比较简单 源码文件: tab.js 实现原理 1.单击一个元素时,首先将原来高亮的元素取消2.然后给被单击元素进行高亮3.如果单击元素是下拉框中某个选项,则选中本身, ...