Oracle BLOOM过滤问题分析与解决

升入11.2.0.1遇到一个BLOOM过滤器导致的问题。

系统里面发生大量死锁,但是这个ORA-60伴随着另一个错误ORA-10387

ORA-00060: deadlock detected while waiting for resource

ORA-10387: parallel query server interrupt (normal)

通过和ORACLE SUPPORT 沟通后,认为是由bug 9124206 和 bug 8361126引起。通过设置如下参数

NAME TYPE VALUE

------------------------------------ -----------

_bloom_filter_enabled boolean FALSE

_bloom_pruning_enabled boolean FALSE

来避免这个bug。

我在metalink想查询这两个bug,一个是no fix, 一个是not publish(杯具)。不过通过设置这个参数,我就没有看见过ORA-10387了,虽然ORA-60仍然很多(我OPEN了另外一个SR关于11g is more sensitive on deadlock)

那么什么是BLOOM 过滤呢,下面稍作解释。

BLOOM算法不是ORACLE发明的新算法,它是由Burton在1970年提出的。

BLOOM过滤是一个数据结构和算法,用于判断一个元素是否在它的集合内。

BLOOM的基本数据结构是一个数组,它的初始成员都是为0,长度为M.

【0,0,0,0,0,。。。。。。。。。。。。。。。0,0,0,0,0】

在初始化的时候,每一个要放置进去的元素,通过HASH计算出L个大小1到M的值,然后将数组的对应的成员赋值为1.一个位置,可以重复赋值。

【0,1,0,1,0,。。。。。。。。。。。。。。。0,1,0,0,1】

在进行过滤判断的时候,过程也是一样,通过HASH 算法将对应的位数算出来,然后去判断是否每一位都是1,如果是,那么就说明该元素包含在当前数据集。

但是BLOOM是存在误判的可能,这个几率和几个因素有关,

1. 数组的大小M

2. HASH函数的产生映射位数L(把几个数组成员值0置为1)

3. 以及要加入数组的元素N

为什么会产生误判?一个通俗易懂解释,就是在M数组中加入大量的元素映射后,一部分的数组元素都变成1,那么很有可能一个并不存在于数组的中的元素,在进行判断的时候,它的算出的映射位置恰好由几个其它元素的映射位置占领了,这时候就会误判它存在于这个集合。

而当M越大时,误判就会减少。

我在网上找到一段由Christian写的PL/SQL代码,可以模拟这一过程,如下:

CREATE OR REPLACE PACKAGE BODY BLOOM_FILTER IS

TYPE T_BITARRAY IS TABLE OF BOOLEAN;

G_BITARRAY T_BITARRAY;

G_M     BINARY_INTEGER;

G_K     BINARY_INTEGER;

----------------------------------------

PROCEDURE INIT(P_M IN BINARY_INTEGER, P_N IN BINARY_INTEGER) IS

BEGIN

G_M     := P_M;

G_BITARRAY := T_BITARRAY();

G_BITARRAY.EXTEND(P_M);

FOR I IN G_BITARRAY.FIRST .. G_BITARRAY.LAST LOOP

G_BITARRAY(I) := FALSE;

END LOOP;

G_K := CEIL(P_M / P_N * LN(2));

dbms_output.put_line('G_K='||G_K);

FOR I IN G_BITARRAY.FIRST .. G_BITARRAY.LAST LOOP

-- dbms_output.put_line(I);

IF NOT G_BITARRAY(I) THEN

NULL;

-- dbms_output.put_line('NO');

ELSE

dbms_output.put_line('YES');

END IF;

END LOOP;

END INIT;

----------------------------------------

FUNCTION ADD_VALUE(P_VALUE IN VARCHAR2) RETURN BINARY_INTEGER IS

A NUMBER;

BEGIN

DBMS_RANDOM.SEED(P_VALUE);

FOR I IN 0 .. G_K LOOP

A:=DBMS_RANDOM.VALUE(1, G_M);

dbms_output.put_line(A);

