Oracle 12c: arraysize会影响结果集么?

SQL*Plus中ArraySize的设置会影响结果集的数量么?先不要轻易说“NO”,我们来看看Jonathan Lewis最近一篇文章中披露的一个案例。

当确定的查询在arraysize改变的情况下,结果集的数量出现不同:

SQL> set transaction read only;

Transaction set.

SQL> set arraysize 1

SQL> select ...

...

541 rows selected.

SQL> set arraysize 4

SQL> select ...

...

599 rows selected.

SQL> set arraysize 10

SQL> select ...

...

620 rows selected.

SQL> set arraysize 32

SQL> select ...

...

616 rows selected.

从查询结果看,随着arraysize的不同,结果集的数量忽多忽少,这显然不科学,一定是BUG导致的。

在执行计划中,可以看到12c的主要的特殊之处在于:rowset 的出现。这是Oracle 12c中引入的一个新特性。

当然,对于每一个新特性,Oracle都会提供隐含参数去控制,我们可以通过设置 _rowsets_enable=false 去关闭这一新特性。

参考链接:

https://jonathanlewis.wordpress.com/2015/11/09/wrong-results/

Oracle Support很快响应这一问题并给出进一步的WorkAround,可以通过设置Event 10055的特定级别修复该问题:

event = "10055 trace name context forever, level 2097152"

这个Bug的补丁也很快被提供出来,大家可以通过MOS找到这个BUG的修复补丁:Bug 22173980 : WRONG RESULTS WHEN "_ROWSETS_ENABLED" = TRUE 。

其影响的范围是 12.1.0.1 和 12.1.0.2 。参考:Note 2079913.1 。对于CDB环境下,还有另外一个参数 _rowsets_cdb_view_enabled 与这一特性有关,必要时需要关闭这个特性。BUG 17016479 也值得参考。

公开的BUG信息指出,这个问题出现的原因在于:当HASH JOIN在RowSet之间进行多次处理时,在特定情况下,其索引(ridx)定位行有问题,导致返回的结果集出现错误。

Internal Problem Description
----------------------------
The failing query involved several nested loops on top of a hash join.The
hash join consumed rowsets from its two inputs and produced one row at a time for its parent.The top nested loops returned the rows to kpofcr, which returned rows=0 when the array fetch size was reached (the default was 15). After all the fetch functions returned, the release functions were called, in order to end the call.
In the release function of the hash join, after the child release was done, it restored the last row it returned to its parent.This involved a call to qesrSetupOneCtxRow to use a row in the rowset where it saved away the input rows.If the last row it returned happened to be the first row in the rowset,and the index (ridx) was set to 0,the release was incorrectly restoring the last row in the rowset instead of the first.This led to wrong results.

Internal Fix Description
------------------------
Modified the hash join release function to use the saved row index when the yet2finishrset_qerhjm flag is set, even if it is 0. That is,if it still has rows to process in the last rowset it received from the child, then the value stored in ridx is the last row that was returned to the parent.  Only in the case that it finished processing the input rowset (and yet2finishrset_qerhjm is false) will a value of 0 for ridx indicate that the last row returned was the last row in the last input rowset.

参考Jonathan和Mos的文档可以了解这个有趣的Bug。

文章转自数据和云公众号,原文链接

时间: 2024-09-27 04:42:06

Oracle 12c: arraysize会影响结果集么?的相关文章

Oracle 12C优化器的巨大变化,上生产必读(下)

在Oracle 12c数据库中,随着新的查询优化自适应方法的引入,还有对可用的统计信息的强化,优化器实现了一个巨大的飞跃.今天就让我们继续这个话题,一起来揭晓Oracle 12C其他的强大功能吧. 16 全局临时表上的会话级统计信息  全局临时表通常用于存储应用程序上下文中的中间结果.一个全局临时表的定义,是全系统中拥有适当权限的所有用户所共享的,但其数据永远是会话私有的.在全局临时表(必须是会话级临时表,PRESERVE ROWS ON COMMIT,提交时保留数据)上收集统计信息是行得通的:

Oracle 12c数据库优化器统计信息收集的最佳实践

