预取和多行读取是不同的。预取可以在没有来自客户端应用程序的显式指令的情况下执行。预取会将行从服务器检索到客户端上的缓冲区中,但客户端应用程序要先读取相应的行,然后才能使用这些行。
缺省情况下,只要应用程序读取一行,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 语句获取值)。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |