对JDBC selectMethod = cursor的SQL 2000性能的影响

( 首先发布在SO上 ,但是没有得到任何答案,交叉发布到达更多的观众,因为它是交叉的。)

在尝试帮助一个在SQL 2000服务器上出现性能问题的应用开发团队的过程中,我运行了一个SQL跟踪,发现所有对数据库的调用都充满了API服务器游标语句(sp_cursorprepexec,sp_cursorfetch,sp_cursorclose)。

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

当API游标属性或属性设置为默认值以外的其他值时,SQL Server的OLE DB提供程序和SQL Server ODBC驱动程序将使用API​​服务器游标而不是默认结果集。 对获取行的API函数的每次调用都会生成到服务器的往返行,以从API服务器游标中获取行。

更新 :他们有多个Java应用程序使用指定的selectMethod=cursor与SQL服务器的JDBC连接(而不是selectMethod=direct )。

从我的数据库pipe理员angular度来看,这只是令人厌烦的事情(它使无用的垃圾变得杂乱无章),很可能导致许多额外的应用程序到SQL服务器往返,从而降低整体性能。

他们显然已经以非常有限的方式testing了selectMethod=direct (仅仅改变了大约60个应用程序中的一个),并且遇到了某些问题(我没有的技术细节)。

所以,我的问题是:

  • 在已经很忙的SQL 2000服务器上selectMethod=cursor vs direct对性能的影响是什么? (我曾经推测,增加SQL和APP服务器之间的往返次数是无济于事的,我错了吗?)
  • selectMethod是一个应用程序透明设置吗? 如果我们改变它,可以打破他们的应用程序?
  • 什么时候应该使用cursordirect ? 是否有某种types的应用程序可以从一个应用程序中受益?

更新 :find了驱动程序参数的名称,这些参数对标题,正文和标签进行了重大修改。

更新 :增加赏金。 还增加了赏金SO问题(这是更侧重于应用程序的行为)。 谢谢!

简单地说,

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

综上所述,

  • 可以使用selectMethod=cursor降低应用程序的性能? – 任何一种方法都会因为不同的原因而降低性能。 通过一定的结果集大小, cursor可能仍然是可取的。 请参阅下面的时间使用一个或另一个
  • selectMethod= JDBC连接上的应用程序透明设置? – 它是透明的,但是如果内存使用量增长到足以占用客户端系统(和相应的服务器)或使客户端崩溃,它仍然可能会中断应用程序
  • 更一般地说,什么时候应该使用cursordirect – 我个人使用cursor处理潜在的大或无限的结果集。 在给定足够大的批处理大小的情况下,往返开销将被分摊,并且我的客户机内存占用空间是可预测的。 我direct使用的结果集的大小,我期望已知是劣于无论我使用cursor批量大小,或以某种方式绑定,或内存不是问题。

干杯,五