2016-11-30 113 views
3

我有這個sql查詢。我現在什麼是返回,但無法理解服務器如何一步一步地解析和執行它。 我想深入瞭解工作原理,運行sql命令時服務器上發生了什麼,返回結果之前如何在每一行中進行迭代。當你運行這個sql命令時,sql server上發生了什麼

enter image description here

我有usersfriends表中,最後一個有friend_iduser_id組合,他們兩人都是用戶的ID。

select u.id,f.user_id, f.friend_id from friends f 
    INNER JOIN users u on (u.id = f.friend_id or u.id = f.user_id) 
    where f.user_id = 72 or f.friend_id = 72 
  • 如何解釋我是什麼在此查詢的每一步怎麼回事?
  • 它在每一步中的表現如何?
  • OR如何在這裏的每一步操作符?
  • 它是否檢查每個步驟中OR運算符的兩個語句或 查詢,或者例如在第一次迭代中加入friend_id,然後與 user_id加入。
+1

這將是值得刪除不正確的標籤。這是MySQL還是SQL Server? –

+0

MySQL是否有類似於SQL Server的執行計劃? –

+0

我已經使用了EXPLAIN命令,但它不是我正在尋找的,我需要了解工作選擇查詢的原理。它是如何工作的,或者是編譯的。 –

回答

2

沒有查詢計劃,我只能猜測引擎如何可能執行查詢,我希望它能幫助:

第一步 - FROM:

如果你有一個指數在where列(user_id,user_id)上,可以在您的朋友表上執行索引搜索,並使用Where條件來限制稍後在執行計劃中需要評估的結果。如果您沒有索引,則可以執行表掃描。

您的查詢將選擇從朋友表中的所有行,其中USER_ID或friend_id等於72

OR此意味着只有一個條件需要爲真該行被添加到行的數據流來自朋友。

第2步 - JOIN:

行找到了朋友後應用,其中謂語,實際的連接處理將開始。 根據表統計信息和查詢成本,引擎可以執行嵌套循環連接,其中每行都是從朋友對用戶進行評估。它也可以爲一個表建立一個散列表,並使用散列鍵功能探測另一個表中的每一行。這樣,您的兩個表(朋友和用戶)之間的id可以匹配。

ON定義了需要比較哪些列。

讓我們考慮一個更容易理解的嵌套循環連接的情況。 此連接類型循環遍歷按行方式連接在一起的兩個數據流(朋友和用戶),並評估每行。

在您的查詢中,它將比較u.id和friend_id。如果此條件返回true,則加入將被履行,並且引擎將組合來自表格朋友和用戶的匹配行以進行進一步處理。如果ON的第一個條件爲false或未知,則引擎將評估第二個條件user_id。 True滿足連接,false或unknown意味着行不匹配,所以它不會被返回,因爲在這種情況下,兩種情況都會失敗。

第3步 - 選擇:

後的表都加入了對發動機有它需要的所有最終執行SELECT語句,返回你問它的列中的數據。

相關問題