小议隐式转换引发的问题

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

所谓隐式转换主要出如今咱们T-SQL语句中的where 条件里面,咱们先从缘由上去看一下为何会出现隐式转换。sql

出现隐式转换的状况和结果ide

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

在进行以前,咱们先提出一个概念:优化

数据类型优先级spa

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

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

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

  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.隐式转换成功的状况下有两种状况,咱们结合执行计划来看一下blog

主键为int 类型和主键为varchar类型的状况下隐式转换有什么不一样

         

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

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

而图2,主键改成varchar类型,参数改成int类型执行计划采用了非汇集索引扫描,IO势必增长很多。

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

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

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

 固然咱们也能够经过转换参数的类型的方式来解决这个问题,可是由与精度不一样有时候会产生问题,好比转换一个REAL型到INT整型

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

是说并不是全部的隐式转换均可行,有些转换是不被容许的。简单说基本上, 有三种比较表达式选项:

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

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

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

这部分就不一一赘述了。

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

相关文章
相关标签/搜索