天天看點

淺談之子查詢展開

子查詢展開(subquery unnesting)是優化器處理帶子查詢的目标sql的一種優化手段,它是指優化器不再将目标sql中的子查詢當做一個獨立的處理單元來單獨執行,而是将該子查詢轉換為它自身和外部查詢之間等價的連接配接。如果子查詢沒有展開,那麼這種情況下該子查詢就會在其執行計劃的最後一步才被執行,并且會走FILTER類型的執行計劃,這也就意味着對于外部查詢所在結果集中的每一條記錄,該子查詢都會被當做一個獨立的執行單元來執行一次。

oracle資料庫裡子查詢前的where條件如果是如下這些條件之一,那麼這種類型的目标sql在滿足了一定的條件後就可以做子查詢展開:

1.single-row(即=、<、>、<=、>=和<>)

2.exists

3.not exists

4.in

5.not in

6.any

7.all

 子查詢是否能做子查詢展開取決于如下兩個條件:

1.子查詢展開所對應的等價改寫sql和原sql在語義上一定要是完全等價的。如果改寫的sql和原sql并不一定能保持語義上的完全等價,這種類型的子查詢就不能做子查詢展開。

2.對于不拆開子查詢但是會把它轉化為一個内嵌視圖的子查詢展開,隻有當經過子查詢展開後的等價改寫sql的成本值小于原sql的成本值時,oracle才會對目标sql執行子查詢展開。

轉載于:https://www.cnblogs.com/jwangpip/p/9103217.html