数据类型隐式转换导致的阻塞

news2025/2/3 6:51:15

背景

不合适的数据类型隐式转换会导致性能下降和并发下降,而且大多数技术人员对隐式转换的概念是陌生的,因此在生产环境中非常常见,通过本文做一个系统的梳理。

现象

收到SQL专家云阻塞告警邮件,登录SQL专家云,进入实时可视化页面,看到从20点开始出现大量的阻塞。

进入活动会话原始数据页面,看到产生阻塞的都是同一类语句。

SQL语句是很简单的一个MERGE语句,基于表的主键PK_NAME进行匹配,匹配到做更新,匹配不到做插入。

DECLARE @PK_NAME nvarchar(4000), @PK_VALUE nvarchar(4000)
MERGE INTO   COIND_DS tUSING(  SELECT @PK_NAME AS PK_NAME, @PK_VALUE AS PK_VALUE) b ON(  t.PK_NAME = b.PK_NAME)WHEN MATCHED THEN  UPDATE SET PK_VALUE = @PK_VALUEWHEN NOT MATCHED THEN   INSERT (PK_NAME, PK_VALUE) VALUES(@PK_NAME, @PK_VALUE);

 

分析

 

通过现象发现有两点不正常,第一:基于主键的更新或者插入一条数据,而且各个并发会话的参数值都不一样,不应该产生阻塞;第二:该语句不应该有如此高的CPU消耗时间和读次数。

 

第一反应就是可能存在隐式转换,查看表的PK_NAME字段,是varchar(4000)的数据类型,而参数@PK_NAME是nvarchar(4000),在进行比较前,通过隐式转换把PK_NAME字段的值转换成nvarchar,导致查找次数增多,读次数和CPU时间增加,最主要的是导致了并发的下降,因此才产生了阻塞。

SQL Server在进行比较、组合、赋值等操作时,要进行数据类型的转换,数据类型转换分为隐式转换和显示转换。隐式转换对用户不可见, SQL Server根据数据类型优先级规则将优先级较低的数据类型自动转换为优先级较高的数据类型,例如,smallint 会被转换为 int,char会被转换为nchar。如果两种数据类型不支持隐式转换,则返回错误;显式转换使用 CAST 或 CONVERT 函数,CAST 和 CONVERT 函数可将值(局部变量、列或其他表达式)从一种数据类型转换为另一种数据类型,例如,CAST ( $157.27 AS VARCHAR(10) )。

SQL Server官方文档中提供了一张数据类型转换表,详细的描述了各数据类型之间的转换关系,详细请参考:https://learn.microsoft.com/zh-cn/sql/t-sql/data-types/data-type-conversion-database-engine?view=sql-server-2017。

DEMO

首先创建一张表,其中字段id的数据类型varchar,并且为主键、聚集索引。最后写入100万行数据。

 

对字段id做一个简单的LIKE查询,参数@id的数据类型为varchar。通过执行计划看使用聚集索引查找。逻辑读取次数是7次。

 

把参数@id的数据类型改成nvarchar后,通过执行计划可以看到,在比较时要把字段id每行的值从varchar转换成nvarchar,然后再进行比较,从而产生了隐式转换,导致索引查找变成索引扫描,逻辑读取次数从7次增加到1006108次。这仅是一个100万行数据的表,表的行数越多造成的性能影响越大。

 

说明1:这里用LIKE来做演示是因为执行计划简单,容易理解。现实中大多数情况还是等值比较,因为SQL Server做了相关的优化,把nchar类型的值计算为char类型的最小值和最大值,然后进行范围的查找,再对查找出来的结果进行隐式转换后比较,因此是不会导致索引扫描的,性能下降的不是特别厉害,但是由于变成了范围查找,加锁的行数增加了,还是会导致并发下降。

说明2:如果字段是nchar\nvarchar,参数是char\varchar类型,隐式转换的是参数的值,是不影响性能的。

解决

在设计字段类型和声明参数时不要随意,最典型的错误就是在SQL语句中声明字符串参数时不管什么用途一律使用nvarchar类型。

