布隆过滤(Bloom Filter)-必须了解的优化器算法

布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。

吴军博士,在《数学之美》一书中,曾经介绍过这个算法,以下内容转引自吴军博士的文章:

假定我们存储一亿个电子邮件地址,我们先建立一个十六亿二进制(比特),即两亿字节的向量,然后将这十六亿个二进制全部设置为零。对于每一个电子邮件地址

X,我们用八个不同的随机数产生器(F1,F2, ...,F8) 产生八个信息指纹(f1, f2, ..., f8)。再用一个随机数产生器 G

把这八个信息指纹映射到 1 到十六亿中的八个自然数 g1, g2, ...,g8。现在我们把这八个位置的二进制全部设置为一。当我们对这一亿个

email 地址都进行这样的处理后。一个针对这些 email 地址的布隆过滤器就建成了。(见下图)

在,让我们看看如何用布隆过滤器来检测一个可疑的电子邮件地址 Y 是否在黑名单中。我们用相同的八个随机数产生器(F1, F2, ...,

F8)对这个地址产生八个信息指纹 s1,s2,...,s8,然后将这八个指纹对应到布隆过滤器的八个二进制位,分别是

t1,t2,...,t8。如果 Y 在黑名单中,显然,t1,t2,..,t8

对应的八个二进制一定是一。这样在遇到任何在黑名单中的电子邮件地址,我们都能准确地发现。布隆过滤能够使用极低的存储空间,存储海量数据的映射,从而可以提供快速的过滤机制。

这一算法在Oracle Database 10gR2中被引入到Oracle数据库中,在类似如下的执行计划中,就可以看到布隆过滤的作用:

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

| Id  | Operation                             | Name      | Pstart| Pstop |IN-OUT| PQ Distrib |

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

|   0 | SELECT STATEMENT                      |           |       |       |      |            |

|   1 |  PX COORDINATOR                       |           |       |       |      |            |

|   2 |   PX SEND QC (RANDOM)                 | :TQ10002  |       |       | P->S | QC (RAND)  |

|*  3 |    FILTER                             |           |       |       | PCWC |            |

|   4 |     HASH GROUP BY                     |           |       |       | PCWP |            |

|   5 |      PX RECEIVE                       |           |       |       | PCWP |            |

|   6 |       PX SEND HASH                    | :TQ10001  |       |       | P->P | HASH       |

|   7 |        HASH GROUP BY                  |           |       |       | PCWP |            |

|*  8 |         HASH JOIN                     |           |       |       | PCWP |            |

|   9 |          PART JOIN FILTER CREATE      | :BF0000   |       |       | PCWP |            |

|  10 |           PX RECEIVE                  |           |       |       | PCWP |            |

|  11 |            PX SEND PARTITION (KEY)    | :TQ10000  |       |       | P->P | PART (KEY) |

|  12 |             PX BLOCK ITERATOR         |           |       |       | PCWC |            |

|  13 |              TABLE ACCESS FULL        | CUSTOMERS |       |       | PCWP |            |

|  14 |          PX PARTITION HASH JOIN-FILTER|           |:BF0000|:BF0000| PCWC |            |

|* 15 |           TABLE ACCESS FULL           | SALES     |:BF0000|:BF0000| PCWP |            |

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

Predicate Information (identified by operation id):

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

3 - filter(COUNT(SYS_OP_CSR(SYS_OP_MSR(COUNT(*)),0))>100)

8 - access("S"."CUST_ID"="C"."CUST_ID")

