SQL SERVER SendStringParametersAsUnicode引起的问题

上周五碰到开发的请求协助解决数据预定程序中对单头等几个表检索数据时检索条件尾数是9的数据特别慢。第一时间想到的是否如下几个问题:

1、数据库相应数据最多;

2、数据表进行了分区,而相应数据落在的分区性能存在问题;

3、检索该批记录的会话很多;

但很快排除了以上几种可能,因为后续的调查由如下发现:

1、查询了相应数据,尾数0-9的数据几乎平均分布;

2、直接用SQLSERVER查询分析器查询速度很快;

到此大家基本都认为数据库不存在问题,但是如下的调查感觉又让人陷入了迷茫。在相同网段的其他服务器上建立了相应的用户、表、数据进行测试,发现程序取数据速度很快,和生产数据库的区别就是数据量,还有表结构(为了测试偷懒全部字段定义为VARCHAR,后来执行程序异常才迫不得已把部分字段改成了date)。虽然测试过程不严谨,但这又似乎能把问题的天平向数据库这边倾斜。

就这样周末测试摸索的一天很快过去了,家里的无线网络6块钱一小时开销也实在不小,周一一大早就来到公司,回归有限宽带的怀抱,但郁闷的生产库我们只有查询几个字段的权限,我动不了。于是联络上游数据单位,盘算着通过看执行日志等手段把问题范围进一步缩小,而要对方配合却要工作联系单。想想还是先花半天时间有把我们这边的问题可能性全部扫除了才开这个联系单。

如何进一步缩小差距, 接下来来看看网络是否有问题,巧的是数据库服务器IP末尾是9,而恰恰是末尾为9的数据,为了排除该问题,进行了一系列的探索:

1、更换测试数据库服务器,发现取数据速度正常;

2、在测试程序客户段增加HOST映射,但取数据速度依旧;

3、在同一网段服务器部署测试程序。

以上三种测试均表明网络异常的可能性越来越小,至少在我们IDC和分中心内网之间的网络互联是正常的。

再镇定想想数据库查询为什么慢,只有三个层面的原因,数据库本身的性能问题、网络问题、客户端问题,而当今问题最多的无疑就是客户端程序异常,既然生产数据库无法做有效的调试,那么我们得把我们的问题尽量扫除。

于是请开发部的侯文杰把相关代码的时间戳进一步细化,文杰几分钟内就提供了代码,立即上传测试发现在ps = conn.prepareStatement和ps.setString效率上均没有问题,而rs = ps.executeQuery();就是罪会祸首。

再来仔细审视数据,一个念头突然闪现,既然SQLSERVER客户端查询正常,会不会是程序组装的SQL存在问题。于是立即要求文杰给我一个测试任意SQL语句的接口,通过这个接口,我可以随心所欲的测试cout(*),like等语句的性能(悲剧的是很长时间没有碰代码,我的开发环境已经无法运行)。一个小时后我得到了这个接口,接下来发现了令人兴奋的结果:

我自己组装的一条完整的SQL语句通过程序装载后执行迅速,而另外一条通过JDBC SETSTRING组装的同样的SQL语句,竟然还是出奇的慢。

时间: 2024-12-18 23:21:23

SQL SERVER SendStringParametersAsUnicode引起的问题的相关文章

SQL Server 2008处理隐式数据类型转换在执行计划中的增强

什么是隐式http://www.aliyun.com/zixun/aggregation/18278.html">数据类型转换: 当我们在语句的where 条件等式的左右提供了不同数据类型的列或者变量,SQL Server在处理等式之前,将其中一端的数据转换成跟另一端数值的数据类型一致,这个过程叫做隐式数据类型转换. 比如 char(50)=varchar(50), char(50)=nchar(50), int=float, int=char(20) 这些where 条件的等式都会触发隐

如何用asp把sql server數據轉化為execl文件

server 1.ASP文件: <%@ LANGUAGE="VBSCRIPT" %><%option explicit%><%'EXAMPLE AS:把数据库中一个每天24小时在线人数放到一个EXCEL文件中去'AUTHOR :钢铁工人'EMAIL :hello_hhb@21cn.com'DATE :2001-3-25'TEST :在NT4,SP6,SQL SERVER 7.0,EXCEL2000中测试通过%><HTML><HEAD