G_BITARRAY(A) := TRUE;

END LOOP;

RETURN 1;

END ADD_VALUE;

----------------------------------------

FUNCTION CONTAIN(P_VALUE IN VARCHAR2) RETURN BINARY_INTEGER IS

L_RET BINARY_INTEGER := 1;

BEGIN

DBMS_RANDOM.SEED(P_VALUE);

-- dbms_output.put_line('G_K='||G_K);

FOR I IN 0 .. G_K LOOP

IF NOT G_BITARRAY(DBMS_RANDOM.VALUE(1, G_M)) THEN

L_RET := 0;

EXIT;

END IF;

END LOOP;

RETURN L_RET;

END CONTAIN;

PROCEDURE show_nest_table IS

t NUMBER:=1;

BEGIN

FOR I IN G_BITARRAY.FIRST .. G_BITARRAY.LAST LOOP

-- dbms_output.put_line(I);

IF NOT G_BITARRAY(I) THEN

NULL;

dbms_output.put_line(I||'IS NO');

ELSE

dbms_output.put_line(I||' IS YES');

t:=t+1;

END IF;

END LOOP;

--

END;

END BLOOM_FILTER;

测试过程

创建测试表

create table t as

select dbms_random.string('u',100) As VALUE

from dual connect by level <=10000;

BLOOM数组初始化,数组大小为15000exec

bloom_filter.init(15000,1000);

加入1000个元素 (表的前1000行)

select count(bloom_filter.add_value(value))

from t

where rownum<=1000;

判断表中数据有多少在BLOOM数组中

select count(*)

from t

where bloom_filter.contain(value)=1;

实际为1000,但结果会大于1000,说明产生了误判。

通过增加数组的大小可以观察,误判逐渐消失为0.本例,大概38000的数组大小,就可以100%成功过滤1000个元素。

ORACLE在11g中支持三类类型BLOOM特性

BLOOM filter

BLOOM partition pruning

Support result cache

但是不幸的是,由于bug,我们已经关闭前两种相关阅读:

Javascript 浏览器事件小结

CSS元素的层叠与z-index设置

外部表在Oracle数据库中使用心得

JSP模板应用指南(上)

用缓冲技术提高JSP应用的性能和稳定性

用stack变量优化Java代码

关于CSS网页布局id与class的命名

影响Oracle中文显示的字符集分析

HTML5 CSS3新的WEB标准和浏览器支持

Asp备份与恢复SQL Server数据库

HTML5中div§ion&article之间的区别

Ajax获取页面被缓存的解决方案

帝国ECMS教程:上一篇下一篇自定义综合代码

PHP 中文乱码解决办法总结分析