Oracle 12c数据库优化器统计信息收集的最佳实践 转载自     沃趣科技(ID:woqutech)  作者         刘金龙(译) 原文链接   http://www.oracle.com/technetwork/database/bi-datawarehousing/twp-bp-for-stats-gather-12c-1967354.pdf 导  语 Oracle优化器会为SQL语句产生所有可能的访问路径(执行计划),然后从中选择一条COST值最低的执行路径,这个cost值是

BenchmarkSQL 测试Oracle 12c TPC-C 性能

使用BenchmarkSQL测试一下Oracle 12c的TPC-C性能,同时对比一下PostgreSQL 9.5的性能. 测试机: 3 * PCI-E SSD,逻辑卷条带,XFS,数据块对齐,16核开HT,256G内存. 12c安装,配置请参考 http://blog.163.com/digoal@126/blog/static/1638770402015112281556942/ http://blog.163.com/digoal@126/blog/static/1638770402015

oracle 12c R1 在线迁移数据文件、在线迁移表分区或者子分区例子

在线重定义数据文件: 在oracle 12c R1之前的版本中,如果在线移动数据文件需要将表空间或者数据文件离线,然后操作系统mv,recover后online数据文件或者表空间,在oracle 12c R1后可以直接在线重定义数据文件,这个过程用户可以进行查询.DML以及DDL的任务,另外数据文件也可以直接在存储设备间迁移,比如ASM到文件系统的相互迁移. SQL> select name from v$datafile; NAME ------------------------------

Oracle 12C Active Data Guard Far Sync 配置

Active Data Guard Far Sync是Oracle 12c的新功能(也称为Far Sync Standby),Far Sync功能的实现是通过在距离主库(Primary Database)相对较近的地点配置Far Sync实例,主库(Primary Database) 同步(synchronous)传输redo到Far Sync实例,然后Far Sync实例再将redo异步(asynchronous)传输到终端备库(Standby Database).这样既可以保证零数据丢失又可

Oracle 12C 执行计划提示TABLE ACCESS BY INDEX ROWID BATCHED

从Oracle 12C开始执行计划中可能会出现TABLE ACCESS BY INDEX ROWID BATCHED,官方的解释:TABLE ACCESS BY INDEX ROWID BATCHED:means that the database retrieves a few rowids from the index, and then attempts to access rows in block order to improve the clustering and reduce t

Oracle 12C优化器的巨大变化,上生产必读(上)

序言 优化器是Oracle数据库最吸引人的部件之一,因为它对每一个SQL语句的处理都必不可少.优化器为每个SQL语句确定最有效的执行计划,这是基于给定的查询的结构,可用的关于底层对象的统计信息,以及所有与优化器和执行相关的特性. 随着每个新版本的发布,优化器都会进化,利用新功能以及新的统计信息来生成更好的执行计划.随着对查询优化的新的自适应方法的引入,Oracle 12c数据库把这种进化更推上了一个台阶. 这份白皮书介绍了在Oracle 12c数据库中与优化器和统计相关的所有新特性并且提供了简单

《Oracle数据库管理与维护实战》——1.3 Oracle 12c新特性

1.3 Oracle 12c新特性 Oracle数据库管理与维护实战 纵观甲骨文全球大会和甲骨文公司的各种资讯,我们可以发现云计算和大数据是两个重要的主题,Oracle 12c则融合了这两大主题.与以往的Oracle数据库相比,Oracle 12c在16个方面进行了更新.本节将详细介绍Oracle 12c数据库中的16个新特性. 1.3.1 支持多线程模式 在Oracle 12c中,Oracle引入了多线程模式,允许在Windows平台之外的UNIX.Linux等系统使用多线程模式.结合多进程与

软件大会分享PPT:面向开发和DBA的Oracle 12c新特性

在2016年12月10日的『中国软件大会上』,我分享了一个主题:<面向开发人员和DBA的Oracle 12c新特性>,从安全的主题开始,以在线变更为主线,分享了Oracle 12c的一些新特性,尤其是12.2的部分新特性. 在这个主题中,12.2 的 lockdown profile 成为我的出发点,通过这一新的安全机制,Oracle 12c 的PDB权限得以被限制,可以防范PDB的高权限操作对全局产生影响. 而在12.2中PDB的Clone,可以在线进行,这是较12.1的又一大进步: Ora