( 首先发布在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个应用程序中的一个),并且遇到了某些问题(我没有的技术细节)。
所以,我的问题是:
selectMethod=cursor vs direct对性能的影响是什么? (我曾经推测,增加SQL和APP服务器之间的往返次数是无济于事的,我错了吗?) selectMethod是一个应用程序透明设置吗? 如果我们改变它,可以打破他们的应用程序? cursor与direct ? 是否有某种types的应用程序可以从一个应用程序中受益? 更新 :find了驱动程序参数的名称,这些参数对标题,正文和标签进行了重大修改。
更新 :增加赏金。 还增加了赏金SO问题(这是更侧重于应用程序的行为)。 谢谢!
简单地说,
selectMethod=cursor
selectMethod=direct需要更多的服务器端资源 selectMethod=direct
selectMethod=cursor需要更less的服务器端资源 direct它已经支付了检索数据的成本,它将基本上丢弃;用cursor浪费限制在最多批量 – 1行 – 早期的终止条件应该可能在SQL中被重新编码,例如SELECT TOP或窗口函数) 综上所述,
selectMethod=cursor降低应用程序的性能? – 任何一种方法都会因为不同的原因而降低性能。 通过一定的结果集大小, cursor可能仍然是可取的。 请参阅下面的时间使用一个或另一个 selectMethod= JDBC连接上的应用程序透明设置? – 它是透明的,但是如果内存使用量增长到足以占用客户端系统(和相应的服务器)或使客户端崩溃,它仍然可能会中断应用程序 cursor与direct ? – 我个人使用cursor处理潜在的大或无限的结果集。 在给定足够大的批处理大小的情况下,往返开销将被分摊,并且我的客户机内存占用空间是可预测的。 我direct使用的结果集的大小,我期望已知是劣于无论我使用cursor批量大小,或以某种方式绑定,或内存不是问题。 干杯,五