CBO的查詢轉換(謂詞推入與子查詢展開(Subquery Unnesting))

abstractcyj發表於2016-04-13
1. 謂詞推入
    謂詞推入是將外層的相關謂詞,推入至內層查詢檢視當中(View Query Block),使得內層檢視可以利用謂詞進行索引掃描或者過濾
   如:
   SELECT col1, col2, col3 FROM (select col1, col2, col3 from table_a a union all
                                             select col1, col2, col3 from table_b b )
  WHERE col1 = 'SAMPLE'

  => 
 
  SELECT col1, col2, col3 FROM (select col1, col2, col3 from table_a a where col1 = 'SAMPLE' union all
                                             select col1, col2, col3 from table_b b WHERE col1 = 'SAMPLE')
   
 如果沒有謂詞推入, table_a, table_b肯定都是進行全表掃描,有了謂詞推入, table_a.col1, table_b.col1, 有了建立索引進行索引掃描的可能。

2. 子查詢展開(Subquery Unnesting):
   子查詢展開的意思是, 優化器將一個巢狀查詢展開為等價的表連線, 進而優化表連線。
    子查詢展開使得優化器可以考慮子查詢相關表的訪問路徑,關聯順序,關聯方式的選擇。只有當轉換之後的語句與轉換之前的語句返回相同的行數,並且子查詢不包含AVG這樣的聚合函式的時候,才會進行這樣的轉換。
   例: 
   SELECT *
FROM sales
WHERE cust_id IN ( SELECT cust_id
FROM customers );

 =>
 
 SELECT sales.*
FROM sales, customers
WHERE sales.cust_id = customers.cust_id;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8520577/viewspace-2080434/,如需轉載,請註明出處,否則將追究法律責任。

相關文章