这个问题困扰我好长时间了,使用SQLSERVER 事务探查器找到执行超时的SQL语句,参数查询都是通过执行exe sp_executesql 的存储过程调用,因为它能够分析并缓存查询计划,从而优化查询效率,但是现在反而很慢。本地调试没有问题,开始上线也没有问题,但是运行一个月左右有时候会出现超时现象:
Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.

                var param = new DynamicParameters();
param.Add("@StDateNum", Convert.ToInt32(dStartDate.ToString("yyyyMMdd")), dbType: DbType.Int32);
param.Add("@EndDateNum", Convert.ToInt32(dEndDate.ToString("yyyyMMdd")), dbType: DbType.Int32);
param.Add("@StDate", dStartDate, dbType: DbType.DateTime);
param.Add("@EdDate", dEndDate, dbType: DbType.DateTime);
param.Add("@HotelCd", sHotelCd, dbType: DbType.AnsiString, size: sHotelCd.Length);
return new SqlConnection(DBSetting.PriceAndRmFlow).Query<PriceAndRmFlow>(cmdText, param).ToList();

临时解决办法

1.就是把代码DbType重新指定不同类型,重新部署就好了,但根本原因还是没有找到。网上也看了好多文章,说是是参数类型不正确,必须设定为数据库一致的参数类型。另外Size也有影响,使用参数化后,因为字段类型错误导致了表扫描。已做修改,还在观察中。

2.看了几篇文章,初步分析是因为执行计划的问题,后面在SQL后面强制禁用了重用执行计划( OPTION (RECOMPILE)),本来想分析了SQL的执行计划,但是之前同样慢的SQL,查询起来又很快了。

3.可能是缓存不好的缓存计划,可以执行 DBCC FREEPROCCACHE 清除。

4.在这篇文章 http://stackoverflow.com/questions/10933366/sp-executesql-is-slow-with-parameters 中并且也用的是Dapper,解决方式是加了 WITH RECOMPILE 语句

parameter-sniffing

SQL Server Management Studio 的默认 ARITHABORT 设置为 ON。 客户端应用程序将 ARITHABORT 设置为 OFF 可以接收不同的查询计划,使得对性能较差的查询进行故障排除变得困难。 即,同一个查询可以在 Management Studio 中快速执行,但在应用程序中却比较慢。 使用 Management Studio 排除查询故障时始终与客户端 ARITHABORT 设置匹配。

查询执行计划

select * from sys.dm_exec_cached_plans
cross apply sys.dm_exec_sql_text(plan_handle) t ORDER BY sys.dm_exec_cached_plans.usecounts DESC

System.Data.DbType映射关系

AnsiString:VarChar
Binary:VarBinary
Byte:TinyInt
Boolean:Bit
Currency:Money
Date:DateTime
DateTime:DateTime
Decimal:Decimal
Double:Float
Guid:UniqueIdentifier
Int16:SmallInt
Int32:Int
Int64:BigInt
Object:Variant
Single:Real
String:NVarChar
Time:DateTime
AnsiStringFixedLength:Char
StringFixedLength:NChar
Xml:Xml
DateTime2:DateTime2
DateTimeOffset:DateTimeOffset
=========== System.Data.SqlClient.SqlDbType =========

System

.Data.SqlClient.SqlDbType.BigInt(0) = System.Data.DbType.Int64(12)

System

.Data.SqlClient.SqlDbType.Binary(1) = System.Data.DbType.Binary(1)

System

.Data.SqlClient.SqlDbType.Bit(2) = System.Data.DbType.Boolean(3)

System

.Data.SqlClient.SqlDbType.Char(3) = System.Data.DbType.AnsiStringFixedLength(22)

System

.Data.SqlClient.SqlDbType.DateTime(4) = System.Data.DbType.DateTime(6)

System

.Data.SqlClient.SqlDbType.Decimal(5) = System.Data.DbType.Decimal(7)

System

.Data.SqlClient.SqlDbType.Float(6) = System.Data.DbType.Double(8)

System

.Data.SqlClient.SqlDbType.Image(7) = System.Data.DbType.Binary(1)

System

.Data.SqlClient.SqlDbType.Int(8) = System.Data.DbType.Int32(11)

System

.Data.SqlClient.SqlDbType.Money(9) = System.Data.DbType.Currency(4)

System

.Data.SqlClient.SqlDbType.NChar(10) = System.Data.DbType.StringFixedLength(23)

System

.Data.SqlClient.SqlDbType.NText(11) = System.Data.DbType.String(16)

System

.Data.SqlClient.SqlDbType.NVarChar(12) = System.Data.DbType.String(16)

System

