exec sp_executesql 比直接执行SQL慢,而且消耗大量资源问题
今天SqlServer数据库出现了访问不通的情况,抓紧重启了下服务,让大家先恢复使用,然后我开了 SQL Server Profiler 看看是不是存在性能问题SQL,然后就发现一批这样的SQL,看reads到了6万、2万的级别,这个SQL查询的结果也就几条,这reads明显存在问题

把SQL改写下试试,

可以看到,SQL很快的,reads在个位数,确认存在问题无疑。
上面自动生成的SQL与改写的SQL对比,可以看到写法最大的区别就是 exec sp_executesql ,初步怀疑是这个引起的问题。
找到代码所在行,上面的SQL是使用的SqlSugar生成的代码
List<Log_hh_god> wpList = _ILog_hh_godRep.FindListByClause(x => x.hhpc == hhpc);
怀疑是不是自动生成的SQL有问题,改成手写的SQL,执行后发现还是不行
List<Log_hh_crd> kxList = _ILog_hh_crdRep.QueryList<Log_hh_crd>("SELECT * FROM [Log_hh_crd] WHERE hhpc=@hhpc ", new { hhpc = hhpc });
然后就是在网上找资料,最终有个回答引起了我的注意,于是我去确认了下Log_hh_crd表中的字段hhpc的类型,是varchar ,而上面自动生成的SQL里面是nvarcahr(4000),会不会是这个区别的问题呢

改了一对比,结果很明显了,就是SQL中的类型与实际类型不一致,导致资源消耗远远超过预期。
试了SqlSugar提供的字段标注功能,有个ColumnDataType,加上试试
[SqlSugar.SugarColumn(ColumnDataType = "varchar(40)")]
public string hhpc { get; set; }
结果不行,去翻了下文档,说“自定义生成的数据类型,生成表会用到”,这条路走不通了。。。
只能使用终极办法=======> 修改字段类型!!!
注意
1、如果这个字段存在索引的话,需要先备份索引创建SQL,然后删除索引,再改字段格式,然后再加上索引
2、如果数据量比较大,建议在非业务高峰进行这个操作。
exec sp_executesql 比直接执行SQL慢,而且消耗大量资源问题的更多相关文章
- 历史执行Sql语句性能分析 CPU资源占用时间分析
SELECT HIGHEST_CPU_QUERIES.PLAN_HANDLE, HIGHEST_CPU_QUERIES.TOTAL_WORKER_TIME, Q.DBID, ...
- 动态执行SQL语句
在实际制作过程中,需要动态的拼接SQL语句然后执行.具体代码如下: declare @columnName varchar(20),@tempName varchar(20) select @temp ...
- 动态SQL的执行,注:exec sp_executesql 其实可以实现参数查询和输出参数的
本文转自:http://www.cnblogs.com/hnsdwhl/archive/2011/07/23/2114730.html 当需要根据外部输入的参数来决定要执行的SQL语句时,常常需要动态 ...
- 使用exec和sp_executesql动态执行SQL语句(转载)
当需要根据外部输入的参数来决定要执行的SQL语句时,常常需要动态来构造SQL查询语句,个人觉得用得比较多的地方就是分页存储过程和执行搜索查询的SQL语句.一个比较通用的分页存储过程,可能需要传入表名, ...
- 动态sql语句基本语法--Exec与Exec sp_executesql 的区别
http://www.cnblogs.com/goody9807/archive/2010/10/19/1855697.html 动态sql语句基本语法 1 :普通SQL语句可以用Exec执行 ...
- sp_executesql动态执行sql语句并将结果赋值给一变量
需求场景: 需动态拼接sql语句进行执行,并将执行的结果赋值给一指定变量. 样例代码如下: SELECT @tableName = TAB_NAME FROM dbo.NMR_BLYWBDY WHER ...
- sp_executesql得到执行sql语句的返回值
执行 sql语句,得到 变量的值 ' declare @Partition int; ); ); SET @SQLString = N'SELECT @RangeKeyOUT = $PARTITION ...
- 使用PDO执行SQL语句exec()、query()
在PHP脚本中,通过PDO执行SQL查询与数据库进行交互,可以分为三种不同的策略,使用哪一种方法取决于你要做什么操作. 1.使用PDO::exec()方法 当执行INSERT.UPDATE和DELET ...
- sp_executesql 或者 EXECUTE 执行动态sql的权限问题
当 sp_executesql 或 EXECUTE 语句执行字符串时,字符串将作为它的自包含批处理执行.SQL Server 会将字符串中的一个或多个 Transact-SQL 语句编译为独立于批处理 ...
随机推荐
- 2019年9月Leetcode每日训练日志
2019-09-16 #1171 从链表中删去总和值为零的连续节点 #1170 比较字符串最小字母出现频次 #1169 查询无效交易 #226 翻转二叉树 2019-09-15 #1190 反转每对括 ...
- IDEA debug漏洞第二弹(fastjson,version<1.2.47)
首先这个漏洞调试不需要非要使用docker,本身是一个jar包的问题.所以我们可以自己写一个小java代码来直接调试. POC如下 {"name":{"@type&quo ...
- CentOS 部署 MongoDB(新)
step1.进入到/opt/下执行 下载 wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.6.5.tgz ste ...
- 学习笔记:CentOS7学习之二十四:expect-正则表达式-sed-cut的使用
目录 学习笔记:CentOS7学习之二十四:expect-正则表达式-sed-cut的使用 24.1 expect实现无交互登录 24.1.1 安装和使用expect 24.2 正则表达式的使用 24 ...
- JavaSE基础(十)--Java中的基本数据类型转换
Java中的基本数据类型转换 说基本数据类型转换之前,先了解下 Java 中的 8 种基本数据类型,以及它们的占内存的容量大小和表示的范围,如下图所示. 重新温故了下原始数据类型,现在来解释下它们之间 ...
- Pycharm 误删文件夹
在Linux下操作时误删除了Pycharm项目中的文件夹,打开垃圾桶,居然找不到,立马上网查Linux下怎么恢复文件, 冷静一下,不是还有个Ctrl + Z吗,对着Pycharm 文件浏览器 按一下, ...
- JDBC 资源绑定器 ,处理查询结果集
使用资源绑定器绑定属性配置 实际开发中不建议把连接数据库的信息写死到Java程序中 //使用资源绑定器绑定属性配置 ResourceBundle bundle = ResourceBundle.get ...
- 2019南昌网络赛 I. Yukino With Subinterval 树状数组套线段树
I. Yukino With Subinterval 题目链接: Problem Descripe Yukino has an array \(a_1, a_2 \cdots a_n\). As a ...
- 关于JS原型以及原型链、instanceof的一些理解
一.JS原型 首先要区分两个概念 1.构造函数 2.实例:由构造函数通过new方式创建出来的就是实例 <script> function Foo() { } var f = new Foo ...
- 一块40克的砝码,摔成4块,利用天平,刚好可以称出1~40g所有整数克,问:这4块分别是多少克
public static void main(String[] args) { List<Integer> list = new ArrayList<>();//记录每组数的 ...