oracle bloom过滤,CSS_Oracle BLOOM过滤问题分析与解决,升入11.2.0.1遇到一个BLOOM过滤器 - phpStudy...
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...相关推荐
- 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 ...
- mysql update语句卡死_oracle执行update语句时卡住问题分析及解决办法
问题 开发的时候debug到一条update的sql语句时程序就不动了,然后我就在plsql上试了一下,发现plsql一直在显示正在执行,等了好久也不出结果.但是奇怪的是执行其他的select语句却是 ...
- 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 ...
- 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种操作系统平台. ...
- Eclipse 的常见报错、警告和原因分析、解决方式以及相关操作快捷键小结(持续更新)
文章目录 前言 一.常见的三种类型错误 二.运行时错误 总结 前言 Eclipse 作为我们开发中最为常用的一款 IDE,功能齐全(虽然近几年被 IDEA 占尽了风头),但是最为基本的一些操作我们是要 ...
- 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 ...
- oracle成功的原因,【案例】Oracle报错OUI-67076产生原因和MOS官方解决办法
天萃荷净 运维DBA反映在升级Oracle数据库时报错OUI-67076:OracleHomeInventory was not able to create a lock file,结合MOS官方解 ...
- Oracle 11.2.0.4 RAC 手动打补丁
文章目录 1 补丁介绍 1.1 下载补丁和最新OPatch 1.2 补丁说明 2 检查数据库当前OPatch版本 3 确认停止oem 1.查看oem运行状态: 2.如果是运行状态,则需要关闭: 4 更 ...
- oracle tnsping 怎么用,oracle 11.2.0 tnsping ORCL; 报错,该如何解决
oracle 11.2.0 tnsping ORCL; 报错,该如何解决 oracle 11.2.0 tnsping ORCL; 报错,该如何解决 日期:2014-05-17 浏览次数:20530 次 ...
最新文章
- UVa 10375 Choose and divide
- delphi编译缺少组件 imgedit excel2000等
- c语言程序设计填空带答案,c语言程序设计填空题及答案复习用精编-20210414010859.docx-原创力文档...
- dart正则替换手机号中间四位为*
- 安徽大学计算机教学平台c语言作业,安徽大学计算机基础C语言选择题
- 任务03——简单程序测试及 GitHub Issues 的使用
- java聚水潭_聚水潭.sln · killvs/jusuitan - Gitee.com
- vc如何打开plt图像_图像基本操作-open cv
- python:文件打包为exe
- echart 饼图每一块间隙_排队3h?为了火遍tou音的芝士水果饼,值得吗?!
- HTML5画布(矩形)
- 电脑麦克风使用不了没有声音了怎么办
- java win8 mac地址_Win8系统查看mac地址的两种方法
- 从零开始研发GPS接收机连载——3、用HackRF软件无线电平台作为GPS模拟器
- 《数字图像处理(第三版)》 第一章 绪论 笔记
- 转: 系统问题排查思路
- 在OSM上下载历史数据
- 关于电厂设备巡检的方法和注意事项有哪些
- 淘宝首页链接跳转,非taobao.com域名下的链接处理
- python能做界面吗_如何使用pyQT做pythonGUI界面|
热门文章
- 史上最详细的Linux网卡ifcfg,史上最详细的Linux网卡ifcfg-eth0配置详解
- 可爱的python测试开发库及项目(python测试开发工具库汇总)
- pandas 日期处理
- java 0xf0_java 中类似js encodeURIComponent 函数的实现案例
- 2013年6月份安徽省计算机等级考试二级c语言答案,2013年计算机二级C语言上机试题九及答案...
- 红黑树的删除_红黑树
- 十七、二分查找法(java)
- 第一个Python程序——博客自动访问脚本
- (数据库系统概论|王珊)第十一章并发控制-第五、六、七节:并发调度的可串行性、两段锁协议和封锁的粒度
- Python Numpy 数组的初始化和基本操作