15 - filter("S"."TIME_ID"<=TO_DATE(' 1999-10-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND

"S"."TIME_ID">=TO_DATE(' 1999-07-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))在以上执行计划中,BF0000 即 Bloom Filter的缩写提示。

而PART JOIN FILTER CREATE 这个步骤,是创建Bloom Filter的过程,在14,15 PX PARTITION HASH JOIN-FILTER中,过滤器被使用。

在11.2.0.3中,以下一系列隐含参数和Bloom Filter相关,通过 _bloom_filter_enabled 参数可以启用或禁用布隆过滤,缺省已经启用:

NAME                   VALUE            DESCRIB

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

_bloom_filter_enabled           TRUE            enables or disables bloom filter

_bloom_filter_debug           0            debug level for bloom filtering

_bloom_vector_elements           0            number of elements in a bloom filter vector

_bloom_predicate_enabled       TRUE            enables or disables bloom filter predicate pushdown

_bloom_predicate_pushdown_to_storage TRUE            enables or disables bloom filter predicate pushdown to storage

_bloom_folding_enabled           TRUE            Enable folding of bloom filter

_bloom_folding_density           16            bloom filter folding density lower bound

_bloom_folding_min           131072            bloom filter folding size lower bound

_bloom_pushing_max           512            bloom filter pushing size upper bound

_bloom_max_size            268435456        bloom filter maximum size in bytes

_bloom_pruning_enabled           TRUE            Enable partition pruning using bloom filtering

_bloom_pushing_total_max       262144            bloom filter combined pushing size (DOP x filter size) upperbound

_bloom_minmax_enabled           TRUE            enable or disable bloom min max filtering

Oracle的很多新特性在最初引入时,都可能带来BUG,影响性能,所以了解Oracle数据库在不同版本中引入的新特性,对于DBA来说非常重要。

以下两个链接,可以作为参考:

http://www.acoug.org/wp-content/uploads/2010/04/ACOUG-OracleSortAndBloomFilter-Fuyuncat.pdf

http://antognini.ch/papers/BloomFilters20080620.pdf

By eygle on 2012-09-03 12:26 |

Comments (0) |

SQL.PLSQL | 3042 |

oracle bloom过滤,布隆过滤(Bloom Filter)-必须了解的优化器算法相关推荐

  1. 【Oracle】看懂执行计划之基于成本的优化器(CBO)

    [Oracle]看懂执行计划之基于成本的优化器(CBO) 基于代价的优化方式   Cost-Based Optimization,简称 CBO.CBO 选择目标 SQL 执行计划的判断原则是成本,从目 ...

  2. Bloom filter 过滤(布隆过滤算法)原理

    一,什么是Bloom filter Bloom filter 是由 Howard Bloom 在 1970 年提出的二进制向量数据结构,它具有很好的空间和时间效率,被用来检测一个元素是不是集合中的一个 ...

  3. Oracle 优化器

    什么是优化器 优化器是Oracle中的一个核心模块,它的作用是为用户输入的SQL选择一个它计算出来的最高效的执行计划.SQL语句在Oracle中的执行过程如下图所示: 基于规则优化器RBO 基于规则的 ...

  4. oracle optimizer_features_enable,Oracle Optimizer:迁移到使用基于成本的优化器—–系列2.1-数据库专栏,ORACLE...

    oracle optimizer:迁移到使用基于成本的优化器-–系列2.1 系列之二包含影响优化器选择执行计划的初始化参数和oracle内部隐藏参数,合理设置这些参数对于优化器是相当重要的. 6.影响 ...

  5. Oracle - 优化器(Optimizer)- 01概念

    Oracle里的优化器 Oracle市场占有率近50%,是使用范围最广的关系型数据库(RDBMS) 对于关系型数据库的应用系统而言,SQL语句的好坏会直接影响系统的性能,很多系统性能很差最后发现都是因 ...

  6. 大数据处理算法--Bloom Filter布隆过滤

    1. Bloom-Filter算法简介 Bloom-Filter,即布隆过滤器,1970年由Bloom中提出.它可以用于检索一个元素是否在一个集合中. Bloom Filter(BF)是一种空间效率很 ...

  7. mysql布隆过滤器源码_布隆过滤器(Bloom Filter)的原理和实现

    什么情况下需要布隆过滤器? 先来看几个比较常见的例子 字处理软件中,需要检查一个英语单词是否拼写正确 在 FBI,一个嫌疑人的名字是否已经在嫌疑名单上 在网络爬虫里,一个网址是否被访问过 yahoo, ...

  8. js 数组 实现 完全树_Flink实例(六十八):布隆过滤器(Bloom Filter)的原理和实现 - 秋华...

    什么情况下需要布隆过滤器? 先来看几个比较常见的例子 字处理软件中,需要检查一个英语单词是否拼写正确 在 FBI,一个嫌疑人的名字是否已经在嫌疑名单上 在网络爬虫里,一个网址是否被访问过 yahoo, ...

  9. 硬核 | Redis 布隆(Bloom Filter)过滤器原理与实战

    在Redis 缓存击穿(失效).缓存穿透.缓存雪崩怎么解决?中我们说到可以使用布隆过滤器避免「缓存穿透」. 码哥,布隆过滤器还能在哪些场景使用呀? 比如我们使用「码哥跳动」开发的「明日头条」APP 看 ...

最新文章

  1. 面试使用计算机,面试相关之计算机基础
  2. SAP RETAIL Plant Group里的特性
  3. (0005) iOS 开发之WebViewJavascriptBridge的升级问题
  4. python-3.x-基本数据类型
  5. git-flow 流程 备忘清单
  6. 修改VMOS2的SID 并成为成员服务器,求助SAS9.4服务器版的sid!!!急急!
  7. X.509证书的介绍
  8. 图像语义分割:FCN全卷积网络概述
  9. Emacs之LaTeX环境配置及效果展示
  10. Python基础-time and datetime
  11. ES索引管理工具curator安装
  12. [其他] 10种技巧可提升Android应用运行效果
  13. 安川伺服在使用绝对值编码器时,电池的选用
  14. Linux系统装intel网卡,在Centos下安装intel网卡的方法
  15. 广州市职称计算机应用考试,职称计算机考试
  16. Allegro如何更改铜皮的网络操作指导
  17. Requirement already satisfied的解决方案
  18. html中文字不自动换行 white-space style
  19. 润乾参数模板中的参数校验
  20. XXL-JOB(2)-使用

热门文章

  1. 常用触摸屏驱动 android
  2. C语言函数大全--c开头的函数
  3. Spring框架之AOP详解(带实战详细步骤)
  4. 「营业日志 2020.12.10」Jiangly 的排列数数题
  5. 2022新版nft源码中国元宇宙数字藏品艺术品交易平台源码
  6. 测试人员必备数据库技术之数据库约束(五)
  7. MapReduce中的自定义多目录/文件名输出转
  8. 基于java+ssm医院门诊预约挂号排班系统
  9. 二、树莓派RGB LED实验
  10. igxe取东西显示服务器繁忙,igxe服务器繁忙