小议隐式转换引起的问题

小议隐式转换引起的问题

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

隐式转换(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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • WPF获取窗口句柄

    WPF获取窗口句柄2019独角兽企业重金招聘Python工程师标准>>>…

    2022年7月21日
    8
  • 电力负荷预测三篇综述总结

    电力负荷预测三篇综述总结对前面三篇关于负荷预测的综述论文进行一个总结。

    2022年5月9日
    410
  • ubuntu-apache下隐藏thinkphp入口文件index.php

    ubuntu-apache下隐藏thinkphp入口文件index.php

    2021年9月24日
    52
  • XXE漏洞学习[通俗易懂]

    XXE漏洞学习[通俗易懂]0x00什么是XML 1.定义XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。 2.文档结构XML文档结构包括XML声明、DTD文档类型…

    2022年5月23日
    34
  • 【数据结构】— kmp算法和strstr函数

    【数据结构】— kmp算法和strstr函数kmp算法和strstr函数注:现实生活中,字符串匹配在很多的应用场景里都有着极其重要的作用,包括生物信息学、信息检索、拼写检查、语言翻译、数据压缩、网络入侵检测等等,至此诞生了很多的算法,那么我们今天就来探索这两种经典的算法。一、概念分析首先我们需要了解到什么是kmp算法和strstr函数概念如下:KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R….

    2022年6月25日
    21
  • 测试这个东西好不啦

    测试这个东西好不啦欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦:Markdown和扩展Markdown简洁的语法代码块高亮图片链接和图片上传LaTex数学公式UML序列图和流程图离线写博客导入导出Markdown文件丰富的快捷键快捷键加粗Ctrl+B斜体Ctrl+I引用Ctrl

    2022年10月31日
    0

发表回复

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

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