【发布时间】:2010-09-01 22:13:34
【问题描述】:
在尝试帮助一个应用程序开发团队解决 SQL 2000 服务器上的性能问题(来自不同应用程序服务器上的一堆 Java 应用程序)的过程中,我运行了 SQL 跟踪并发现对数据库的所有调用都是充满 API 服务器游标语句(sp_cursorprepexec、sp_cursorfetch、sp_cursorclose)。
看起来他们正在指定一些强制使用服务器端游标的连接字符串属性,一次只能检索 128 行数据:(来自 http://msdn.microsoft.com/en-us/library/Aa172588)
当 API 游标属性或 属性设置为任何其他 比他们的默认值,OLE DB SQL Server 和 SQL 的提供程序 服务器 ODBC 驱动程序使用 API 服务器 游标而不是默认结果 套。对 API 函数的每次调用 获取行生成一个 往返服务器以获取 API 服务器游标中的行。
更新:有争议的连接字符串是一个 JDBC 连接字符串参数,selectMethod=cursor(它启用了我们上面讨论的服务器端游标)与替代selectMethod=direct。他们一直使用selectMethod=cursor 作为所有应用程序的标准连接字符串。
从我的 DBA 角度来看,这很烦人(它用无用的垃圾使跟踪变得混乱),并且(我推测)会导致许多额外的应用程序到 SQL 服务器往返,从而降低整体性能。
他们显然确实测试了更改(只是大约 60 个不同的应用程序连接之一)到 selectMethod=direct,但遇到了一些问题(我没有详细信息)并且担心应用程序会中断。
所以,我的问题是:
- 可以使用
selectMethod=cursor降低应用程序性能,正如我试图争论的那样? (通过增加每秒查询次数非常高的 SQL 服务器上所需的往返次数) -
selectMethod=是 JDBC 连接上的应用程序透明设置吗?如果我们改变它,这会破坏他们的应用程序吗? - 更一般地说,什么时候应该使用
cursor和direct?
编辑:收到需要对标题、问题和标签进行重大编辑的实际技术细节。
编辑:增加了赏金。还为 SF 问题添加了赏金(此问题侧重于应用程序行为,SF 问题侧重于 SQL 性能。)谢谢!!
【问题讨论】:
-
IIRC,你是对的。不过,这看起来确实像一个 ServerFault 问题,也是一个 SO 问题。你也可以在sqlservercentral.com 上提问。
-
我已经在 twitter 的 #sqlhelp 标签上提到了它。那里也没有咬人。我认为跨多个 SO 站点交叉发布问题被认为是不好的形式,对吧?
-
我最好的猜测是他们应该尝试一下。也许他们有 UnitTests,他们可以使用更改的连接字符串(或一个小测试应用程序)对数据库触发。
-
我不明白为什么会这样,而且 Q 一直被交叉发布——尤其是当它们从一个站点“审核”到另一个站点时,剩下 2 个副本。如果您在一个站点上获得了好的答案,请务必链接回另一个站点(以帮助未来的搜索者)。
标签: jdbc sql-server-2000 database-cursor selectmethod