子查詢是指在一個SELECT語句中嵌套另一個SELECT語句。子查詢與主查詢之間并不是水平關系,而是從屬關系。這就意味著不論使用哪種類型的子查詢,都必須確保不能改變主查詢的完整性。通常情況下,優(yōu)化器都會將子查詢合并到主查詢中,以便產(chǎn)生更優(yōu)質的執(zhí)行計劃。這里可能采用嵌套循環(huán)、排序合并或哈希連接等方式。
下面我們來看看子查詢可能的幾種處理方式。
在合并之后,可能有兩種處理方式:一種是子查詢優(yōu)先,一種是主查詢優(yōu)先。
1.子查詢優(yōu)先
如果子查詢與主查詢的表連接方式是優(yōu)先執(zhí)行子查詢,并將其執(zhí)行結果提供給主查詢的嵌套循環(huán)連接,那么優(yōu)化器將優(yōu)先執(zhí)行子查詢,并通過對結果進行唯一排序SOR(UNIQUE),再與主查詢進行連接。在排序合并連接和哈希連接中,也是這樣處理的。通常可以看到類似下面的執(zhí)行計劃。
2.主查詢優(yōu)先
如果將主查詢的執(zhí)行結果作為外側循環(huán)來使用,而把子查詢作為內側循環(huán)來使用。此時采用在內側循環(huán)中第一行被連接成功之后就立刻結束內側循環(huán)的方式。這種處理方式所制定的策略就是前面在嵌套循環(huán)中提到的FILTER。通常可以看到類似下面的執(zhí)行計劃。[插圖]下邊我們首先來看看子查詢的分類。