Oracle 连接因式分解(Join Factorization)(五)

2015-01-21 12:18:01 · 作者: · 浏览: 21
? (0)| 00:00:02 |? ? ? |? ? ? |
|*? 9 |? ? VIEW? ? ? ? ? ? ? ? ? ? ? ? ? ? | index$_join$_006? ? |? 9163 | 64141 |? 118? (1)| 00:00:02 |? ? ? |? ? ? |
|* 10 |? ? ? HASH JOIN? ? ? ? ? ? ? ? ? ? ? |? ? ? ? ? ? ? ? ? ? ? |? ? ? |? ? ? |? ? ? ? ? ? |? ? ? ? ? |? ? ? |? ? ? |
|? 11 |? ? ? BITMAP CONVERSION TO ROWIDS? |? ? ? ? ? ? ? ? ? ? ? |? 9163 | 64141 |? ? 1? (0)| 00:00:01 |? ? ? |? ? ? |
|* 12 |? ? ? ? BITMAP INDEX SINGLE VALUE? ? | CUSTOMERS_GENDER_BIX |? ? ? |? ? ? |? ? ? ? ? ? |? ? ? ? ? |? ? ? |? ? ? |
|? 13 |? ? ? INDEX FAST FULL SCAN? ? ? ? ? | CUSTOMERS_PK? ? ? ? |? 9163 | 64141 |? 145? (0)| 00:00:02 |? ? ? |? ? ? |
|? 14 |? NESTED LOOPS? ? ? ? ? ? ? ? ? ? ? |? ? ? ? ? ? ? ? ? ? ? | 19142 |? 822K|? 452? (0)| 00:00:06 |? ? ? |? ? ? |
|? 15 |? ? NESTED LOOPS? ? ? ? ? ? ? ? ? ? |? ? ? ? ? ? ? ? ? ? ? | 19142 |? 822K|? 452? (0)| 00:00:06 |? ? ? |? ? ? |
|* 16 |? ? TABLE ACCESS FULL? ? ? ? ? ? ? | PRODUCTS? ? ? ? ? ? |? ? 1 |? ? 35 |? ? 3? (0)| 00:00:01 |? ? ? |? ? ? |
|? 17 |? ? PARTITION RANGE ALL? ? ? ? ? ? |? ? ? ? ? ? ? ? ? ? ? |? ? ? |? ? ? |? ? ? ? ? ? |? ? ? ? ? |? ? 1 |? ? 28 |
|? 18 |? ? ? BITMAP CONVERSION TO ROWIDS? ? |? ? ? ? ? ? ? ? ? ? ? |? ? ? |? ? ? |? ? ? ? ? ? |? ? ? ? ? |? ? ? |? ? ? |
|* 19 |? ? ? BITMAP INDEX SINGLE VALUE? ? | SALES_PROD_BIX? ? ? |? ? ? |? ? ? |? ? ? ? ? ? |? ? ? ? ? |? ? 1 |? ? 28 |
|? 20 |? ? TABLE ACCESS BY LOCAL INDEX ROWID| SALES? ? ? ? ? ? ? ? | 12762 |? 112K|? 452? (0)| 00:00:06 |? ? 1 |? ? 1 |
----------------------------------------------------------------------------------------------------------------------------


Predicate Information (identified by operation id):
---------------------------------------------------


? 1 - access("T2"."CUST_ID"="ITEM_1")
? 4 - filter("T3"."CUST_GENDER"='MALE')
? 5 - access(ROWID=ROWID)
? 7 - access("T3"."CUST_GENDER"='MALE')
? 9 - filter("T3"."CUST_GENDER"='FEMALE')
? 10 - access(ROWID=ROWID)
? 12 - access("T3"."CUST_GENDER"='FEMALE')
? 16 - filter("T1"."PROD_LIST_PRICE">1000)
? 19 - access("T1"."PROD_ID"="T2"."PROD_ID")



Statistics
----------------------------------------------------------
? ? ? ? 12? recursive calls
? ? ? ? ? 0? db block gets
? ? ? ? 14? consistent gets
? ? ? ? ? 0? physical reads
? ? ? ? ? 0? redo size
? ? ? ? 350? bytes sent via SQL*Net to client
? ? ? ? 404? bytes received via SQL*Net from client
? ? ? ? ? 1? SQL*Net roundtrips to/from client
? ? ? ? ? 4? sorts (memory)
? ? ? ? ? 0? sorts (disk)
? ? ? ? ? 0? rows processed



注意到Id=2的执行步骤的Operation列的值是“VIEW”,其对应的Name列的值是“VW_JF_SET$7C24F767”,和范例SQL一样,
?这说明Oracle已经把视图view_jf的定义SQL语句中union all的公共部分表sales提了出来,然后用union all剩下的部分形成了
?一个内嵌视图VW_JF_SET$7C24F767,即Oracle已经对范例SQL1做了连接因式分解。


有一条SQL在测试环境中能做连接因式分解,测试环境与生产环境完全全相同,同事说在生产环境中发现不能进行连接因式分解,说帮忙看看原因是因为生产环境中与该SQL相关的三张表原来的数据被清空了,而新导入的数据没有收集统计信息赞成的。下面来模拟测试一下这个问题。


下面的SQL在表sales,customers没有统计信息时不能进行连接因式分解
SQL> select t2.prod_id as prod_id
? 2? from sales t2,customers t3
? 3? where t2.cust_id=t3.cust_id
? 4? and t3.cust_gender='MALE'
? 5? union all
? 6? select t2.prod_id as prod_id
? 7? from sales t2,customers t3
? 8? where t2.cust_id=t3.cust_id
? 9? and t3.cust_gender='FEMALE';


no rows selected



Execution Plan
----------------------------------------------------------
Plan hash value: 4184572088


------------------------------------------------------------------------------------------------------------------------
| Id? | Operation? ? ? ? ? ? ? ? ? ? ? | Name? ? ? ? ? ? ? ? | Rows? | Bytes | Cost (%CPU)| Time? ? | Pstart| Pstop |
------------------------------------------------------------------------------------------------------------------------
|? 0 | SELECT STATEMENT? ? ? ? ? ? ? ? |? ? ? ? ? ? ? ? ? ? ? |? 1837K|? ? 28M|? 1290? (2)| 00:00:16 |? ? ? |? ? ? |
|? 1 |? UNION-ALL? ? ? ? ? ? ? ? ? ? ? |? ? ? ? ? ? ? ? ? ? ? |? ? ? |