理解性能的奥秘——应用程序中慢,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语句是可以减少 ...
随机推荐
- 查看 Secret - 每天5分钟玩转 Docker 容器技术(156)
可以通过 kubectl get secret 查看存在的 secret. 显示有两个数据条目,kubectl describe secret 查看条目的 Key: 如果还想查看 Value,可以用 ...
- Struts2--struts.xml详解
通常,struts.xml文件都会继承一个struts-default.xml文件通过一些基本的拦截器来提供一些基本的配置设置之类的. 配置例: <?xml version="1.0& ...
- [Codeforces 946F]Fibonacci String Subsequences
Description 题库链接 定义 \(F(x)\) 为 \(F(x-1)\) 与 \(F(x-2)\) 的连接(其中 \(F(0) = "0",F(1) = "1& ...
- [HNOI2007]最小矩形覆盖
题目描述 给定一些点的坐标,要求求能够覆盖所有点的最小面积的矩形,输出所求矩形的面积和四个顶点坐标 输入输出格式 输入格式: 第一行为一个整数n(3<=n<=50000),从第2至第n+1 ...
- [UOJ UNR #2]积劳成疾
来自FallDream的博客,未经允许,请勿转载,谢谢. 传送门 区间最大值的题emmmm 想到构建笛卡尔树,这样自然就想到了一种dp f[i][j]表示大小为i的笛卡尔树,根的权值是j的答案. 转移 ...
- 习题9-8 Uva1632
题意: 给你n个宝藏,然后给出他们的位置a[i]以及存在时间tim[i],如果能全部拿完,求出最短时间: 否则输出No solution 思路: 对于一段区间[i,j],你取完之后肯定是在最左端或者最 ...
- [BZOJ]3671 随机数生成器(Noi2014)
洛谷上卡不过去的朋友们可以来看看小C的程序(小C才不是标题党呢!) Description Input 第1行包含5个整数,依次为 x_0,a,b,c,d ,描述小H采用的随机数生成算法所需的随机种子 ...
- python中模块,包,库的概念
模块:就是.py文件,里面定义了一些函数和变量,需要的时候就可以导入这些模块. 包:在模块之上的概念,为了方便管理而将文件进行打包.包目录下第一个文件便是 __init__.py,然后是一些模块文件和 ...
- Linux文件系统的介绍
1.Linux的文件系统是一个典型的树形结构,只有一个根节点 如下图: 2.在Linux中一切皆文件 Linux 对数据文件(.mp3..bmp),程序文件(.c..h.*.o),设备文件(LCD.触 ...
- SpringBoot中跨域问题
项目中经常会遇到浏览器跨域的问题,解决方式在启动类中配置 @Bean public FilterRegistrationBean corsFilter() { UrlBasedCorsConfigur ...