Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - 编程 » 使用 SQL Anywhere 编程简介 » 在应用程序中使用 SQL » SQL Anywhere 游标 » 游标敏感性和性能

 

预取行

预取和多行读取是不同的。预取可以在没有来自客户端应用程序的显式指令的情况下执行。预取会将行从服务器检索到客户端上的缓冲区中,但客户端应用程序要先读取相应的行,然后才能使用这些行。

缺省情况下,只要应用程序读取一行,SQL Anywhere 客户端库就会预取多行。SQL Anywhere 客户端库会将其余的行存储在缓冲区中。

预取会通过减少客户端/服务器端通信的往返次数而提高性能,并且不用为每一行或行块向服务器发送单独的请求,就可以让许多行可供使用,因而可提高吞吐量。

有关控制预取的详细信息,请参见prefetch 选项 [数据库]

控制应用程序的预取
  • prefetch 选项可以控制是否发生预取。可将单个连接的 prefetch 选项设为 Always、Conditional 或 Off。缺省情况下,它被设置为 Conditional。

  • 在嵌入式 SQL 中,当您使用 BLOCK 子句打开单个 FETCH 操作上的游标时,您可以针对每个游标控制预取。

    应用程序可通过指定 BLOCK 子句来指定从服务器读取一次最多可以包含多少行。例如,如果一次读取并显示 5 行,则可以使用 BLOCK 5;如果指定 BLOCK 0,一次就会读取 1 个记录,并且会使 FETCH RELATIVE 0 总是从服务器重复读取行。

    虽然您还可以通过在应用程序上设置连接参数来将预取关闭,但是指定 BLOCK 0 比将 prefetch 选项设置为 Off 效率更高。请参见prefetch 选项 [数据库]

  • 缺省情况下,预取对于值敏感型游标是禁用的。

  • 在 Open Client 中,您可以在声明游标之后(但要在打开它之前)使用 ct_cursor 并使用 CS_CURSOR_ROWS 来控制预取行为。

在可能有助于提高性能的情况下,预取会动态增加预取的行数。这包括符合以下条件的游标:

  • 使用一种支持的游标类型:

    • ODBC 和 OLE DB   FORWARD-ONLY 和 READ-ONLY(缺省)游标

    • 嵌入式 SQL   DYNAMIC SCROLL(缺省)、NO SCROLL 和 INSENSITIVE 游标

    • ADO.NET   所有游标

  • 只执行 FETCH NEXT 操作(无绝对读取、相对读取或向后读取)。

  • 应用程序不会在两次读取之间更改主机变量类型,也不使用 GET DATA 语句按块获取列数据(支持使用一个 GET DATA 语句获取值)。