本文属于《理解性能的奥秘——应用程序中慢,SSMS中快》系列

在工作中发现有不少类似的现象,有幸看到国外大牛写的一篇文章,由于已经完善得不能再添油加醋,所以决定直接翻译,原文出处:http://www.sommarskog.se/query-plan-mysteries.html#defaultsettings  本人水平有限,如果读者觉得自己英语过得去,建议阅读原文。在翻译过程中,不排除会对某些部分进行修改,但不会影响最终效果。

由于内容较多,所以把文章拆为多篇发布,本系列文章结构:

简介:


我逛了很多论坛之后,发现有一个常见的问题:提问者已经定位一个应用程序中的低效查询或存储过程,然后把它放到SSMS(SQL Server Management Studio)中执行和分析时,却发现瞬间执行完毕。他们为此觉得SQL Server很神奇,百思不得其解。同时,开发人员也可能遇到这种情况,存储过程中的某个语句抓出来单独运行时,可能比在存储过程中慢/快很多。
当然,把这个现象当作奇怪现象甚至BUG是不合理的。但是如果你不清楚SQL Server是如何编译查询和维护其执行计划缓存的话,看起来确实很难解释。而且一些不同环境中的不同配置也会触发这种奇怪的现象。所以在本文中,我(作者)尽量整理和解释这种看上去很难解释的行为。文中会介绍SQL Server如何编译一个存储过程、什么是参数嗅探并且说明为什么它会导致这种让人迷惑的现象。另外我也会解释SQL Server如何使用缓存、为什么缓存中的一个存储过程会有很多词目(entries)。在了解了这些之后,你就明白会什么在SSMS中执行起来比应用程序中快得多。
另外为了理解如何定位应用程序中的性能问题,也有必要继续看下去。但是先不马上进入参数嗅探的话题,先介绍一些其他影响性能的情景。 然后接下来的两节会介绍关于参数嗅探导致的性能问题。第一部分是手机信息。第二部分是在现实情况和通用情况下的一些可能出现的问题。在最后一部分,讨论SQL Server如何编译动态SQL和如何域计划缓存交互。最后是一些相关方面的微软白皮书资料。

假定:

本质上,这系列文章适用于所有版本的SQL Server,但是由于从SQL 2005之后SQL Server有了重大改进,所以这里关注于SQL 2005及以后版本。本系列包含一些检索计划缓存的语句,这些语句仅在SQL 2005及后续版本可用,同时需要服务器级别的VIEW SERVER STATE权限。

本系列不是入门级课题,读者应该有一定的SQL 编程 经验。你不需要精通性能优化,但是有则更好。因为有些内容没办法在这里做深入介绍,毕竟本系列不是教科书。不是介绍如何优化所有性能问题,但是最起码可以作为一个开端。

警告:本系列部分地方会使用在线联机丛书链接,可能会出现部分版本不符合的情况,尽可能选择自己使用的版本的内容阅读。

下一文:SQL Server如何编译存储过程

