前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >小议隐式转换引起的问题

小议隐式转换引起的问题

作者头像
用户1217611
发布2018-01-30 17:19:00
9170
发布2018-01-30 17:19:00
举报
文章被收录于专栏:文渊之博文渊之博

隐式转换(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类型的情况下隐式转换有什么不同

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

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

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

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

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

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

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

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

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

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

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

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

这部分就不一一赘述了。

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-10-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档