slqserver数据类型优先级的一个问题
2015-07-13 18:09
459 查看
生产中使用sqlserver往往会遇到一些开发同学不曾注意的数据库细节,前些天有个开发同学看到jdbc的连接有一段这样的代码:
主要是:
开发同学说,这个是什么鬼,以前从来没有人教我这样写过,为什么要加这个?
看这样一个简单的sql,tableA是一个大表,1000w吧,uuid还是主键。
从sqlserver客户端跑
速速杠杠的,它告诉你,查询只需要
但是我可以负责任人的告你,在3年前的系统,抓一些cpu利用率高的sql,发现竟然有很大比例是这么一个简单的sql。
如果觉得奇怪,不合理,完全不用。要知道,代码的世界没有奇怪,只是你可能忽略了某一个你不清楚的东西。
调试的时候发现
uuid字段在数据库是varchar类型的,Sqlserver默认的编码方式是ANSI的方式,而java是Unicode。默认的jdbc连接
看一看sqlserver 数据类型优先级,当两个不同数据类型的表达式用运算符组合后,数据类型优先级规则指定将优先级较低的数据类型转换为优先级较高的数据类型。如果此转换不是所支持的隐式转换,则返回错误。当两个操作数表达式具有相同的数据类型时,运算的结果便为该数据类型。
http://msdn.microsoft.com/zh-cn/library/ms190309(v=sql.105).aspx
看排序的第25到27
nvarchar排在了varchar前面,nvarchar优先级高,数据库就把uuid整列都转换为nvarchar类型,然后再执行查询,这样的查询在数据量大的情况下就OVER了。
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
uniqueidentifier nvarchar(包括 nvarchar(max)) nchar varchar(包括 varchar(max)) char
nvarchar排在了varchar前面,nvarchar优先级高,数据库就把uuid整列都转换为nvarchar类型,然后再执行查询,这样的查询在数据量大的情况下就OVER了。
相关文章推荐
- jdbc中的Statement和PreparedStatement接口对象
- sql server 2005用户权限设置深入分析
- SQL Server 2005 DTS导入平面数据出现错误解决方案
- Access to SQLserver 数据库生迁脚本编写器(DB_CreateSqlEV1.06下载)
- SQL Server创建维护计划失败(SQL Server:14234 错误)的解决方法
- 我的服务器SQL2000的sqlserver占用了90%的cpu,怎么查是那个库?
- SqlServer 2005 T-SQL Query 学习笔记(3)
- 利用脚本自动安装SQLServer的实现步骤分析
- sqlserver FOR XML PATH 语句的应用
- sqlserver 手工实现差异备份的步骤
- SqlServer 扩展属性的介绍
- SqlServer提示“列前缀tempdb.无效: 未指定表名”问题解决方案
- sqlserver not in 语句使程充崩溃
- 数据库备份 SQLServer的备份和灾难恢复
- Windows下使用性能监视器监控SqlServer的常见指标
- sqlserver存储过程语法详解
- sqlserver 数据库日志备份和恢复步骤
- SQL Server中的Forwarded Record计数器影响IO性能的解决方法
- sqlserver 2000中创建用户的图文方法
- 解析如何在sqlserver代理中配置邮件会话