JDBC连接到非常繁忙的SQL 2000:selectMethod = cursor vs selectMethod = direct?

时间:2010-09-01 22:13:35

标签: jdbc sql-server-2000 cursor selectmethod

在尝试帮助应用开发团队在SQL 2000服务器(来自单独的应用服务器上的一堆Java应用程序)上遇到性能问题的过程中,我运行了一条SQL跟踪并发现所有对数据库的调用都是完整的API Server Cursor语句(sp_cursorprepexec,sp_cursorfetch,sp_cursorclose)。

看起来他们正在指定一些强制使用服务器端游标的连接字符串属性,一次只检索128行数据:(来自http://msdn.microsoft.com/en-us/library/Aa172588

  

当API游标属性或   属性设置为其他任何属性   比它们的默认值,OLE DB   SQL Server和SQL的提供程序   Server ODBC驱动程序使用API​​服务器   游标而不是默认结果   集。每次调用API函数   获取行生成一个   往返服务器获取   来自API服务器游标的行。

UPDATE :有争议的连接字符串是JDBC连接字符串参数selectMethod=cursor(它启用了我们上面讨论的服务器端游标)与替代selectMethod=direct。他们一直使用selectMethod=cursor作为所有应用的标准连接字符串。

从我的DBA角度来看,这只是令人讨厌(它使用无用的垃圾混乱了跟踪),并且(我推测)会导致许多额外的应用程序到SQL服务器往返,从而降低整体性能。

他们显然测试了改变(只有60个不同的应用程序连接中的一个)到selectMethod=direct,但遇到了一些问题(我没有详细说明),并担心应用程序崩溃。

所以,我的问题是:

  • 可以使用selectMethod=cursor较低的应用程序性能,正如我试图争论的那样? (通过增加已经具有非常高查询/秒的SQL服务器上所需的往返次数)
  • selectMethod=是JDBC连接上的应用程序透明设置吗?如果我们改变它,这会打破他们的应用吗?
  • 更一般地说,您应该何时使用cursor vs direct

cross-posted to SF

编辑:收到实际技术详情,保证对标题,问题和标签进行重大修改。

编辑:添加了赏金。还为SF问题添加了赏金(这个问题主要关注应用程序行为,SF问题主要集中在SQL性能上。)谢谢!!

2 个答案:

答案 0 :(得分:12)

简言之,

  1. selectMethod=cursor
    • 理论上需要more server-side resources而不是selectMethod=direct
    • 一次只能将批量大小记录加载到客户端内存中,从而产生更可预测的客户端内存占用
  2. selectMethod=direct
    • 理论上需要比selectMethod=cursor
    • 更少的服务器端资源
    • 将在客户端应用程序迭代之前将整个结果集读入客户端内存(除非驱动程序本身支持异步结果集检索); 可以通过两种方式降低性能
      1. 使用大型结果集降低性能如果客户端应用程序的编写方式是在遍历结果集的一小部分后停止处理(direct它已经支付了检索数据的成本,它将会基本上扔掉;用cursor浪费最多限制在批量大小 - 1行 - 提前终止条件应该在SQL中重新编码,例如SELECT TOP或窗口功能)
      2. 由于潜在的垃圾收集和/或与内存占用增加相关的内存不足问题,
      3. 大型结果集降低了性能
  3. 总之,

    • 可以使用selectMethod=cursor较低的应用程序性能吗? - 任何一种方法都会因性能不同而降低性能。超过某个结果集大小,cursor可能仍然更可取。请参阅下文,了解何时使用其中一个
    • selectMethod=是JDBC连接上的应用程序透明设置吗? - 它是透明的,但如果内存使用量增长到足以占用其客户端系统,它仍会破坏其应用程序(相应地,你的服务器)或完全崩溃客户端
    • 更一般地说,您应该何时使用cursor vs direct - 我在处理潜在的大型或其他无限制结果集时会亲自使用cursor。然后,给定足够大的批量大小,可以分摊往返开销,并且我的客户端内存占用量是可预测的。当我所期望的结果集的大小已知不如我使用direct的任何批量大小,或以某种方式绑定,或者当内存不是问题时,我使用cursor

答案 1 :(得分:0)

使用selectMethod=cursor可以防止SQL Server使用Parallel Query Processing,这会对性能产生很大影响,例如:

  • 你有很多CPU核心(谁没有?)
  • 您已通过分区表优化数据库
  • 您正在运行大量汇总查询(sum()count()等。)

最后,Microsoft states以下内容:

  

selectMethod=direct )在应用程序处理所有行时提供最快的性能。

你一定要试着看看设置selectMethod = direct是否会对你产生影响。