小议隐式转换引起的问题

小议隐式转换引起的问题

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

隐式转换(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.将两者转换到第三方数据类型

这部分就不一一赘述了。

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

 

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

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

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • trojangeneric木马_kali木马绑定app

    trojangeneric木马_kali木马绑定appKworker木马,如果发现root权限计划任务有以下这种非常规任务,说明已经中招成了矿机Dt环境,大家要注意,切莫随便给开放端口。Redis,与研发商量最好加上密码,矿机会在同网段扫描,一定要及时处理。按照以下方法清理,以下命令一起执行,不要分步骤,否则没有效果,可以写成个bash脚本,随大家心情。echo””>/etc/crontabrm-f/etc/cron.hourly/oanacronerrm-f/etc/cron.daily/oanacronerch…

    2022年9月25日
  • cubieboard刷机

    cubieboard刷机我用的是cubieboard2(在cubieboard内部是cubieboard20),而cubietrunk好像

    2022年7月22日
  • linux查看端口占用的命令_端口占用查看命令

    linux查看端口占用的命令_端口占用查看命令在Linux使用过程中,需要了解当前系统开放了哪些端口,并且要查看开放这些端口的具体进程和用户,可以通过netstat命令进行简单查询netstat命令各个参数说明如下:  -t:指明显示TCP端口  -u:指明显示UDP端口  -l:仅显示监听套接字(所谓套接字就是使应用程序能够读写与收发通讯协议(protocol)与资料的程序)  -p:显示进程标识符和程序

    2022年7月27日
  • pycharm 2021最新永久激活码【在线注册码/序列号/破解码】

    pycharm 2021最新永久激活码【在线注册码/序列号/破解码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月18日
  • ACID、BASE和CAP原理

    ACID、BASE和CAP原理1.ACID   ACID,是指在数据库管理系统(DBMS)中,事务(transaction)所具有的四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。  在数据库系统中,一个事务是指:由一系列数据库操作组成的一个完整的逻辑过程。例如银行转帐,从原账户扣除金额,以及向目标账户

    2022年5月19日
  • String字符串截取几种方法

    String字符串截取几种方法String截取字符串publicstaticvoidmain(String[]args){ Stringa="abcd-efg"; Stringa1=a.substring(a.lastIndexOf("-")+1); Stringa2=a.substring(0,a.indexOf("-")); System.out.println(a1);//efg …

    2022年5月19日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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