存储过程在程序慢而在Management Studio快的原因

1,存储过程在程序慢而在Management Studio快,分析查询计划,发现生成了两个执行计划,说明二者用的不是同一个查询计划,因参数嗅探问题引发此种情况。
2,产生不同执行计划原因是:引起执行计划重新编译的原因之一是上下文环境发生改变,SET开关。这些开关会影响语句执行的行为,甚至带来不同的结果,而sqlserver要另生成新的编译计划。而在Management Studio中,默认打开了SET ARITHABORT ON 在查询执行过程中发生溢出或被零除错误时,终止查询,而程序中是不打开的,不同的SET开关,造成不同编译计划的生成,而不是重用。
最终设置:看存储过程用的什么set,将Manage Studio工具-选项-查询执行-高级 打开或关掉工具
3,故要重用程序所生成的执行计划,方式是:1)确定SET设置 2)在当前中设置上下文环境

--查找SET开关
方法1:
SELECT sql,setopts
FROM sys.syscacheobjects
WHERE OBJECT_NAME(objid,DB_ID()) = ‘frmUser_sel‘

方法2:
SELECT plan_handle,usecounts,pvt.set_options, pvt.sql_handle
FROM (
    SELECT plan_handle, epa.attribute, epa.value ,usecounts
    FROM sys.dm_exec_cached_plans
    CROSS APPLY sys.dm_exec_sql_text(plan_handle) qt
    OUTER APPLY sys.dm_exec_plan_attributes(plan_handle) AS epa
    WHERE cacheobjtype = ‘Compiled Plan‘
    AND  OBJECT_NAME(objectid,dbid) = ‘frmUser_sel‘ AND dbid = DB_ID()
    ) AS ecpa
PIVOT (MAX(ecpa.value) FOR ecpa.attribute IN ("set_options", "sql_handle")) AS pvt;
GO

--将获取的值传入,获取具体SET项
declare @set_options INT
SET @set_options= 251
IF ( (1 & @options) = 1 ) PRINT ‘DISABLE_DEF_CNST_CHK‘ 

IF ( (2 & @options) = 2 ) PRINT ‘IMPLICIT_TRANSACTIONS‘

IF ( (4 & @options) = 4 ) PRINT ‘CURSOR_CLOSE_ON_COMMIT‘

IF ( (8 & @options) = 8 ) PRINT ‘ANSI_WARNINGS‘

IF ( (16 & @options) = 16 ) PRINT ‘ANSI_PADDING‘

IF ( (32 & @options) = 32 ) PRINT ‘ANSI_NULLS‘

IF ( (64 & @options) = 64 ) PRINT ‘ARITHABORT‘

IF ( (128 & @options) = 128 ) PRINT ‘ARITHIGNORE‘

IF ( (256 & @options) = 256 ) PRINT ‘QUOTED_IDENTIFIER‘

IF ( (512 & @options) = 512 ) PRINT ‘NOCOUNT‘

IF ( (1024 & @options) = 1024 ) PRINT ‘ANSI_NULL_DFLT_ON‘

IF ( (2048 & @options) = 2048 ) PRINT ‘ANSI_NULL_DFLT_OFF‘

IF ( (4096 & @options) = 4096 ) PRINT ‘CONCAT_NULL_YIELDS_NULL‘

IF ( (8192 & @options) = 8192 ) PRINT ‘NUMERIC_ROUNDABORT‘

IF ( (16384 & @options) = 16384 ) PRINT ‘XACT_ABORT‘

–查看当前option select @@option 参考:Set Options

4,上述说明了相同的存储过程参数,但产生不同的执行计划的原因,但关于速度不一样呢,原因是发生了参数嗅探,解决参数嗅探方法有:1)重新编译存储过程 sp_recompile ‘sp‘ 2)在关键语句加:option(recompile) 3)指定值OPTION (OPTIMIZE FOR (@pid = 897))

时间: 2024-10-30 08:53:08

存储过程在程序慢而在Management Studio快的原因的相关文章

我也谈谈 代码调用存储过程超时,SQL Server Management Studio里运行很快的问题

最近遇到了一个问题就是 一个执行速度很快的存储过程,在代码中调用的时候却超时了. 后来看到了两篇文章: 其中一篇是这样介绍的 今天同事用代码调用存储过程时超时,在SQL Server Management Studio里运行却很快就有结果,这和我上次遇到的情况一下,现在将解决方案记录如下,谨为大家作一提醒. 解决方案就是: 把存储过程中多余的空格删掉. 瞠目吧结舌吧,不过这就是现实,现实是残酷的,现实是无情的,哈哈 不一定是哪个空格就引起了超时,试着看吧  上面的解决方案是将存储过程里的空格去掉