.Data.SqlClient.SqlDbType.Real(13) = System.Data.DbType.Single(15)

System

.Data.SqlClient.SqlDbType.UniqueIdentifier(14) = System.Data.DbType.Guid(9)

System

.Data.SqlClient.SqlDbType.SmallDateTime(15) = System.Data.DbType.DateTime(6)

System

.Data.SqlClient.SqlDbType.SmallInt(16) = System.Data.DbType.Int16(10)

System

.Data.SqlClient.SqlDbType.SmallMoney(17) = System.Data.DbType.Currency(4)

System

.Data.SqlClient.SqlDbType.Text(18) = System.Data.DbType.AnsiString(0)

System

.Data.SqlClient.SqlDbType.Timestamp(19) = System.Data.DbType.Binary(1)

System

.Data.SqlClient.SqlDbType.TinyInt(20) = System.Data.DbType.Byte(2)

System

.Data.SqlClient.SqlDbType.VarBinary(21) = System.Data.DbType.Binary(1)

System

.Data.SqlClient.SqlDbType.VarChar(22) = System.Data.DbType.AnsiString(0)

System

.Data.SqlClient.SqlDbType.Variant(23) = System.Data.DbType.Object(13)

System

.Data.SqlClient.SqlDbType.Xml(25) = System.Data.DbType.Xml(25)

System

.Data.SqlClient.SqlDbType.Udt(29) = System.Data.DbType.Object(13)

System

.Data.SqlClient.SqlDbType.Structured(30) = System.Data.DbType.Object(13)

System

.Data.SqlClient.SqlDbType.Date(31) = System.Data.DbType.Date(5)

System

.Data.SqlClient.SqlDbType.Time(32) = System.Data.DbType.Time(17)

System

.Data.SqlClient.SqlDbType.DateTime2(33) = System.Data.DbType.DateTime2(26)

System

.Data.SqlClient.SqlDbType.DateTimeOffset(34) = System.Data.DbType.DateTimeOffset(27) ===========System.Data.OleDb.OleDbType=========

System

.Data.OleDb.OleDbType.Empty(0) = System.Data.DbType.Object(13)

System

.Data.OleDb.OleDbType.SmallInt(2) = System.Data.DbType.Int16(10)

System

.Data.OleDb.OleDbType.Integer(3) = System.Data.DbType.Int32(11)

System

.Data.OleDb.OleDbType.Single(4) = System.Data.DbType.Single(15)

System

.Data.OleDb.OleDbType.Double(5) = System.Data.DbType.Double(8)

System

.Data.OleDb.OleDbType.Currency(6) = System.Data.DbType.Currency(4)

System

.Data.OleDb.OleDbType.Date(7) = System.Data.DbType.DateTime(6)

System

.Data.OleDb.OleDbType.BSTR(8) = System.Data.DbType.String(16)

System

.Data.OleDb.OleDbType.IDispatch(9) = System.Data.DbType.Object(13)

System

.Data.OleDb.OleDbType.Error(10) = System.Data.DbType.Int32(11)

System

.Data.OleDb.OleDbType.Boolean(11) = System.Data.DbType.Boolean(3)

System

.Data.OleDb.OleDbType.Variant(12) = System.Data.DbType.Object(13)

System

.Data.OleDb.OleDbType.IUnknown(13) = System.Data.DbType.Object(13)

System

.Data.OleDb.OleDbType.Decimal(14) = System.Data.DbType.Decimal(7)

System

.Data.OleDb.OleDbType.TinyInt(16) = System.Data.DbType.SByte(14)

System

.Data.OleDb.OleDbType.UnsignedTinyInt(17) = System.Data.DbType.Byte(2)

System

.Data.OleDb.OleDbType.UnsignedSmallInt(18) = System.Data.DbType.UInt16(18)

System

.Data.OleDb.OleDbType.UnsignedInt(19) = System.Data.DbType.UInt32(19)

System

.Data.OleDb.OleDbType.BigInt(20) = System.Data.DbType.Int64(12)

System

.Data.OleDb.OleDbType.UnsignedBigInt(21) = System.Data.DbType.UInt64(20)

System

.Data.OleDb.OleDbType.Filetime(64) = System.Data.DbType.DateTime(6)

System

.Data.OleDb.OleDbType.Guid(72) = System.Data.DbType.Guid(9)

System

.Data.OleDb.OleDbType.Binary(128) = System.Data.DbType.Binary(1)

System

.Data.OleDb.OleDbType.Char(129) = System.Data.DbType.AnsiStringFixedLength(22)

System

.Data.OleDb.OleDbType.WChar(130) = System.Data.DbType.StringFixedLength(23)