.NET和SQL Server中“空值”辨析

server 初学数据库编程我们可能会有一些对"空值"的疑问,比如通过编程新建的一个表中所有数据皆显示为<NULL>,手动添加并删除文字后又变成了空白:一个字符串类型的字段,明明没有填值,却不等于"":用ADO.NET从数据库中取值,每遇到有<NULL>的就出错--这需要我们正确认识.NET和SQL Server中几种不同的"空值".1.真正的空值,也就是"没有输入的值",可以出现在大多数类型的字段中(

SQL Server 2008安装的时提示“重启计算机失败”怎么办?

详细出错信息如下: RebootRequiredCheck 检查是否需要挂起计算机重新启动.挂起重新启动会导致安装程序失败. 失败 需要重新启动计算机.必须重新启动计算机才能安装 SQL Server 出问题后我在网上找的解决方法如下: a .重启机器,再进行安装,如果发现还有该错误,请按下面步骤b.在开始->运行中输入regeditc.到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\d.在右边窗口右击Pe

Sql Server实现自定义拆分字符串函数Split()

经常我们要用到批量操作时都会用到字符串的拆分,郁闷的是SQL Server中却没有自带Split函数,所以我们只能自己动手来解决一下.为了减少和数据库的通讯次数,我们都会利用这种方法来实现批量操作.当然有时我们会借助Execute这个方法来实现,利用这个方法有一个不好的地方就是她只认识以","分割的字符串,在传IDs批量操作的时候还是可以达到目的,但是经常我们要用到更复杂的操作时我们就需要自己动手来完成了...... 1.当我们需要传入很长的字符串是我们可以借助NText和Text类型

恢复整个SQL server数据库还是只恢复错误文件组

这有一个具体例子:如果你有一个单个的出现问题的文件.这个文件有50MB大小,而你的整个数据库 运行着大约有几十亿的字节,这样的话如果能恢复单个失败文件的话就显的非常有意义.这样的事情发生 的一个情景是当文件或者文件组在单独的驱动器上,而驱动器出现了问题.通常,仅仅恢复单个文件或者 文件组会使总的停止时间缩短,因为它明显减少了需要恢复的总的数据量. 现在,为什么你不选择这么做呢?这有一些原因: 你需要有事务日志备份.如果你想从备份中恢复一个文件或者文件组,你同时也需要恢复与它们一起 创建的事务记录

使用SQL Server 2000将现有代码作为Web服务提供

    一.简介 Microsoft SQL Server 2000的 XML功能可以简化将现有代码作为 Web服务提供的任务.本文集中讨论了传入和传出 Transact SQL代码的数据与 XML消息(在 Web服务客户机和服务器之间使用)之间的转换. 二.SQL Server 2000中的现有代码 SQL Server 2000的 XML功能简化了将现有 Transact SQL代码作为 Web服务提供的过程.这依赖于 SQL Server 2000中的两项 XML功能: 1.对 Trans

SQL Server Replication 中关于视图的点滴

    在服务器A数据库TEST新建了一个本地发布(Local Publications)RPL_GES_MIS_TEST,在服务器B数据库RPL_TEST上创建了一个本地订阅(Local Subscriptions),它订阅了了这个发布RPL_GES_MIS_TEST.如下截图所示,本地发布只有DB_OBJECTS .Location两个表 假设现在有一个需求,我们需要同步一个视图V_DB_OBJECTS(当然实际情况应该比这个复杂,有可能视图是多个表关联,测试场景我们先简化一下),视图代码如

SQL Server BI Step by Step SSIS 4

本文配套源码 上次我们并没有实现Excel中的数据与数据库中的数据进行整合,存在即更新,不存在即插入.这次主要 介绍几种方法来实现: 1.使用Lookup 2.使用execute SQL task调用存储过程 3. 使用script component脚本实现 4.使用MERGE 语句(SQL SERVER 2008) 5.使用上次我们 用到的Merge来实现 6.使用第三方组件SCD Component 看起来能够实现的方法确实不少, 我们来一一介绍,介绍的同时也会介绍一些组件的应用,同理在我