2013-10-02 223 views
1

假設一個嵌套查詢是這樣的:SQL嵌套查詢處理

SELECT * 
FROM Table1 
WHERE Table1.val in 
(
    Select Table2.val 
    from Table2 
    where Table2.val>3 
) 

所以我的問題是你如何實際查詢處理器評估這一點 -

  • 難道他們先評估最裏面的查詢,存儲結果暫時,然後在上層查詢中使用它? [如果子查詢的結果是大的,臨時存儲可能沒有足夠]
  • 還是他們評估外部查詢的每個結果的外部查詢[需要外部查詢的太多評價]

上午我錯過了什麼,它實際上實現了哪種方式?

+0

嗯..嗯查詢處理器將首先從你寫進關係操作什麼轉換查詢,然後對這些操作進行優化。這些微操作將被結合起來,給你你想要的結果。 – cjds

回答

3

這取決於。您可以從內部的外部查詢中引用值。如果你這樣做,你有什麼被稱爲相關的子查詢相關派生表。在這種情況下,它必須重新計算父查詢中每個可能行的查詢。如果你不這樣做,你有什麼被稱爲內聯視圖內聯派生表,並且大多數數據庫引擎足夠聰明,只能計算一次視圖。

1

這可以幫助你

有足夠的內存來運行相當大的查詢和有查詢的複雜性創造了超時的機會不大。除非執行查詢所需的內存量超過分配給SQL Server的物理內存「佔用空間」,否則嵌套查詢的優點是幾乎完全在物理內存中運行以提高速度。

此外,由於嵌套查詢的結構,SQL Server查詢優化器將嘗試找到從查詢中派生結果的最佳方式。 (即優化器將其轉換成微操作並重新組織以有效運行)[Source]

由於重新排序哪個查詢首先運行很難說。優化後,最有可能的是內部查詢的一種形式將運行(大多數情況下,你不能真正做到沒有結果的東西)。

SQL查詢不像您似乎認爲的那樣按堆棧調用運行。它們是一種爲機器理解和翻譯的單行指令。

0

您可以使用EXPLAIN獲取有關執行計劃這樣的信息:

EXPLAIN SELECT * 
FROM Table1 
WHERE Table1.val in 
(
    Select Table2.val 
    from Table2 
    where Table2.val>3 
) 

例如,對於您的查詢,你會得到 enter image description here

,並作爲文檔狀態:

依賴性子查詢評估與UNCACHEABLE SUBQUERY評估不同。對於DEPENDENT SUBQUERY,子查詢僅針對其外部上下文中變量的每組不同值進行一次重新評估。對於UNCACHEABLE SUBQUERY,子查詢會針對外部上下文的每一行重新評估。

所以你的第一個猜測是正確的。

更多有關EXPLAIN看到: http://dev.mysql.com/doc/refman/5.0/en/explain.html