System

.Data.OleDb.OleDbType.Numeric(131) = System.Data.DbType.Decimal(7)

System

.Data.OleDb.OleDbType.DBDate(133) = System.Data.DbType.Date(5)

System

.Data.OleDb.OleDbType.DBTime(134) = System.Data.DbType.Time(17)

System

.Data.OleDb.OleDbType.DBTimeStamp(135) = System.Data.DbType.DateTime(6)

System

.Data.OleDb.OleDbType.PropVariant(138) = System.Data.DbType.Object(13)

System

.Data.OleDb.OleDbType.VarNumeric(139) = System.Data.DbType.VarNumeric(21)

System

.Data.OleDb.OleDbType.VarChar(200) = System.Data.DbType.AnsiString(0)

System

.Data.OleDb.OleDbType.LongVarChar(201) = System.Data.DbType.AnsiString(0)

System

.Data.OleDb.OleDbType.VarWChar(202) = System.Data.DbType.String(16)

System

.Data.OleDb.OleDbType.LongVarWChar(203) = System.Data.DbType.String(16)

System

.Data.OleDb.OleDbType.VarBinary(204) = System.Data.DbType.Binary(1)

System

.Data.OleDb.OleDbType.LongVarBinary(205) = System.Data.DbType.Binary(1) =========System.Data.Odbc.OdbcType===========

System

.Data.Odbc.OdbcType.BigInt(1) = System.Data.DbType.Int64(12)

System

.Data.Odbc.OdbcType.Binary(2) = System.Data.DbType.Binary(1)

System

.Data.Odbc.OdbcType.Bit(3) = System.Data.DbType.Boolean(3)

System

.Data.Odbc.OdbcType.Char(4) = System.Data.DbType.AnsiStringFixedLength(22)

System

.Data.Odbc.OdbcType.DateTime(5) = System.Data.DbType.DateTime(6)

System

.Data.Odbc.OdbcType.Decimal(6) = System.Data.DbType.Decimal(7)

System

.Data.Odbc.OdbcType.Numeric(7) = System.Data.DbType.Decimal(7)

System

.Data.Odbc.OdbcType.Double(8) = System.Data.DbType.Double(8)

System

.Data.Odbc.OdbcType.Image(9) = System.Data.DbType.Binary(1)

System

.Data.Odbc.OdbcType.Int(10) = System.Data.DbType.Int32(11)

System

.Data.Odbc.OdbcType.NChar(11) = System.Data.DbType.StringFixedLength(23)

System

.Data.Odbc.OdbcType.NText(12) = System.Data.DbType.String(16)

System

.Data.Odbc.OdbcType.NVarChar(13) = System.Data.DbType.String(16)

System

.Data.Odbc.OdbcType.Real(14) = System.Data.DbType.Single(15)

System

.Data.Odbc.OdbcType.UniqueIdentifier(15) = System.Data.DbType.Guid(9)

System

.Data.Odbc.OdbcType.SmallDateTime(16) = System.Data.DbType.DateTime(6)

System

.Data.Odbc.OdbcType.SmallInt(17) = System.Data.DbType.Int16(10)

System

.Data.Odbc.OdbcType.Text(18) = System.Data.DbType.AnsiString(0)

System

.Data.Odbc.OdbcType.Timestamp(19) = System.Data.DbType.Binary(1)

System

.Data.Odbc.OdbcType.TinyInt(20) = System.Data.DbType.Byte(2)

System

.Data.Odbc.OdbcType.VarBinary(21) = System.Data.DbType.Binary(1)

System

.Data.Odbc.OdbcType.VarChar(22) = System.Data.DbType.AnsiString(0)

System

.Data.Odbc.OdbcType.Date(23) = System.Data.DbType.Date(5)

System

.Data.Odbc.OdbcType.Time(24) = System.Data.DbType.Time(17) =========System.Data.OracleClient.OracleType===========

System

.Data.OracleClient.OracleType.BFile(1) = System.Data.DbType.Binary(1)

System

.Data.OracleClient.OracleType.Blob(2) = System.Data.DbType.Binary(1)

System

.Data.OracleClient.OracleType.Char(3) = System.Data.DbType.AnsiStringFixedLength(22)

System

.Data.OracleClient.OracleType.Clob(4) = System.Data.DbType.AnsiString(0)

System

.Data.OracleClient.OracleType.Cursor(5) = System.Data.DbType.Object(13)

System

.Data.OracleClient.OracleType.DateTime(6) = System.Data.DbType.DateTime(6)

System

.Data.OracleClient.OracleType.IntervalDayToSecond(7) = System.Data.DbType.Object(13)

