理解性能的奥秘——应用程序中慢,SSMS中快(3)——不总是参数嗅探的错
本文属于《理解性能的奥秘——应用程序中慢,SSMS中快》系列
接上文:理解性能的奥秘——应用程序中慢,SSMS中快(2)——SQL Server如何编译存储过程
在我们开始深入研究如何处理参数嗅探相关的性能问题之前,由于这个课题过于广泛,所以首先先介绍一些跟参数嗅探没有直接关系的内容,但是又会导致语句在SSMS和应用程序中存在性能差异的情况。
替换变量和参数:
前面已经接触过,但是在这里对其进行扩展。有时会看到论坛上有人说,某个存储过程很慢,但是把相同的语句提取出来单独执行就很快。真相就是:语句涉及了变量,可能是本地变量或者参数。为了单独检查语句问题,他们把变量替换成常量。但是前面提到过,单独的语句和在存储过程中很不一样,当用常量替换变量时,SQL Server可以更加准确地预估影响行数,从而生成更好的查询计划。并且SQL Server不用考虑下一次运行是,常量会被改变。
另外一个类似的错误就是把参数放入变量中,如:
CREATE PROCEDURE some_sp @par1 int
AS ... -- 某些使用到变量 @par1的语句
DECLARE @par1 int SELECT @par1 = 4711 -- 接下来的语句
EXEC sp_executesql N'-- 牵涉到参数的语句 @par1', N'@par1 int', 4711
还有一种方式就是创建一个带有问题语句的虚拟存储过程,为了避免数据库中存在垃圾对象,你可以使用临时存储过程:
CREATE PROCEDURE #test @par1 int AS -- 问题语句.
阻塞:
索引视图和索引化的计算列:
在SQL 2000时代,这个问题比后续版本严重很多,从SQL Server 2005开始,所以视图和索引化后的计算列(包括SQL 2008加入的过滤索引filter index)在语句编译期间,下面的设置必须为ON:QUOTED_IDENTIFIER, ANSI_NULLS, ANSI_WARNINGS, ANSI_PADDING, CONCAT_NULL_YIELDS_NUL,而NUMERIC_ROUNDABORT必须为OFF。
而在SQL 2000中,应用程序使用默认SET选项对索引化的计算列和索引视图是没有什么好处的。但是即使存在参数嗅探,当你在SSMS或查询分析器中运行是,性能也往往可能好很多,因为ARITHABORT默认为ON。
但是由于SQL 2000时代过去太久了,估计已经很少人还在用,所以如果对这个内容有兴趣,读者可以去看原文,因为这部分主要是对SQL 2000描述的。点击打开链接
链接服务器的问题:
SELECT C.* FROM SOME_SERVER.Northwind.dbo.Orders O JOIN Customers C ON O.CustomerID = C.CustomerID WHERE O.OrderID > 20000
以普通用户运行是,得到的执行计划如下:
当查询直接访问本地实例的表时,优化器可以得到语句相关的所有表的统计信息,不存在额外的权限检查。 当SQL Server访问一个链接服务器时,服务器之间的通讯并没有使用专用的的协议,而是使用标准的OLE DB接口访问链接服务器,其他诸如sql server实例、oracle、文本文件或任何自定义数据源也是如此。具体如何获取统计信息还要取决于数据源和请求的OLE DB Provider。 在这种情况下,SQL Server Native Client会通过两步获得统计信息(可以在远程服务器上使用Profiler检查):
- SQL Server Native Client驱动会先运行sp_table_statistics2_rowset返回统计信息包含的列的信息,也包括了基数信息和密度信息。
- 驱动运行DBCC SHOW_STATISTICS,返回完整的分布统计信息。
- 可以把用户加到远程数据库的db_ddladmin角色中,但是这个意味着用户可以增加和删除表,一般不建议。
- 默认情况下,一个用户连接远程服务器的时候,都是使用远程服务器中相同的账号,但是可以使用sp_addlinkedsrvlogin映射 一个登录号,以便用户有权限执行属于db_ddladminde 角色的事情。但是这个账号必须是SQL 登录账号,所以要确保远程服务器是否启用了混合身份验证,但是这种方案从安全角度来说还是有问题。
- 某些情况下可以改写成OPENQUERY强制在远程服务器中进行预估。如果查询包含了多个远程表的情况下,这种方式特别有效。(但是也有风险,因为优化器可能只能从远程服务器中获取更少的统计信息。)
- 也可以使用完整的提示和计划向导来实现你期望的查询计划。
- 最后,要考虑一下是否真的有必要使用链接服务器而不能放在同一个 服务器上?能否修改?或者有其他解决方案?
小结:
- 收集解决参数嗅探问题的信息
理解性能的奥秘——应用程序中慢,SSMS中快(3)——不总是参数嗅探的错的更多相关文章
- 理解性能的奥秘——应用程序中慢,SSMS中快(6)——SQL Server如何编译动态SQL
本文属于<理解性能的奥秘--应用程序中慢,SSMS中快>系列 接上文:理解性能的奥秘--应用程序中慢,SSMS中快(5)--案例:如何应对参数嗅探 我们抛开参数嗅探的话题,回到了本系列的最 ...
- 理解性能的奥秘——应用程序中慢,SSMS中快(5)——案例:如何应对参数嗅探
本文属于<理解性能的奥秘--应用程序中慢,SSMS中快>系列 接上文:理解性能的奥秘--应用程序中慢,SSMS中快(4)--收集解决参数嗅探问题的信息 首先我们需要明白,参数嗅探本身不是问 ...
- 理解性能的奥秘——应用程序中慢,SSMS中快(4)——收集解决参数嗅探问题的信息
本文属于<理解性能的奥秘--应用程序中慢,SSMS中快>系列 接上文:理解性能的奥秘--应用程序中慢,SSMS中快(3)--不总是参数嗅探的错 前面已经提到过关于存储过程在SSMS中运行很 ...
- 理解性能的奥秘——应用程序中慢,SSMS中快(2)——SQL Server如何编译存储过程
本文属于<理解性能的奥秘--应用程序中慢,SSMS中快>系列 接上文:理解性能的奥秘--应用程序中慢,SSMS中快(1)--简介 本文介绍SQL Server如何编译存储过程并使用计划缓存 ...
- 理解性能的奥秘——应用程序中慢,SSMS中快(1)——简介
本文属于<理解性能的奥秘--应用程序中慢,SSMS中快>系列 在工作中发现有不少类似的现象,有幸看到国外大牛写的一篇文章,由于已经完善得不能再添油加醋,所以决定直接翻译,原文出处:http ...
- 理解性能的奥秘——应用程序中慢,SSMS中快(4)收集解决参数嗅探问题的信息
---从计划缓存中直接获取查询计划和参数: ), ) SELECT @dbname = 'hydee_连锁', @procname = 'dbo.p_select_ware'; WITH baseda ...
- [转]提高 Linux 上 socket 性能,加速网络应用程序的 4 种方法
原文链接:http://www.ibm.com/developerworks/cn/linux/l-hisock.html 使用 Sockets API,我们可以开发客户机和服务器应用程序,它们可以在 ...
- 1 开发一个注重性能的JDBC应用程序不是一件容易的事. 当你的代码运行很慢的时候JDBC驱动程序并不会抛出异常告诉你。 本系列的性能提示将为改善JDBC应用程序的性能介绍一些基本的指导原则,这其中的原则已经被许多现有的JDBC应用程序编译运行并验证过。 这些指导原则包括: 正确的使用数据库MetaData方法 只获取需要的数据 选用最佳性能的功能 管理连
1 开发一个注重性能的JDBC应用程序不是一件容易的事. 当你的代码运行很慢的时候JDBC驱动程序并不会抛出异常告诉你. 本系列的性能提示将为改善JDBC应用程序的性能介绍一些基本的指导原则,这其中的 ...
- 【SQL server初级】数据库性能优化三:程序操作优化
数据库优化包含以下三部分,数据库自身的优化,数据库表优化,程序操作优化.此文为第三部分 数据库性能优化三:程序操作优化 概述:程序访问优化也可以认为是访问SQL语句的优化,一个好的SQL语句是可以减少 ...
随机推荐
- java中抽象类和接口之间的异同点
抽象类 接口 声明方式 abstratc class ClassName interface ClassName 包含内容 构造方法,普通方法,抽象方法.static方法 .变量常量 全局常量.抽 ...
- mysql 免安装与 忘记root密码 密码过期
免安装: 参考 :https://blog.csdn.net/werwqerwerwer/article/details/52919939 注:别忘了配置环境变量 忘记root密码解决办法: 1. ...
- 《linux 网络日志分析与流量监控》记录
mac中有个本机连接vpn的日志,/private/var/log/ppp.log 消除日志(echo "" >/private/var/log/ppp.log ) li ...
- Log4j1.2配置详解
Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志的输出到控制台,或者文件等等. 同时,在各大框架中也主要是使用log4j来进行日志的输出. 下面是log4j1.x版本的详细 ...
- [HNOI2008]越狱
题目描述 监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种.如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱 输入输出格式 输入 ...
- Go学习——go+channel实战(转)
转载:http://studygolang.com/articles/2423 背景 在最近开发的项目中,后端需要编写许多提供HTTP接口的API,另外技术选型相对宽松,因此选择Golang + Be ...
- 【BZOJ2186】【SDOI2008】沙拉公主的困惑
Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞票.房地产第一大户沙拉公主决定预测一下大富翁 ...
- hdu 5880 AC自动机
Family View Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
- hdu5634 BestCoder Round #73 (div.1)
Rikka with Phi Accepts: 5 Submissions: 66 Time Limit: 16000/8000 MS (Java/Others) Memory Limit: ...
- day5 liaoxuefeng---访问数据库、web开发、异步IO
一.访问数据库 二.web开发 三.异步IO