2010-02-14 34 views
19

你好,我做了一個SQL測試和可疑/好奇一個問題:在哪個序列中是由SQL引擎執行的查詢和子查詢?

在其順序查詢和子查詢的SQL引擎執行?

的答案是

  1. 主要的查詢 - >子查詢 - >子子查詢等
  2. 副子查詢 - >子查詢 - >黃金查詢
  3. 整個查詢的解釋在同一時間
  4. 沒有解釋沒有固定的順序,查詢分析器採用飛決定

我選擇了最後一個答案(只是假設它是最可靠的w.r.t.其他)。 現在的好奇心:

我在哪裏可以讀到關於這個和簡要說明什麼是所有這一切的機制?

謝謝。

回答

12

選項4已關閉。

SQL是declarative:你告訴查詢優化器你想要什麼,並且它是最好的(取決於時間/「成本」等)的方式。根據統計數據,數據分佈,行數,並行性以及上帝知道的其他內容,這可能會因外觀相同的查詢和表而有所不同。

這意味着沒有固定的訂單。但它不是很「對飛」

具有相同的服務器,模式,查詢

就算了,數據我見過的執行計劃不同

0

它通常取決於您的DBMS,但是......我認爲第二個答案更合理。 如果沒有子查詢結果,Prime查詢通常無法計算。

+0

另一方面 - 子查詢通常依賴於pripary查詢(相關子查詢)。 ps:你好,來自phpclub ;-) – zerkms

0

SQL引擎嘗試優化(子)查詢的執行順序。決定這個的部分被稱爲查詢優化器。查詢優化器知道每個表中有多少行,哪些表具有索引以及哪些字段。它使用這些信息來決定首先執行的部分。

20

我認爲答案4是正確的。有幾個注意事項:

子查詢的類型 - 它是否相關?考慮:

SELECT * 
FROM t1 
WHERE id IN (
      SELECT id 
      FROM t2 
      ) 

這裏,子查詢與外部查詢不相關。如果t2.id中的值的數量與t1.id相比較小,則首先執行子查詢並將結果保存在內存中,然後掃描t1或t1.id上的索引,匹配緩存的值。

但是,如果查詢是:

SELECT * 
FROM t1 
WHERE id IN (
      SELECT id 
      FROM t2 
      WHERE t2.type = t1.type 
      ) 

這裏的子查詢相關 - 沒有辦法計算子查詢,除非t1.type是已知的。由於t1.type的值可能會因外部查詢的每一行而有所不同,因此可以爲外部查詢的每一行執行一次子查詢。

然後,RDBMS可能真的很聰明,並意識到t2.type只有幾個可能的值。在這種情況下,如果它可以猜測一次執行子查詢的成本會比每行更便宜,那麼它仍然可以使用用於不相關子查詢的方法。

+0

Thak你的迴應,關於在哪裏閱讀的任何想法,最好的來源? – Igor

+2

如果在第二個例子中,而不是'從t2'我們有'從t2,t1',那麼主要查詢和子查詢不相關。我對嗎 ? – alex

+0

這是正確的。子查詢的WHERE中的表達式t1.type將被解析爲子查詢的FROM子句中的t1,而不是外部查詢的t1子句中的t1。子查詢將不再具有任何對外部查詢的引用,因此將是不相關的。 –

1

如果你想要的東西就這些主題閱讀起來,得到的副本SQL Server 2008內部:T-SQL查詢。它有兩個關於如何在SQL Server中邏輯和物理地處理查詢的專用章節。