服务器游标与本地游标

因为在神通数据库 ODBC驱动中,键集游标只能用于本地游标,因此下列讨论仅对动态游标和只进游标有效。

使用服务器游标时,查询执行的数据保留在服务器端,只有当应用程序调用SQLFetch或SQLFetchScroll提取数据时,ODBC驱动才需要向后端获取一个行集的数据。 与此相反,如果使用本地游标,查询执行完成后,服务器会把所有的数据发送到ODBC驱动。 因此,如果应用程序只需要获取结果集的部分行时,使用服务器游标可以减少网络传输的数据量,减少本地占用的内存,并提高查询执行的响应速度。

另一方面,使用服务器游标时,每次调用SQLFetch或SQLFetchScroll时,前后端都要进行一次交互,除了需要等到服务器回应外,还会给网络增加一些额外的交互信息流量。 而如果使用本地游标,所有的数据都已经存放在本地,所有的操作只需要ODBC驱动的参与,无需访问数据库服务器。 特别的,即时应用程序并不需要获取全部的结果集数据,但游标需要在结果集上频繁移动,且会多次落在相同行上时,使用服务器游标会导致重复地获取这些行的数据。 因此,如果应用程序需要获取全部的结果集或者会在结果集上重复移动游标,则使用本地游标反而可以减少网络流量;此外,使用本地游标可以提高获取并提取行集的响应速度。

简单而言,下列情况较适合使用服务器游标(动态游标和只进游标):

  • 应用程序只需要浏览结果集的部分数据(可以减少网络流量)
  • 结果集数据量极大且本地内存有限(可以减少本地需要的内存)
  • 需要减少最大响应延迟(可以将数据传输的时间分摊到每一次SQLFetch或SQLFetchScroll)

相对的,下列情况较适合使用本地游标(静态游标和键集游标):

  • 应用程序需要结果集的全部数据(可以减少交互次数)
  • 需要在相同的行上多次重复获取数据(可以减少数据的重复传输)
  • 需要减少平均响应延迟(所有的前后台交互都在查询执行时完成)

游标性能分析

神通数据库 ODBC中,只进游标比静态游标的性能要高一些;

使用键集游标时,需要在查询执行时获取所有的键集信息。 之后,当应用程序调用SQLFetch或SQLFetchScroll提取行集时,神通数据库 ODBC驱动会根据相应的键集信息从后端获取这些行的数据,这一步骤的网络数据流量是使用服务器游标时获取一个行集的网络流量两倍不到一些,但服务器端处理这个请求的cpu开销较大。 因此,键集游标的性能总是比服务器游标低。

一般而言,应用程序应该选择能够满足需要的最简单的游标。因此只有在需要游标的可写能力或敏感能力时,才应该使用键集游标;只有在需要游标的滚动能力时,才应该考虑可滚动的游标。