oracle bloom过滤,CSS_Oracle BLOOM过滤问题分析与解决,升入11.2.0.1遇到一个BLOOM过滤器 - phpStudy...相关推荐

  1. oracle数据库gi,Oracle_RAC数据库GI的PSU升级(11.2.0.4.0到11.2.0.4.8)

    Oracle_RAC数据库GI的PSU升级(11.2.0.4.0到11.2.0.4.8) 本次演示为升级oracle rac数据库,用GI的psu升级,从11.2.0.4.0升级到11.2.0.4.8 ...

  2. mysql update语句卡死_oracle执行update语句时卡住问题分析及解决办法

    问题 开发的时候debug到一条update的sql语句时程序就不动了,然后我就在plsql上试了一下,发现plsql一直在显示正在执行,等了好久也不出结果.但是奇怪的是执行其他的select语句却是 ...

  3. oracle 11.2.0.5下载,oracle 11.2.0.4和10.2.0.5下载地址

    oracle 10.2.0.5 patch下载地址: p8202632_10205_WINNT.zip **ZD1vLWNud3g2OEBtb3Rvcm9sYS5jb20mc2l6ZT0xMDg1Mj ...

  4. Oracle 11gR2发布11.2.0.3 Patchset补丁集-又一重量级更新

    Oracle 11gR2的Patchset 2 即11.2.0.3在美国时间9月23日发布了(23-SEP-2011),此次的发布包括Linux 86和 Linux x86-64 2种操作系统平台. ...

  5. Eclipse 的常见报错、警告和原因分析、解决方式以及相关操作快捷键小结(持续更新)

    文章目录 前言 一.常见的三种类型错误 二.运行时错误 总结 前言 Eclipse 作为我们开发中最为常用的一款 IDE,功能齐全(虽然近几年被 IDEA 占尽了风头),但是最为基本的一些操作我们是要 ...

  6. Oracle 11.2.0.1 rac升级到11.2.0.4

    升级过程分为三部分: 1.升级grid 2.升级rdbms 3.升级数据字典 前期准备: 新建grid_home和oracle_home 升级前 升级后 版本 11.2.0.1 11.2.0.4 gr ...

  7. oracle成功的原因,【案例】Oracle报错OUI-67076产生原因和MOS官方解决办法

    天萃荷净 运维DBA反映在升级Oracle数据库时报错OUI-67076:OracleHomeInventory was not able to create a lock file,结合MOS官方解 ...

  8. Oracle 11.2.0.4 RAC 手动打补丁

    文章目录 1 补丁介绍 1.1 下载补丁和最新OPatch 1.2 补丁说明 2 检查数据库当前OPatch版本 3 确认停止oem 1.查看oem运行状态: 2.如果是运行状态,则需要关闭: 4 更 ...

  9. oracle tnsping 怎么用,oracle 11.2.0 tnsping ORCL; 报错,该如何解决

    oracle 11.2.0 tnsping ORCL; 报错,该如何解决 oracle 11.2.0 tnsping ORCL; 报错,该如何解决 日期:2014-05-17 浏览次数:20530 次 ...

最新文章

  1. UVa 10375 Choose and divide
  2. delphi编译缺少组件 imgedit excel2000等
  3. c语言程序设计填空带答案,c语言程序设计填空题及答案复习用精编-20210414010859.docx-原创力文档...
  4. dart正则替换手机号中间四位为*
  5. 安徽大学计算机教学平台c语言作业,安徽大学计算机基础C语言选择题
  6. 任务03——简单程序测试及 GitHub Issues 的使用
  7. java聚水潭_聚水潭.sln · killvs/jusuitan - Gitee.com
  8. vc如何打开plt图像_图像基本操作-open cv
  9. python:文件打包为exe
  10. echart 饼图每一块间隙_排队3h?为了火遍tou音的芝士水果饼,值得吗?!
  11. HTML5画布(矩形)
  12. 电脑麦克风使用不了没有声音了怎么办
  13. java win8 mac地址_Win8系统查看mac地址的两种方法
  14. 从零开始研发GPS接收机连载——3、用HackRF软件无线电平台作为GPS模拟器
  15. 《数字图像处理(第三版)》 第一章 绪论 笔记
  16. 转: 系统问题排查思路
  17. 在OSM上下载历史数据
  18. 关于电厂设备巡检的方法和注意事项有哪些
  19. 淘宝首页链接跳转,非taobao.com域名下的链接处理
  20. python能做界面吗_如何使用pyQT做pythonGUI界面|

热门文章

  1. 史上最详细的Linux网卡ifcfg,史上最详细的Linux网卡ifcfg-eth0配置详解
  2. 可爱的python测试开发库及项目(python测试开发工具库汇总)
  3. pandas 日期处理
  4. java 0xf0_java 中类似js encodeURIComponent 函数的实现案例
  5. 2013年6月份安徽省计算机等级考试二级c语言答案,2013年计算机二级C语言上机试题九及答案...
  6. 红黑树的删除_红黑树
  7. 十七、二分查找法(java)
  8. 第一个Python程序——博客自动访问脚本
  9. (数据库系统概论|王珊)第十一章并发控制-第五、六、七节:并发调度的可串行性、两段锁协议和封锁的粒度
  10. Python Numpy 数组的初始化和基本操作