本文属于《理解性能的奥秘——应用程序中慢,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. Linux之centos系统常用命令总结

    1.查看系统版本 cat /etc/redhat-release 文件与目录操作 命令 解析 cd /home 进入 '/home' 目录 cd .. 返回上一级目录 cd ../.. 返回上两级目录 ...

  2. 【django之Ajax】

    一.Ajax的简介 1.定义 AJAX(Asynchronous Javascript And XML)翻译成中文就是"异步Javascript和XML",是一种创建交互式网页应用 ...

  3. 关于 Rijndael 加密

    MSDN https://msdn.microsoft.com/zh-cn/library/system.security.cryptography.rijndaelmanaged(v=vs.110) ...

  4. 浅谈轮播图(原生JavaScript实现)

    现在各种轮播图插件,玲琅满目,用起来也非常方便,通常只需要选择元素然后传入参数就可以了.但是,和授人以鱼不如授人以渔一样的道理,不管怎样最基本的轮播图原理还是应当掌握的.这样不仅有利于我们自己写出来满 ...

  5. [SDOI 2009]HH的项链

    Description HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝 壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH不断地收集新的贝壳,因此,他的项链变得 ...

  6. codeforces 868A Bark to Unlock

    As technologies develop, manufacturers are making the process of unlocking a phone as user-friendly ...

  7. 2015 多校联赛 ——HDU5386(暴力)

    Sample Input 1 3 5 2 2 1 2 3 3 2 1 3 3 3 3 3 3 3 3 3 3 H 2 3 L 2 2 H 3 3 H 1 3 L 2 3   Sample Output ...

  8. bzoj4830 hnoi2017 抛硬币

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

  9. hdu2795 线段树 贴广告

    Billboard Time Limit: 20000/8000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  10. Python中模块之os的功能介绍

    Python中模块之os的功能介绍 1. os的变量 path 模块路径 方法:os.path 返回值:module 例如:print(os.path) >>> <module ...