System

.Data.OracleClient.OracleType.IntervalYearToMonth(8) = System.Data.DbType.Int32(11)

System

.Data.OracleClient.OracleType.LongRaw(9) = System.Data.DbType.Binary(1)

System

.Data.OracleClient.OracleType.LongVarChar(10) = System.Data.DbType.AnsiString(0)

System

.Data.OracleClient.OracleType.NChar(11) = System.Data.DbType.StringFixedLength(23)

System

.Data.OracleClient.OracleType.NClob(12) = System.Data.DbType.String(16)

System

.Data.OracleClient.OracleType.Number(13) = System.Data.DbType.VarNumeric(21)

System

.Data.OracleClient.OracleType.NVarChar(14) = System.Data.DbType.String(16)

System

.Data.OracleClient.OracleType.Raw(15) = System.Data.DbType.Binary(1)

System

.Data.OracleClient.OracleType.RowId(16) = System.Data.DbType.AnsiString(0)

System

.Data.OracleClient.OracleType.Timestamp(18) = System.Data.DbType.DateTime(6)

System

.Data.OracleClient.OracleType.TimestampLocal(19) = System.Data.DbType.DateTime(6)

System

.Data.OracleClient.OracleType.TimestampWithTZ(20) = System.Data.DbType.DateTime(6)

System

.Data.OracleClient.OracleType.VarChar(22) = System.Data.DbType.AnsiString(0)

System

.Data.OracleClient.OracleType.Byte(23) = System.Data.DbType.Byte(2)

System

.Data.OracleClient.OracleType.UInt16(24) = System.Data.DbType.UInt16(18)

System

.Data.OracleClient.OracleType.UInt32(25) = System.Data.DbType.UInt32(19)

System

.Data.OracleClient.OracleType.SByte(26) = System.Data.DbType.SByte(14)

System

.Data.OracleClient.OracleType.Int16(27) = System.Data.DbType.Int16(10)

System

.Data.OracleClient.OracleType.Int32(28) = System.Data.DbType.Int32(11)

System

.Data.OracleClient.OracleType.Float(29) = System.Data.DbType.Single(15)

System

.Data.OracleClient.OracleType.Double(30) = System.Data.DbType.Double(8)

Refer:
实例化SqlParameter时,如果是字符型,一定要指定size属性

http://bbs.csdn.net/topics/380155255

为什么@SN varchar类型的和@SN1 nvarchar类型会有这样的差别?

http://bbs.csdn.net/topics/380126782

参数化查询比拼接字符串慢的原因

http://www.cnblogs.com/fxwdl/archive/2008/07/31/1257409.html

同样的SQL语句在查询分析器执行很快,但是网站上执行超时的诡异问题

http://www.cnblogs.com/bluedoctor/archive/2011/03/04/1970866.html

高分求解!为什么拼接的SQL语句比参数化的查询快???

http://bbs.csdn.net/topics/390399686

Data Type Precedence (Transact-SQL)

http://msdn.microsoft.com/en-us/library/ms190309.aspx

what-is-parameter-sniffing

http://blogs.technet.com/b/mdegre/archive/2012/03/19/what-is-parameter-sniffing.aspx

How Data Access Code Affects Database Performance

http://msdn.microsoft.com/en-us/magazine/ee236412.aspx

http://stackoverflow.com/questions/25159051/non-optimal-execution-plan-using-sp-executesql

Slow in the Application, Fast in SSMS ?

http://www.sommarskog.se/query-plan-mysteries.html

parameter-sniffing

https://www.simple-talk.com/sql/t-sql-programming/parameter-sniffing

http://pratchev.blogspot.be/2007/08/parameter-sniffing.html

http://omnibuzz-sql.blogspot.com/2006/11/parameter-sniffing-stored-procedures.html

http://stackoverflow.com/search?q=Parameter+sniffing

