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 游标

 

敏感游标

敏感游标可以用于只读或可更新的游标类型。

这些游标具有敏感的成员资格、顺序和值。

标准

敏感游标对应于敏感游标的 ISO/ANSI 标准定义,并对应于 ODBC 动态游标。

编程接口
接口 游标类型 注释
ODBC、ADO/OLE DB 动态
嵌入式 SQL SENSITIVE 当不需要工作表并且 prefetch 选项设置为 Off 时,也响应 DYNAMIC SCROLL 游标请求而予以提供。
JDBC SENSITIVE iAnywhere JDBC 驱动程序完全支持敏感游标。
说明

敏感游标禁用预取。通过游标可看到所有更改,包括通过游标以及从其它事务做出的更改。如果隔离级别较高,则可能会因锁定而隐藏一些在其它事务中做出的更改。

对游标成员资格、顺序以及所有列值的更改都是可见的。例如,如果敏感游标包含连接,而且,修改了某个基础表的某个值,那么,由该基行组成的所有结果行都会显示新值。结果集成员资格和顺序可能会在每一次读取时更改。

敏感游标会始终返回与查询的选择标准匹配的行,返回顺序为任何 ORDER BY 子句指定的顺序。更新可能会影响结果集的成员资格、顺序和值。

敏感游标的要求会对敏感游标的实现施加限制:

  • 行不能被预取,因为对预取的行进行的更改通过游标将不可见。这可能会影响性能。

  • 敏感游标必须在没有构建任何工作表的情况下实现,这是因为如果行存储为工作表,则无法通过游标看到对这些行的更改。

  • 由于存在着不能有工作表这样的限制,所以优化器选择连接方法时也会受到限制,因而性能也可能会受到影响。

  • 对于某些查询,优化器不能构建不包括工作表并会使游标敏感的计划。

    工作表通常用于对中间结果进行排序和分组。如果行可以通过索引进行访问,那么排序就不需要工作表。虽然无法准确说明都有哪些查询会使用工作表,但以下查询肯定要使用工作表:

    • UNION 查询,虽然 UNION ALL 查询不一定使用工作表。

    • 带有 ORDER BY 子句的语句,如果在 ORDER BY 列上没有索引。

    • 任何使用散列连接优化的查询。

    • 许多涉及 DISTINCT 或 GROUP BY 子句的查询。

    在这些情况下,SQL Anywhere 或者会向应用程序返回错误,或者会将游标类型更改为敏感性未定型游标并返回警告。

    有关查询优化和工作表使用的详细信息,请参见查询优化与执行