理解性能的奥秘——应用程序中慢,SSMS中快(1)——简介的更多相关文章

  1. 理解性能的奥秘——应用程序中慢,SSMS中快(6)——SQL Server如何编译动态SQL

    本文属于<理解性能的奥秘--应用程序中慢,SSMS中快>系列 接上文:理解性能的奥秘--应用程序中慢,SSMS中快(5)--案例:如何应对参数嗅探 我们抛开参数嗅探的话题,回到了本系列的最 ...

  2. 理解性能的奥秘——应用程序中慢,SSMS中快(5)——案例:如何应对参数嗅探

    本文属于<理解性能的奥秘--应用程序中慢,SSMS中快>系列 接上文:理解性能的奥秘--应用程序中慢,SSMS中快(4)--收集解决参数嗅探问题的信息 首先我们需要明白,参数嗅探本身不是问 ...

  3. 理解性能的奥秘——应用程序中慢,SSMS中快(4)——收集解决参数嗅探问题的信息

    本文属于<理解性能的奥秘--应用程序中慢,SSMS中快>系列 接上文:理解性能的奥秘--应用程序中慢,SSMS中快(3)--不总是参数嗅探的错 前面已经提到过关于存储过程在SSMS中运行很 ...

  4. 理解性能的奥秘——应用程序中慢,SSMS中快(3)——不总是参数嗅探的错

    本文属于<理解性能的奥秘--应用程序中慢,SSMS中快>系列 接上文:理解性能的奥秘--应用程序中慢,SSMS中快(2)--SQL Server如何编译存储过程 在我们开始深入研究如何处理 ...

  5. 理解性能的奥秘——应用程序中慢,SSMS中快(2)——SQL Server如何编译存储过程

    本文属于<理解性能的奥秘--应用程序中慢,SSMS中快>系列 接上文:理解性能的奥秘--应用程序中慢,SSMS中快(1)--简介 本文介绍SQL Server如何编译存储过程并使用计划缓存 ...

  6. 理解性能的奥秘——应用程序中慢,SSMS中快(4)收集解决参数嗅探问题的信息

    ---从计划缓存中直接获取查询计划和参数: ), ) SELECT @dbname = 'hydee_连锁', @procname = 'dbo.p_select_ware'; WITH baseda ...

  7. [转]提高 Linux 上 socket 性能,加速网络应用程序的 4 种方法

    原文链接:http://www.ibm.com/developerworks/cn/linux/l-hisock.html 使用 Sockets API,我们可以开发客户机和服务器应用程序,它们可以在 ...

  8. 1   开发一个注重性能的JDBC应用程序不是一件容易的事. 当你的代码运行很慢的时候JDBC驱动程序并不会抛出异常告诉你。   本系列的性能提示将为改善JDBC应用程序的性能介绍一些基本的指导原则,这其中的原则已经被许多现有的JDBC应用程序编译运行并验证过。 这些指导原则包括:    正确的使用数据库MetaData方法    只获取需要的数据    选用最佳性能的功能    管理连

    1 开发一个注重性能的JDBC应用程序不是一件容易的事. 当你的代码运行很慢的时候JDBC驱动程序并不会抛出异常告诉你. 本系列的性能提示将为改善JDBC应用程序的性能介绍一些基本的指导原则,这其中的 ...

  9. 【SQL server初级】数据库性能优化三:程序操作优化

    数据库优化包含以下三部分,数据库自身的优化,数据库表优化,程序操作优化.此文为第三部分 数据库性能优化三:程序操作优化 概述:程序访问优化也可以认为是访问SQL语句的优化,一个好的SQL语句是可以减少 ...

随机推荐

  1. [LeetCode] Max Area of Island 岛的最大面积

    Given a non-empty 2D array grid of 0's and 1's, an island is a group of 1's (representing land) conn ...

  2. Angular1.x使用小结

    之前工作以Angular1.x为主,主要做业务系统,以后工作中技术栈可能以vue为主,在此对Angular1.x的使用做一个简单总结,这里使用1.5+版本. 基本概念 1.依赖注入 依赖注入,在ang ...

  3. Unity3D UGUI 自动调节大小

    可添加以下组件 组件包含的两个枚举参数,可以自行设定适应方式. 例如一个Text UI元素,当文字过多的时候他不会自动增加高度而导致文字不能完全显示,这时候就可以挂载这个组件,如上图设置参数,就可以自 ...

  4. java开发----自定义对象,重写equals方法

    javaweb开发中,用到了好多自定义对象,这时候如果不重写equals方法,很多时候都会返回false, 因此我们必须习惯重写这个方法. 重点: 1.equals比较俩对象时比较的是对象引用是否指向 ...

  5. [SDOI 2013]森林

    Description 题库链接 给你 \(n\) 个节点,初始 \(m\) 条边, \(t\) 组操作.让你支持: 询问树上路径点权 \(K\) 小: 支持加边操作. 强制在线,所有状态保证是一个树 ...

  6. bzoj 4830: [Hnoi2017]抛硬币

    Description 小A和小B是一对好朋友,他们经常一起愉快的玩耍.最近小B沉迷于**师手游,天天刷本,根本无心搞学习.但是 已经入坑了几个月,却一次都没有抽到SSR,让他非常怀疑人生.勤勉的小A ...

  7. [NOIp 2014]联合权值

    Description 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距离定义为u 点到v ...

  8. hdu 5478 (数论)

    ⋅n+b1⋅n−k2+1 = 0 (mod C)(n = 1, 2, 3, ...)  (1<=a, b <C) 1.  当n = 1时, a^(k1+b1) + b = 0 ( mod ...

  9. H3C S3100交换机配置VLAN和远程管理

    一.基本设置 1. console线连接成功 2. 进入系统模式 <H3C>system-view //提示符由<H3C> 变为 [H3C] 3. 更改设备名称 [H3C]sy ...

  10. ThreadLocal基本原理及运用

    ThreadLocal提供本地线程变量.这个变量里面的值(通过get方法获取)是和其他线程分割开来的,变量的值只有当前线程能访问到,不像一般的类型比如Person,Student类型的变量,只要访问到 ...