|
i5服务器中内置的DB2数据库敏感性游标敏感性定义 游标敏感性指的是一种游标设置,它定义游标所返回的结果集是否将包括基本表上的最新更改。例如,“SELECT * FROM orders”所声明的敏感游标将返回当前的所有订单,以及打开游标之后插入数据库的新订单。例如,如果打开一个敏感游标时有六份订单,而在打开该游标之后,另一应用程序又插入了两份新订单,那么敏感游标将会设法在其结果集中包含所有的八份订单(见表 1)。表 2 中显示了同一应用程序场景中,不敏感游标所返回的结果集内容。 表 1. 敏感游标的结果集
表 2. 不敏感游标的结果集
显然,游标敏感性设置需要影响查询优化器所创建的访问计划。敏感游标的访问计划不能包含复制表数据的算法或数据访问技术。例如,哈希(hash)表常常用于连接和分组查询的实现中,但是,因为它们包含了表数据的副本,所以无法用于实现敏感查询的实现中。 因为游标敏感性和查询优化器直接关联,所以 V5R2 中最近增强了 IBM® Universal Database(UDB)™ for iSeries™ 的游标敏感性支持。V5R2 包括了查询优化增强,导致在优化器中使用更多复制表数据的算法 -- 最后结果是使用比以前版本少的游标返回敏感结果集。为了解决该问题,DB2 UDB for iSeries 编程接口得到了增强,使得应用程序开发人员对游标敏感性设置具有更大控制。 敏感性设置 通过最新的增强集,iSeries 应用程序开发人员现在无论是使用 JDBC™、ODBC,还是 OLE DB,都可以指定下面所定义的三种游标敏感性设置。只要通过对每个中间件产品应用最新的 V5R2 补丁(可在 ibm.com/iseries/support上在线获得),就可以获得这些敏感性增强。 ASENSITIVE SENSITIVE INSENSITIVE 在以前的版本中,应用程序开发人员可以指定 INSENSITIVE 游标设置,或者仅使用默认的 ASENSITIVE 敏感性设置。没有强迫使用 Sensitive 游标的简单方法。开发人员的惟一选择就是使该游标成为可更新的,或者为 ALWCPYDTA 预编译器选项指定 *NO。但是,这两种选择都有不良的副作用。可更新的游标通常要慢一些,因为在处理表时必须获得附加的行锁。如果只能通过复制数据来实现游标定义,那么 ALWCPYDTA(*NO) 可能会导致打开游标失败。 性能和查询优化影响ASENSITIVE 的默认设置是最好的执行选项,因为在确定实现查询的最好方法时,它允许查询优化器使用其完整的算法集。利用复制数据的算法(例如,哈希法)可以极大地改善性能和其他查询,这些查询的性能在避免了数据复制时会更好。ASENSITIVE 设置使查询优化器可自由地选择最好的执行方法。SENSITIVE 和 INSENSITVE 游标设置可以迫使优化器执行某种计划,这种计划从性能观点来看并不是最佳的。而 SENSITIVE 设置则使优化器不再使用临时数据副本,这也将阻止并行处理,因为 DB2 对称多处理机(DB2 Symmetric MultiProcessing,DB2 SMP)的特性需要复制表数据。INSENSITIVE 设置将强制复制表数据,而不管是否有助于提高性能。因此, 只有当应用程序肯定需要相关的游标行为时,才使用 INSENSITIVE 和 SENSITIVE 游标设置。 敏感性编程接口下面几小节介绍了有关如何用 iSeries 集成的中间件控制游标敏感性设置的编程细节。请注意,当在连接级别上控制游标敏感性时,敏感性将应用到该连接内打开的所有游标上。这意味着如果 SENSITIVE 是连接级别的设置,数据库管理器就必须能够将该连接内的所有游标实现为敏感游标。否则,将返回错误。 注意,通常将可更新的游标实现为 SENSITIVE 游标,因此,以下描述将忽略可更新游标的敏感性设置。 iSeries 访问ODBC 驱动程序 对于 ODBC 驱动程序,可以用 SQLSetStmtAttr API 中的 SQL_ATTR_CURSOR_SENSITIVITY 属性在单个游标级别上控制敏感性。应注意的是,ODBC 规范不支持值 Asensitive;而是在 SQLSetStmtAttr API 中使用值 Unspecified 来指定 Asensitive 游标敏感性行为。 可以在连接级别上用下列值指定 CURSORSENSITIVTY 连接关键字来控制游标敏感性设置。
静态游标总是为 Insensitive 的。敏感性设置仅应用于动态和只能向前移动的(forward only)游标。 下面的 ODBC 代码片断展示了如何在连接级别上用 CURSORSENSITIVITY 连接关键字,以及在语句级别上用 SQLSetStmtAttr API 控制游标敏感性。在使用 SQLSetStmtAttr API 更改属性时,更改诸如游标类型这样的游标属性还可能导致更改敏感性设置。ODBC 规范中记载了这些敏感性设置的间接更改。 ODBC 代码示例
OLE DB 提供者仅支持在连接级别上用连接属性“Cursor Sensitivity”控制游标敏感性(Cursor Sensitivity)。连接属性值与 ODBC 连接关键字相同。在打开连接之后,就不能更改这个新的连接属性了。 下面的代码示例展示了如何通过连接串或 Properties 方法设置新的连接属性。 OLE DB 代码示例
Toolbox JDBC 驱动程序 Toolbox JDBC 驱动程序也具有“Cursor sensitivity”连接属性,该属性支持以下属性值:asensitive、sensitive 和 insensitive。 连接属性值 sensitive 仅用于通过结果集类型(resultSetType)TYPE_SCROLL_SENSITIVE 所声明的游标。通过结果集类型 TYPE_SCROLL_SENSITIVE 所声明的游标将默认地实现为 ASENSITIVE。为了将带有结果集类型 TYPE_SCROLL_SENSITIVE 的游标实现为 SENSITIVE 游标,必须指定“sensitive”连接属性。 不敏感的(insensitive)游标是通过为结果集类型(resultSetType)指定 TYPE_SCROLL_INSENSITIVE 而定义的。只有在用结果集类型 TYPE_FORWARD_ONLY 声明游标时,才指定连接属性值 insensitive。通常将 TYPE_FORWARD_ONLY 游标实现为 ASENSITIVE,除非指定连接属性值 insensitive。 下面的 JDBC 代码示例展示了如何用新的连接属性指定敏感的游标设置。 JDBC 代码示例
嵌入式 SQL DB2 UDB for iSeries 的下一版本将包含在 DECLARE CURSOR 语句上指定三种游标敏感性设置的功能。当前的 V5R2 支持仅允许默认的 ASENSITIVE 设置,或选择一个 INSENSITIVE 游标定义。如果您极其需要在 V5R2 上获得该支持,请发送一封 email 到 rchudb@us.ibm.com,以便检查是否有可用的补丁。 (责任编辑:城尘) 责编: 微信扫一扫实时了解行业动态 微信扫一扫分享本文给好友 著作权声明:畅享网文章著作权分属畅享网、网友和合作伙伴,部分非原创文章作者信息可能有所缺失,如需补充或修改请与我们联系,工作人员会在1个工作日内配合处理。
|
最新专题 推荐圈子 |
|