簡體   English   中英

運行此sql命令時sql server上發生了什么

[英]What is happening on sql server when you run this sql command

我有這個SQL查詢。 我現在回歸什么,但無法理解服務器如何逐步解析和執行它。 我想深入了解深層次的工作原理,運行sql命令時服務器上發生了什么,如何在返回結果之前在每一行中進行迭代。

在此輸入圖像描述

我有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連接。

如果沒有查詢計划,我只能猜測引擎如何潛在地執行您的查詢,我希望它有所幫助:

第一步 - FROM:

如果在where列(user_id,user_id)上有索引,則可以在friends表上執行索引查找,其中where條件用於限制需要在執行計划中稍后評估的結果。 如果您沒有索引,則可以執行表掃描。

您的查詢將從friend表中選擇user_id或friend_id等於72的所有行。

OR在這里意味着只有一個條件需要為行添加到朋友的行的數據流。

第二步 - 加入:

在找到應用where謂詞的朋友行之后,將開始實際的連接處理。 根據表統計信息和查詢成本,引擎可以執行嵌套循環連接,其中每個行都是針對用戶的朋友進行評估的。 它還可以為一個表構建一個哈希表,並使用哈希鍵函數從另一個表中探測每一行。 這樣可以在兩個表(朋友和用戶)之間匹配ID

ON定義了需要比較的列。

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

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

第3步 - 選擇:

表連接后,引擎具有最終執行SELECT語句所需的所有數據,返回您要求的列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM