Oracle
關於oracle過濾的布隆過濾器
我閱讀了一篇關於 Oracle 中布隆過濾器的精彩部落格,我對布隆過濾器案例有一些疑問- 這篇部落格中的過濾。
SQL> CREATE TABLE DIMENSION ( col1, col2 ) AS SELECT MOD( ROWNUM, 10 ), ROWNUM FROM DUAL CONNECT BY ROWNUM <= 100; Table created. SQL> CREATE TABLE FACT ( col1, col2 ) AS SELECT MOD( ROWNUM, 25 ), ROWNUM FROM DUAL CONNECT BY ROWNUM <= 1000000; Table created. SQL> exec dbms_stats.gather_table_stats(USER, 'DIMENSION'); PL/SQL procedure successfully completed. SQL> exec dbms_stats.gather_table_stats(USER, 'FACT'); PL/SQL procedure successfully completed. SQL> SELECT /*+ parallel(8) */ count( * ) FROM FACT, DIMENSION WHERE DIMENSION.col1 = 1 AND DIMENSION.col2 = FACT.col2; COUNT(*) ---------- 100
執行計劃如下:
SQL> select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS ALL')); PLAN_TABLE_OUTPUT ------------------------------------------------------------------------------------------------- SQL_ID 587ty27pjwphu, child number 0 ------------------------------------- SELECT /*+ parallel(8) */ count(*) FROM FACT, DIMENSION WHERE DIMENSION.col1 = 1 AND DIMENSION.col2 = FACT.col2 Plan hash value: 4106007966 ----------------------------------------------------------------------------------------------------- | Id | Operation | Name | Starts | E-Rows | TQ |IN-OUT| PQ Distrib | A-Rows | ----------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | | | | | 1 | | 1 | SORT AGGREGATE | | 1 | 1 | | | | 1 | | 2 | PX COORDINATOR | | 1 | | | | | 8 | | 3 | PX SEND QC (RANDOM) | :TQ10000 | 0 | 1 | Q1,00 | P->S | QC (RAND) | 0 | | 4 | SORT AGGREGATE | | 4 | 1 | Q1,00 | PCWP | | 4 | |* 5 | HASH JOIN | | 4 | 100 | Q1,00 | PCWP | | 100 | | 6 | JOIN FILTER CREATE | :BF0000 | 4 | 100 | Q1,00 | PCWP | | 400 | |* 7 | TABLE ACCESS FULL | DIMENSION | 4 | 100 | Q1,00 | PCWP | | 400 | | 8 | JOIN FILTER USE | :BF0000 | 4 | 1000K| Q1,00 | PCWP | | 102 | | 9 | PX BLOCK ITERATOR | | 4 | 1000K| Q1,00 | PCWC | | 102 | |* 10 | TABLE ACCESS FULL| FACT | 71 | 1000K| Q1,00 | PCWP | | 102 | ----------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 5 - access("DIMENSION"."COL2"="FACT"."COL2") 7 - filter("DIMENSION"."COL1"=1) 10 - access(:Z>=:Z AND :Z<=:Z) filter(SYS_OP_BLOOM_FILTER(:BF0000,"FACT"."COL2")) Note ----- - Degree of Parallelism is 8 because of hint
我的問題如下:
- 布隆過濾器是否防止表 FACT 中未連接表 DIMENSION 的所有行或某些行被不必要地分發?
- 布隆過濾器是由掃描表 DIMENSION的一組並行執行程序並行創建的,還是由稍後執行雜湊連接的一組並行執行程序並行創建的?
更新
我的第二個問題不太好,其實我想確認一下我對執行計劃的理解如下:
- 執行程序首先載入 DIMENSION 表數據(生產者),同時將行發送到執行程序,執行程序稍後執行雜湊連接(消費者)。這些消費者執行過程首先建構布隆過濾器。
- 執行程序載入 FACT 表數據(生產者)ant 同時將行發送到執行程序,該執行程序稍後執行散列連接(消費者)。這些消費者執行過程通過在步驟 1 中創建的布隆過濾器探測 FACT 表。
- 在步驟 1 中載入為驅動表(建構表)的 DIMENSION 表數據,以及在步驟 2 中通過布隆過濾器過濾為驅動表(探測表)的 FACT 數據正在執行雜湊連接以返回結果。
所以我認為布隆過濾器的創建發生在稍後執行雜湊連接的執行過程中,而不是執行過程載入 DIMENSION 表數據。
我的理解正確嗎?
我的參考:
布隆過濾器是否防止表 FACT 中未連接表 DIMENSION 的所有行或某些行被不必要地分發?
看看安托尼尼的文章!布隆過濾器不能防止誤報。這恰好意味著“布隆過濾器可以防止
$$ … $$ $$ only $$表 FACT 中的某些行沒有加入表 DIMENSION 以防止不必要的分佈”。當然,可能存在避免誤報的情況。Joe Obbish的範例就是這種情況:如果必須從 25 中過濾 1 個值可能的值 這可以通過布隆過濾器在沒有誤報的情況下完成。
布隆過濾器是由掃描表 DIMENSION 的一組並行執行程序並行創建的,還是由稍後執行雜湊連接的一組並行執行程序並行創建的?
要創建布隆過濾器,必須掃描表
DIMENSION
並將每個COL2
值添加到過濾器中。看看第 5 頁的Antognini 的計劃:您可以看到該
PX JOIN FILTER CREATE
步驟是由 Q1,02 流程組完成的。這是負責加入數據的組,而不是掃描表 T1 的組 Q1,00。