在程序中指明数据类型,例如在C#中不明确指定数据类型的字符串参数,就会使用nvarchar数据类型。

 

想要生成varchar数据类型,一定要明确指定。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/103820.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

推荐系统学习笔记-冷启动

简介 推荐系统的主要目标是将大量的标的物推荐给可能喜欢的海量用户, 这里涉及到标的物和用户两类对象。任何互联网推荐产品, 标的物和用户都是不断增长变化的,所以一定会频繁面对新标的物和新用户, 推荐系统冷启动问题指的就是对于新注册的用户或者新入库的标的物…

CDGA|2022年内有超20家银行因数据治理模块受罚,原因都在这里

今年,银保监会对银行数据治理的监管趋严,对银行机构在监管数据质量和数据报送中存在的违法违规行为,不断加大处罚与整治力度。 近日,北京农商银行收到的一张630万元罚单显示,该行主要存在的违法违规事实具体为&#xf…

NVMe解读

看NVMe协议(1.0e)过程中,参考了SSDFans的很多文章内容, 目录 1. 综述 3 1.1 名词解释 3 1.1.1 Namespace 3 1.1.2 Fused Operations 4 1.1.3 指令执行顺序 4 1.1.4 写单元的原子性 4 1.1.5 元数据 4 1.1.6 仲裁机制 4 1…

图数据库知识点3:图数据库解决了什么问题?

在前面的两个知识点中我们先后介绍了: 知识点1:图数据库与关系型数据库的区别 知识点2:图思维方式 现在,我们可以更进一步来通过具体的例子来了解图数据库、图计算到底解决了什么问题。我们先来剖析下面这个问题: 图数据库查询…

【Vue实用功能】elementUI 自定义表单模板组件

elementUI 实现一个自定义的表单模板组件 注&#xff1a;该功能基于elementUI 背景&#xff1a;在项目开发中&#xff0c;我们会遇到这种需求&#xff0c;在管理后台添加自定义表单&#xff0c;在指定的页面使用定义好的表单 直接上代码&#xff1a; <template><di…

DBCO-PEG-NHS, 可溶于水,有多种分子量供选择

凯新生物DBCO-PEG-NHS衍生物可以点击化学反应不需要任何金属催化剂。反应促进1,3-偶极环加成反应&#xff0c;环辛炔和叠氮化合物&#xff0c;也被称为铜自由点击反应&#xff0c;是一种生物正交反应使溶液中的两个分子的共轭。DBCO PEG衍生物具有缓冲溶液中快速的动力学和稳定…

C语言基础【程序=算法+数据结构】——(数据结构——基础篇)

欢迎小伙伴的点评✨✨ 本篇章系列是对C语言的深度思考和总结、关于C语言内容会持续更新。 文章目录✨前言✨数据的表现形式✨数据类型一、基本类型1.1、整型类型1.1.1、基本整型(int)1.1.2、短整型(short int)1.1.3、长整型(long int)1.1.4、*双长整型(long long int)1.1.5、字…

1556:Dis——Tarjan求LCA、倍增求LCA

【题目描述】 给出 n 个点的一棵树&#xff0c;多次询问两点之间的最短距离。 注意&#xff1a;边是双向的。 【输入】 第一行为两个整数 n 和 m。n 表示点数&#xff0c;m 表示询问次数&#xff1b; 下来 n−1 行&#xff0c;每行三个整数 x,y,k&#xff0c;表示点 x 和点 …

英文计算机论文写作,需要注意哪些细节? - 易智编译EaseEditing

&#xff08;1&#xff09;尽量用动词少用名词化 那些大篇名词的文章真的很难读懂&#xff0c;而有强大动词的句子更容易理解。 我们注意到客户在论文中经常使用的名词有“agreement”, “disagreement”, “investigation”, “analysis”, “examination”, “comparison”…

Qt 中的多项目管理

背景&#xff1a; 在Visual Studio中使用 “Solution” 来组织多个 Projects。 在Qt中&#xff0c;使用 "Subdirs Project"来组成多个projects &#xff0c;实现VS中的Solution功能。 项目类型 首先是先新建一个子目录项目&#xff0c;再根据需要在子目录项目中添…

