slqserver数据类型优先级的一个问题
来源:互联网 发布:tensorflow linux 编辑:程序博客网 时间:2024/05/21 22:40
生产中使用sqlserver往往会遇到一些开发同学不曾注意的数据库细节,前些天有个开发同学看到jdbc的连接有一段这样的代码:
dbcp.url=jdbc:sqlserver://xxxx:xxxx;DatabaseName=xxxx;sendStringParametersAsUnicode=false
主要是:
sendStringParametersAsUnicode=false
开发同学说,这个是什么鬼,以前从来没有人教我这样写过,为什么要加这个?
看这样一个简单的sql,tableA是一个大表,1000w吧,uuid还是主键。
Select * from tableA where uuid = #{uuid}
从sqlserver客户端跑
Select * from tableA where uuid = 'xxxxxxxxxxx'
速速杠杠的,它告诉你,查询只需要0ms
。
但是我可以负责任人的告你,在3年前的系统,抓一些cpu利用率高的sql,发现竟然有很大比例是这么一个简单的sql。
如果觉得奇怪,不合理,完全不用。要知道,代码的世界没有奇怪,只是你可能忽略了某一个你不清楚的东西。
调试的时候发现#{uuid}
实际到数据库的执行方式发生了微妙的变化。
uuid字段在数据库是varchar类型的,Sqlserver默认的编码方式是ANSI的方式,而java是Unicode。默认的jdbc连接
sendStringParametersAsUnicode=true
看一看sqlserver 数据类型优先级,当两个不同数据类型的表达式用运算符组合后,数据类型优先级规则指定将优先级较低的数据类型转换为优先级较高的数据类型。如果此转换不是所支持的隐式转换,则返回错误。当两个操作数表达式具有相同的数据类型时,运算的结果便为该数据类型。
http://msdn.microsoft.com/zh-cn/library/ms190309(v=sql.105).aspx
看排序的第25到27
uniqueidentifiernvarchar(包括 nvarchar(max))ncharvarchar(包括 varchar(max))char
nvarchar排在了varchar前面,nvarchar优先级高,数据库就把uuid整列都转换为nvarchar类型,然后再执行查询,这样的查询在数据量大的情况下就OVER了。
0 0
- slqserver数据类型优先级的一个问题
- 一个常见的优先级问题
- css的有关优先级的一个问题
- 一个容易忽略的优先级问题
- CSS中遇到的一个优先级问题
- 一个关于数据类型的问题
- 一个小问题引出的有关CSS优先级的思考
- 关于and or的优先级的一个小问题
- 一个线程的优先级
- 一个操作符优先级顺序引起的问题
- 一个运算符优先级问题引发的血案
- 一个C语言运算符优先级导致的问题
- 一个C语言运算符优先级导致的问题
- 一个关于Java数据类型的有趣问题
- 一个C程序的数据类型对齐问题
- 关于一个数据类型的溢出问题
- 数据类型优先级
- *string++优先级的问题
- Linux流量监控工具 - iftop
- 苹果关于TestFlight Beta Testing简介和细节信息
- 计网面试题
- STS添加SVN插件
- (转载)VMware虚拟机配置Ubuntu桥接方式(Bridged)使虚拟机和宿主机能互相ping通
- slqserver数据类型优先级的一个问题
- HDU — 4240 Route Redundancy(最大流)
- [linux]date命令时间戳和时间之间的转换
- Linux Shell 数组
- 找实习生工作之路第二天
- LOJ 1070 - Algebraic Problem(矩阵快速幂啊)
- IOS - UIView停止交互
- 三步学会用spring开发OSGI——(第一步:环境篇)
- IDEA调试SPARK程序