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。

原文发布于微信公众号 - 数据和云(OraNews)

原文发表时间:2015-11-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据和云

时过境迁:Oracle跨平台迁移之XTTS方案与实践

作者简介 ? 谢金融 云和恩墨东区交付部 Oracle 工程师,多年来从事 Oracle 第三方服务,曾服务过金融、制造业、物流、政府等许多行业的客户,精通数据...

56910
来自专栏Java架构解析

mysql关于ibdata文件的理解

1、默认情况下ibdata存放InnoDB表(InnoDB数据字典)元数据、undo logs、the change buffer, and the doubl...

1270
来自专栏杨建荣的学习笔记

使用logon trigger完成动态的session跟踪(r4笔记第29天)

在之前讨论过 关于oracle中session跟踪的总结,可以参见链接 http://blog.itpub.net/23718752/viewspace-115...

2784
来自专栏杨建荣的学习笔记

记一次数据库的分析和优化建议(r6笔记第24天)

数据库的巡检是DBA工作中的一部分,有时候我们还是希望能够在巡检的基础上发现一些潜在的问题,把尽可能多的问题解决在初始阶段。 今天来给大家举一个数据库巡检和性能...

3528
来自专栏智能大石头

每天4亿行SQLite订单大数据测试(源码)

SQLite作为嵌入式数据库的翘楚,广受欢迎! 新生命团队自2010年以来,投入大量精力对SQLite进行学习研究,成功应用于各系统非致命数据场合。

1330
来自专栏菩提树下的杨过

利用Lucene打造站内搜索引擎的思路

1.为什么要用Lucene,而不用直接从数据库里搜索记录? 主要是考虑到几个因素:(1)性能问题,Lucene是基于文件索引的搜索机制,性能要比数据库里检索更...

1905
来自专栏数据和云

Library Cache优化与SQL游标

? 冷菠 冷菠,网名悠然(个人主页http://www.orasky.net),资深DBA,著有《Oracle高性能自动化运维》,有近10年的数据库运维、团队...

2805
来自专栏数据和云

举一反三:跨平台版本迁移之 XTTS 方案操作指南

作者 | 罗贵林: 云和恩墨技术工程师,具有8年以上的 Oracle 数据库工作经验,曾任职于大型的国家电信、省级财政、省级公安的维护,性能调优等。精通 Ora...

1283
来自专栏极客慕白的成长之路

数据库系统概述必背知识点整理

1202
来自专栏MongoDB中文社区

MongoDB事务模型分析

在了解写操作的事务性之前,需要先了解mongo层的每一个table,是如何与wiredtiger层的table(btree)对应的。mongo层一个最简单的ta...

1322

扫码关注云+社区