漏洞深度分析|CVE-2022-1471 SnakeYaml 命令执行漏洞

项目介绍 YAML是一种数据序列化格式&#xff0c;设计用于人类的可读性和与脚本语言的交互。 SnakeYaml是一个完整的YAML1.1规范Processor&#xff0c;支持UTF-8/UTF-16&#xff0c;支持Java对象的序列化/反序列化&#xff0c;支持所有YAML定义的类型。 项目地址 https://gi…

javaee之MyBatis框架3

mybatis中编写dao实现类的使用方式 简单说一下实现原理&#xff1a; 下面来说一下UserDaoImpl的实现原理 mybatis主配置文件中properties标签的使用 第一种&#xff1a; <property name"driver" value"com.mysql.jdbc.Driver"></property> &…

软件加密保护:Mirage License Protector v5 注册版

Mirage License Protector v5.1.0 适用于许多编译器 License Protector 是一个 DLL / COM exe&#xff0c;几乎可以与 所有编译器一起使用&#xff1a;C、C#、.NET、Delphi、VB6 和 VB.NET&#xff0c; 32 位和 64 位的 Java 哪种产品适合我&#xff1f; 选择许可证保护器 应…

智能无障碍轮椅——PID算法控制

文章目录一、PID算法二、控制方法对比棒棒控制&#xff08;启停控制器&#xff09;比例控制PI控制PID控制三、PID的手动整定四、PID衰减曲线整定五、PID调节器各校正环节的作用是&#xff1a;六、PID算法的一般表达式是&#xff1a;七、计算注意事项一、PID算法 PID控制是最早…

图像语义分割网络FCN(32s、16s、8s)原理及MindSpore实现

一、FCN网络结构 全卷积网络(Fully Convolutional Networks)&#xff0c;是较早用于图像语义分割的神经网络。根据名称可知&#xff0c;FCN主要网络结构全部由卷积层组成&#xff0c;在图像领域&#xff0c;卷积是一种非常好的特征提取方式。本质上&#xff0c;图像分割是一个分…

DBCO-PEG-NH2/Amine二苯基环辛炔-聚乙二醇-氨基 简介。用于以高特异性和反应性标记叠氮化物修饰的生物分子。

中文名称&#xff1a; 二苯基环辛炔-聚乙二醇-氨基 氨基-聚乙二醇-二苯基环辛炔 英文简称&#xff1a; DBCO-PEG-NH2/Amine Amine/H2N-PEG-DBCO 外观&#xff1a; 灰白色固体或半固体&#xff0c;取决于PEG的分子量 溶剂&#xff1a; 部分常规有机溶剂 存储…

day20-django

文件上传 批量上传数据 案例&#xff1a;混合数据(Form) 提交页面&#xff1a;用户输入数据文件&#xff08;输入不能为空&#xff0c;报错&#xff09; django开发过程中两个特殊的文件夹 static&#xff1a;存放静态文件的路径&#xff0c;包括css、js、项目图片 media&…

【问题记录】Git问题记录

文章目录问题1Failed to connect to github.com port 443 after 21085 ms: Timed outOpenSSL SSL_read: Connection问题2unable to access https://github.com//: OpenSSL SSL_read: Connection was reset, errno 10054网速慢问题clone太慢&#xff0c;pull太慢怎么办问题1 Fa…

记录C,C++关键字的位置,直接跳过注释和字符串文本。

依据第二版本&#xff0c;可以写一个跳过注释的查找函数 C_IndexOfWord Java_IndexOfWord CSharp_IndexOfWord 还有一种方法&#xff0c;可以先把所有注释用空格代替&#xff0c;查出的字符位置也不变。 以前版本&#xff1a; DList<TextColor> Syntax::GetTextColor…

m基于matlab的连续相位调制(CPM)解调系统仿真,包括解调,同步等模块

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 随着数字通信技术的飞速发展&#xff0c;数字通信的调制技术也得到了快速发展&#xff0c;其中连续相位调制(Continuous Phase Modulation&#xff0c;CPM)作为一种全新的通信调制方法得到了越来…