当前位置: 首页 > 面试题库 >

为什么与JDBC 4.0相比,Microsoft SQL Server 2012查询需要几分钟的时间,而在Management Studio中却需要秒?

刘海
2023-03-14
问题内容

我正在[ResultSet](http://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html)从远程Microsoft
SQL Server 2012到使用Microsoft JDBC Driver 4.0的Java客户端检索相对较大的内容时,显然正在处理性能问题。

当我在远程服务器的Microsoft SQL Server Management
Studio上运行相应的查询时,它返回大约。几乎瞬间达到220k行。当我从客户端发出相同的查询时,它停顿了。使用较早版本的数据库(大约只有)的客户端,相同的测试也可以正常工作。400行合格。

我试图通过附加;responseBuffering=adaptive"到传递给的URL
来解决此问题DriverManager.getConnection()。建立连接后,我在的结果中看到了此属性(还有其他几个属性)connection.getMetaData().getURL(),但是[
connection.getClientInfo(responseBuffering)返回null,并且客户端仍然处于停止状态。

这里可能出了什么问题,以及如何指示Microsoft SQL
Server(不仅以Java编程方式向其提出建议),它必须以较小的块而不是一次全部返回行,或者通过其他一些措施来缩短JDBC查询时间。

另外两个观察似乎有些奇怪,也许完全指向不同的根本原因:

  • 当客户端停止运行时,它仍然仅显示相对较轻的CPU负载,这与我对大量垃圾收集的预期不同
  • “responseBuffering =自适应”应在正常默认由现在

更新
我已经检查过,发现从我的情况下切换PreparedStatementStatement并不能改善任何情况(在其他情况下显然可以提供帮助)。

更新 这是我当前的查询:

select 
    PARENT.IDENTIFIER    as PARENT_IDENTIFIER,
    PARENT.CLASS         as PARENT_CLASS,
    CHILD.TYPE           as CHILD_TYPE,
    CHILD.IDENTIFIER     as CHILD_IDENTIFIER,
    PROPERTY.IDENTIFIER  as PROPERTY_IDENTIFIER,
    PROPERTY.DESCRIPTION as PROPERTY_DESCRIPTION,
    PROPERTY.TYPE        as PROPERTY_TYPE,
    PROPERTY.PP          as PROPERTY_PP,
    PROPERTY.STATUS      as PROPERTY_STATUS,
    PROPERTY.TARGET      as PROPERTY_TARGET -- a date
from
    OBJECTS as CHILD
    left outer join RELATIONS              on RELATIONS.CHILD = CHILD.IDENTIFIER
    left outer join OBJECTS    as PARENT   on RELATIONS.PARENT = PARENT.IDENTIFIER
    inner join      PROPERTIES as PROPERTY on PROPERTY.OBJECT = CHILD.IDENTIFIER
where
    PROPERTY.TARGET is not null
order by
    case when PARENT.IDENTIFIER is null then 1 else 0 end,
    PARENT.IDENTIFIER,
    CHILD.IDENTIFIER,
    PROPERTY.TARGET,
    PROPERTY.IDENTIFIER

问题答案:

自适应缓冲是一个很好的答案。我还建议您SET通过SQL Server Profiler 检查连接的选项。

开始跟踪时,请确保ExistingConnections已选择。比较来自JDBC连接和SSMS连接的SPID。
ARITHABORT想到的是,我所看到的会导致SSMS和JDBC驱动程序之间的性能差异。Microsoft在这里简短地提到了它:http : //msdn.microsoft.com/en-
us/library/ms190306.aspx。在此处堆栈交换信息:https :
//dba.stackexchange.com/questions/9840/why-would-set-arithabort-on-
dramatically-speed-up-a-
query

在Oracle上,通过setFetchSizeStatement/
PreparedStatement对象上使用该方法,我看到了巨大的影响。显然,SQL
Server驱动程序不支持该方法。但是,驱动程序中有一个内部方法。有关详细信息,请参见使用JDBC驱动程序在SQLServer中设置默认行预取。

另外,您在while (rs.next())循环中做什么?除了阅读专栏外,请尝试进行其他操作,例如rs.getInt(1)。走着瞧吧。如果一切顺利,则表明瓶颈在于您以前对结果集的处理。如果仍然很慢,则问题必须出在驱动程序或数据库中。

您可以使用SQL Server
Profiler比较通过JDBC和通过SSMS运行的执行。比较CPU,读取,写入和持续时间。如果它们不同,则执行计划可能会有所不同,这使我回到我提到的第一件事:SET选项。



 类似资料:
  • 问题内容: 如果函数需要修改在全局范围内声明的变量,则需要使用全局声明。但是,如果函数只需要读取全局变量,则可以不使用全局声明而这样做: 我的问题是关于Python的设计的:为什么Python被设计为允许在不使用全局声明的情况下读取全局变量?也就是说,为什么只强制分配具有全局性,为什么不强制全局读取呢?(这将使它变得均匀而优雅。) 注意:我可以看到在读取时没有歧义,但是在分配时并不清楚是否打算创建

  • 我收集了大约75000份文件。 数据库的总大小约为45GB 在75k个文档中,约45k个文档的大小分别为900 KB(约42 GB),其余文档的大小分别约为120 KB。 每个文档都映射到其他集合中的ObjectId,并具有一个,两者都已索引。 现在,我需要获取上个月特定客户ID的文档。数量约为5500份文件。这个custId包含大小约为120 KB的小文档。 以下是我的查询: 不过,查询需要2分

  • 我想使用而不是,并重构了以下代码: 这个(版本2): 两者都返回相同的元素。然而,我怀疑我是否真的应该用的更详细的代码替换我所有的。为什么我需要在mapMuli(

  • 我一直在寻找答案,但我没有找到它,我需要在我继续我的测试之前弄明白。 我正在通过安装bash创建一个基于Alpine的映像,如下图所示: Hello.sh 我可以在不向docker-compose.yml添加的情况下访问,所以Alpine的映像中一定有我不理解和希望理解的东西。

  • 问题内容: 我可以将数据发送到服务器,但是只有在使用FromBody-Attribute时才可以。 为什么无法使用Post从主体自动读取json数据? 后端Web API 前端angularjs 问题答案: 仅因为某事是POST请求,所以没有明确的规则如何传递参数。POST请求仍可以包含URL中编码的查询参数。方法参数应该是“简单”类型(字符串,整数等)的查询参数。 通常,复杂类型应该是POST表

  • 问题内容: 我对JAX-WS进行了概述,并注意到了(和)的一些引用。 在什么情况下需要?(我认为JSR 109服务器?!) 问题答案: 是使用SUN的参考实现将Web服务作为标准存档部署在非Java EE5 Servlet容器上时所需的专有部署描述符。 Sun的RI 用作servlet上下文事件的侦听器和调度程序servlet。两者都必须在中声明。然后需要该文件为定义Web服务端点,以使其知道必须