小议隐式转换引起的问题

小议隐式转换引起的问题

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

隐式转换(Implicit conversion) ,这个情况每个程序员都或多或少的遇到过,这里我结合实际情况简单描述下常见的问题以及如何解决并阐述下原理。

所谓隐式转换主要出现在我们T-SQL语句中的where 条件里面,我们先从原因上去看一下为什么会出现隐式转换。

出现隐式转换的情况和结果

当SQL server遇到一个不匹配类型的表达式的时候,它有两种可能:1.使用隐式转换并能够执行;2.转换错误而导致执行失败。

在进行之前,我们先提出一个概念:

数据类型优先级

当两个不同数据类型的表达式用运算符组合后,数据类型优先级规则指定将优先级较低的数据类型转换为优先级较高的数据类型。

如果此转换不是所支持的隐式转换,则返回错误。 当两个操作数表达式具有相同的数据类型时,运算的结果便为该数据类型。

SQL Server 对数据类型使用以下优先级顺序:                       

  1. 用户定义数据类型(最高)                               
  2. sql_varian   t                                
  3. xml                                                  
  4. datetimeoffset                                                  
  5. datetime2                                                  
  6. datetime                                                  
  7. smalldatetime                                                  
  8. date                                                  
  9. time                                                  
  10. float                                                  
  11. real                                                  
  12. decimal                                                  
  13. money                                                  
  14. smallmoney                                                  
  15. bigint                                                  
  16. int                                                  
  17. smallint                                                  
  18. tinyint                                                  
  19. bit                                                  
  20. ntext                                                  
  21. text                                                  
  22. image                                                  
  23. timestamp                                                  
  24. uniqueidentifier                                                  
  25. nvarchar(包括 nvarchar(max))                               
  26. nchar                                                  
  27. varchar(包括 varchar(max))                               
  28. char                                                  
  29. varbinary(包括 varbinary(max))                               
  30. binary(最低)                

1.隐式转换成功的情况下有两种情况,我们结合执行计划来看一下

主键为int 类型和主键为varchar类型的情况下隐式转换有什么不同

      <span>小议隐式转换引起的问题</span>    <span>小议隐式转换引起的问题</span>

图1.SalesOrderId主键为Int类型                                                                            图2.SalesOrderId主键为varchar类型    

通过执行sql语句和执行计划我们很容易发现,当主键为Int类型的时候,我们的参数为varchar类型,结果采用了聚集索引查找,效率较高(图1);

而图2,主键改为varchar类型,参数改为int类型执行计划采用了非聚集索引扫描,IO势必增加不少。

结合我们之前提出的优先级概念,得知如果参数的数据类型较低则隐式转换后采用了正确的优化,即无损转换,而当参数优先级较低的时候则对性能产生了损耗。

下面我们看一下详细的执行计划来作证上面的观点:

<span>小议隐式转换引起的问题</span><span>小议隐式转换引起的问题</span>

有这个对比可以发现一个是对参数进行了转换,一个是对数据表的字段进行了转换,可以想象由此得出的问题。

 当然我们也可以通过转换参数的类型的方式来解决这个问题,但是由与精度不同有时候会产生问题,比如转换一个REAL型到INT整型

 CONVERT(INT,@Real);需要注意的是联接丛书页面中涵盖了一个兼容性矩阵,描述了SQL server如何处理数据类型转换的所有可能性,意思就

是说并非所有的隐式转换都可行,有些转换是不被允许的。简单说基本上, 有三种比较表达式选项:

  1.转换右侧数据类型为左侧数据类型。

  2.转换左侧数据类型为右左侧数据类型。

  3.将两者转换到第三方数据类型

这部分就不一一赘述了。

总结: 本文主要介绍了隐式转换产生的原因及原理,实例证明了对于查询效率产生了明显的影响。具体解决上要根据实际情况进行数据类型的转换或者注意类型的兼容性和优先级。由于隐式转换查询带来的性能问题甚至由于主键扫描带来的锁的问题,都需要开发人员了解这部分的原理,从根源上避免这类事件的发生。

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/119626.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • docker搭建kafka集群

    docker搭建kafka集群docker搭建kafka集群我在M1mbp上使用的以下镜像新建文件zk-kafka-docker-compose.ymlversion:”2″services:zookeeper:user:rootimage:docker.io/zookeeperports:-“12181:2181″environment:-ALLOW_ANONYMOUS_LOGIN=yesvolumes:-zoo

  • B站牛逼的实时弹幕系统架构是如何实现的

    B站牛逼的实时弹幕系统架构是如何实现的

    2020年11月14日
  • 关于2020最新Kali无法使用arpspoof命令解决(在源和包都已经安装的情况下)

    关于2020最新Kali无法使用arpspoof命令解决(在源和包都已经安装的情况下)第一步可以参照这个https://hlynford.com/565.html如果你按照上面的步骤安装了相应的包,还是没有相应的命令,那多半就是路径的问题了第二部[root@server~]#echo$PATH/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin如果输出的东西和上面不一样…

  • JShell介绍「建议收藏」

    JShell介绍「建议收藏」文章目录一、JShell是什么?二、为什么使用JShell三、使用步骤1.安装jdk9.0以上版本2.cmd命令行中进入JShell3.就可以直接敲击单行代码了引用一、JShell是什么?JavaShell工具(JShell)是用于学习Java编程语言和原型化Java代码的交互式工具。该工具使用命令行运行。二、为什么使用JShell使用JShell,可以一次输入一个程序元素,立即查看结果,并根据需要进行调整。三、使用步骤1.安装jdk9.0以上版本例如我的是15.0版本:2.cm

    2022年10月31日
  • android之View坐标系(view获取自身坐标的方法和点击事件中坐标的获取)

    在做一个view背景特效的时候被坐标的各个获取方法搞晕了,几篇抄来抄去的博客也没弄很清楚。现在把整个总结一下。其实只要把下面这张图看明白就没问题了。涉及到的方法一共有下面几个:view获取自身坐标:getLeft(),getTop(),getRight(),getBottom()view获取自身宽高:getHeight(),getWidth()motionEvent获取坐标:getX(),getY

  • 常见数据结构与算法整理总结(下)_常用数据结构与算法

    常见数据结构与算法整理总结(下)_常用数据结构与算法数据结构是以某种形式将数据组织在一起的集合,它不仅存储数据,还支持访问和处理数据的操作。算法是为求解一个问题需要遵循的、被清楚指定的简单指令的集合。下面是自己整理的常用数据结构与算法相关内容,如有错误

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号