sql数据查询,在程序中较慢,在MS SQL2005 Management Studio中速度快,情况分析及解决

这两天遇到一个问题,在.net开发的网站,执行sql查询,从sql profiler中监控卡看,执行时间22s. 但是拷出的sql在Management Studio中直接执行,时间仅4ms. 解决方案如下,在sql语句中添加 “SET ARITHABORT ON;” 即可. 解决方案解析: SQL Server Management Studio 的默认 ARITHABORT 设置为 ON. 客户端应用程序将 ARITHABORT 设置为 OFF 可以接收不同的查询计划,使得对性能较差的查询进

教程:SQL Server Management Studio

此工具由 Microsoft Visual Studio, Management Studio 内部承载,它提供了用于数据库管理的图形工具和功能丰富的开发环境.通过 Management Studio,您可以在同一个工具中访问和管理数据库引擎.Analysis Manager 和 SQL 查询分析器,并且能够编写 Transact-SQL.MDX.XMLA 和 XML 语句.  学习内容 熟悉 Management Studio 的最好方式是进行实践演练.本教程将讲述如何管理 Managemen

使用SQL Server Management Studio 创建数据库备份作业

SQL Server 作业无非就是按照规定的时间执行指定的脚本,这里介绍如何用SSMS(SQL Sever 2008)创建作业备份数据库. (0)假设在创建作业之前你所要备份的数据库已经存在:其次,你已经会启动SQL Sever 代理(一般是关闭的) (1)创建SQL Server代理作业 (1.1)新建作业,输出常规信息 如上图:输入作业名称(如:BackupJobTest),这里所有者和类别都是默认的,输入说明(就跟写代码要写注释一样,利人利己) (1.2)设置作业执行步骤 点击左边“选择页

Management Studio 插件生成安装包要点(以ProjkyAddin为例)

通过Visual Studio向导生成Management 插件框架就不说了,网上能搜到不少资料.本篇重点是说明怎么设计一个插件安装包,适用于Management Studio 2005 到2014的版本. 先讲明这么做要面临的几个难点: 1.SSMS 2008 和 SSMS 2008 R2的安装包注册表项名称一样,但只能放一个.也就是,如果只放SSMS 2008的注册表项,SSMS 2008 R2 启动的时候会尝试读取,并报错,错误本质上是SSMS 2008 R2程序集和SSMS 2008 不

安装 SQLManagementStudio_x86_CHS(SQL Server Management Studio) 老提示重启的解决办法

安装 SQL Server Management Studio(SQLManagementStudio_x86_CHS)时,检测时不通过,提示重启电脑,我以为她安装了什么心软件没有重启:所以重启了电脑,结果问题依旧. 原因:原来是以为注册表里有个字段有值,而安装程序会判断,如果不为空就会提示重启. 第一步:开始>运行 输入:regedit 打开注册表 第二步:进入HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager

SQL Server 2005 安装后,没有Management Studio管理工具的解决办法

如果您在安装SQL Server 2005之前安装了Visual Studio .NET 2005或2008,并且在安装VS时选择了SQL Server 2005 Express,那么很不幸,SQL Server 2005安装后,您将找不到Management Studio管理工具. 要解决这个问题,可以有以下几种方法: 先安装SQL Server 2005,后安装VS. 将系统中所有与SQL Server相关的程序卸载干净,然后安装SQL Server 2005. 在安装VS的时候,不要选择S

SQL Server Management Studio 2008版本的安装

在安装vs 2010后,自动安装了ms sqlServer  2008.ms sqlServer  2008比ms sqlServer  2005改进不少,使用更方便.但是发现SQL Server Management Studio 2005版本不能打开ms sqlServer  2008库,于是决定从网上下载和安装SQL Server Management Studio 2008. 1.从网上下载SQL Server Management Studio 2008. 下载网址如下:http://

Sql Server 2008 Management studio安装教程

转载自:刘帅的专栏 http://blog.csdn.net/liushuaikobe/article/details/7348238 以下介绍Visual Studio 2010已安装后,sql server 2008 management studio的安装教程 (Mac和Linux用户请无视本文,本文是在Windows7旗舰版下测试通过) 最近学校学习.net,要用到sql server.一般来说,管理数据库一种是像mySQL一样,在命令行那个黑乎乎的窗口下敲命令管理(但是我没有找到如何在