SQL 语句在查询分析器执行很快,程序 Dapper 参数化查询就很慢(parameter-sniffing)的更多相关文章

  1. 【mybatis】mybatis执行一个update方法,返回值为1,但是数据库中数据并未更新,粘贴sql语句直接在数据库执行,等待好久报错:Lock wait timeout exceeded; try restarting transaction

    今天使用mybatis和jpa的过程中,发现这样一个问题: mybatis执行一个update方法,返回值为1,但是数据库中数据并未更新,粘贴sql语句直接在数据库执行,等待好久报错:Lock wai ...

  2. 009 面试题 SQL语句各部分的执行顺序

    SQL语句各部分的执行顺序 select distinct...from t1 (left/right) join t2 on t1.xx=t2.xx where t1.xx=? and t2.xx= ...

  3. SQL语句到底是怎么执行的

    写在前面的话:有时不理解SQL语句各个部分执行顺序,导致理解上出现偏差,或者是书写SQL语句时随心所欲,所以有必要了解一下sql语句的执行顺序.可以有时间自己写一个简单的数据库,理解会更加深入.下面就 ...

  4. [sqlserver脚本]查看指定SQL语句生成了哪些执行计划

    参考SQL技术内幕写了一段脚本,可以通过这段脚本查看执行指定SQL语句后,系统生成了哪些执行计划.使用时注意以下几点: 修改use MyTest,换成自己的数据库名字. 将 exec sp_page_ ...

  5. 查询分析器执行SQL很快但是ado.net很慢:请为你的SQLparameter设置DbType

    我们都知道,参数化查询可以处理SQL注入,以及提高查询的效率,因为参数化查询会使MSSQL缓存查询的计划. 但是会出现一个问题:有的时候参数化查询比直接拼接sql字符串效率低好多,甚至是查询超时. 原 ...

  6. SQL 语句与性能之执行顺序

    select * , t3.Name from t1 left join t2 on t1.sysno = t2.Asysno left join t3 on t3.sysno = t2.Bsysno ...

  7. 如何测试sql语句性能,提高执行效率

    有时候我们经常为我们的sql语句执行效率低下发愁,反复优化后,可还是得不到提高 那么你就用这条语句找出你sql到底是在哪里慢了 示例: SET STATISTICS io ON        SET ...

  8. 测试sql语句性能,提高执行效率

    为了让您的程序执行的效率更高,SQL的效率一定不可忽视. 现有以下方法去检测SQL的执行效率. 对于多表查询的效率测试: )直接from ,where方式. SET STATISTICS io ON ...

  9. SQL语句:语法错误(操作符丢失)在查询表达式中

    所谓操作符丢失,应该是你在拼接SQL语句是少了关键词或者分隔符,导致系统无法识别SQL语句.建议:1.监控SQL语句,看看哪里出现问题:断点看下最后的sql到底是什么样子就知道了,另外你可以把这段sq ...

随机推荐

  1. python_day1_程序交互

    程序交互 在编写程序过程中总会有程序与用户交互的场景出现,这里面提到python会使用一个方法:input 用法: 例如:请用户输入一个账号 input"Please input your ...

  2. 基于UML的毕业选题系统建模研究

    一.基本信息 标题:基于UML的毕业选题系统建模研究 时间:2018 出版源:电脑迷 领域分类:UML建模技术 二.研究背景 问题定义:为了加强学生设计分析开发软件的相关能力,有效避免结构化模型存在的 ...

  3. jsp页面有一个注册form表单,传值的时候后台接收到的全部是null

    [页面上的传值元素一定要有name属性才可在后台接受到参数的值.切记!] 此处一定要注意,form表单里面的元素,比如input元素是否和后台的requset.getparameter();中的参数名 ...

  4. 编译与解释(java)

    计算机不能直接理解高级语言,只能直接理解机器语言,所以必须要把高级语言翻译成机器语言,计算机才能执行高级语言编写的程序. 翻译的方式有两种,一个是编译,一个是解释.两种方式只是翻译的时间不同 计算机不 ...

  5. docker 安装Nginx

    1.使用镜像加速拉取nginx [root@192 ~]# $ docker pull registry.docker-cn.com/library/nginx:1.15 2.通过docker run ...

  6. Java 实现字符串的加密与解密

    package com.wangbo.util; import java.security.Key; import java.security.Security; import javax.crypt ...

  7. 微信小程序如何套用iconfont

    前言 如果你在开发微信时,没有图标的话,可以到http://www.iconfont.cn/ 官方下使用图标,那么我们去使用一些吧,到官方网址下点击使用~ 下载代码即可使用,看看下载的文件吧. 如图可 ...

  8. AndroidStudio制作“我”的界面,设置,修改密码,设置密保和找回密码

    前言 大家好,给大家带来AndroidStudio制作"我"的界面,设置,修改密码,设置密保和找回密码的概述,希望你们喜欢 学习目标 掌握修改密码功能的开发,和实现用户密码的修改: ...

  9. Linux - 查看进程状态

    ps命令 report a snapshot of the current processes. 能提供一份当前进程的快照,以列表的形式显示正在运行的进程. 列出进程的数量取决于命令所附加的参数,例如 ...

  10. C# TableLayoutPanel使用方法

    一.利用TableLayoutPanel类展示表格,以10行5列为例 第1步:在前台创建一个panel,使TableLayoutPanel对象填充其内部. 第2步:创建TableLayoutPanel ...