Bloom filters 布隆过滤器

在ITPUB上看到有人写到同一条语句连续执行两次,得出的结果截然不同,数据本身没有发生变化,关掉dynamic_sampling功能,多次查询结果是正常的。究竟是为什么?

oracle通过内部函数使用布隆过滤对并行JOIN进行过滤。但是布隆过滤的精确度是依赖hash函数的好坏以及使用的hash函数数量决定的。
你试试将_bloom_filter_enabled设为FALSE关掉布隆过滤;或者将_bloom_vector_elements设为一个稍大的数字。
SQL> alter session set optimizer_dynamic_sampling=0;

 

布隆过滤器:

布隆过滤器由2个组件构成:K个hash函数和m位的位向量(bit
vector),m就是向量的位数,_bloom_vector_elements就是决定该值的参数。
向量所有位初始都为0,用k个hash函数对一个集合的所有成员映射,根据映射结果将向量相应位置1。要判断一个数是否属于该集合,同样用这k个函数对其映射,如果得出的某个位在集合的向量上相应位为0,则说明该数不属于该集合。但是,如果相应位都为1,并不能说明它一定属于该集合,这就是布隆过滤的误判。

假如集合成员数为n,用k个函数映射后,m位向量上某个位为0的概率为
(1-1/m)^(k*n)
某个位为1的概率就是
1-(1-1/m)^(k*n)
而如果要判断一个数是否属于该集合,其所有映射位和集合向量的所有匹配的概率就是
(1-(1-1/m)^(k*n))^k

从计算式上看,增加M值,就能降低误判率。

 

转载于:https://www.cnblogs.com/bwdata/p/3894878.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值