在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值,就能降低誤判率。
大資料面試必會問題BitSet以及布隆過濾器
問題 假設你現在要處理這樣乙個問題,你有乙個 並且擁有很多訪客,每當有使用者訪問時,你想知道這個ip是不是第一次訪問你的 這是乙個很常見的場景,為了完成這個功能,你很容易就會想到下面這個解決方案 把訪客的ip存進乙個hash表中,每當有新的訪客到來時,先檢查雜湊表中是否有改訪客的ip,如果有則說明該...
Bloom Filter 布隆演算法
日常生活中,包括在設計計算機軟體時,我們經常要判斷乙個元素是否在乙個集合中。比如在字處理軟體中,需要檢查乙個英語單詞是否拼寫正確 也就是要判斷它是否在已知的字典中 在 fbi,乙個嫌疑人的名字是否已經在嫌疑名單上 在網路爬蟲裡,乙個 是否被訪問過等等。最直接的方法就是將集合中全部的元素存在計算機中,...
布隆過濾器
布隆過濾器 bloom filter 是1970年由布隆提出的。它實際上是乙個很長的二進位制向量和一系列隨機對映函式。布隆過濾器可以用於檢索乙個元素是否在乙個集合中。它的優點是空間效率和查詢時間都遠遠超過一般的演算法,缺點是有一定的誤識別率和刪除困難。如果想要判斷乙個元素是不是在乙個集合裡,一般想到...