2016-11-30 4 views
3

私はこのSQLクエリを持っています。私は今何を返すのですが、サーバーがどのように解析し、それを段階的に実行するのか理解できません。 深いレベルでの作業の原則、SQLコマンドを実行するときにサーバー上で行われていること、戻り結果の前に各行を反復する方法を理解したい。このSQLコマンドを実行すると、SQL Server上で何が起こっています

enter image description here

私は最後のもので、usersfriendsテーブルを持っているそれらの両方は、ユーザーのIDで、friend_iduser_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演算子または クエリの両方のステートメントをチェックしますか。最初の繰り返しで友だちIDと のuser_idで結合します。あなたは、インデックスを使用している場合

    :FROM -

    まずステップ:私は、私はそれが役に立てば幸いエンジンは、潜在的にあなたのクエリを実行できるかの推測をすることができますクエリプランなし

+1

誤ったタグを削除する価値はあります。このMySQLまたはSQL Serverですか? –

+0

MySQLにはSQL Serverと同様の実行計画がありますか? –

+0

私はEXPLAINコマンドを使用しましたが、それは私が探しているものではありません。select query.Howの動作原理を理解する必要があります。 –

答えて

2

whereの列(user_id、user_id)で、後で実行計画で評価する必要のある結果を制限するwhere条件を指定して、友人表に対して索引シークを実行できます。索引がない場合は、表スキャンを実行できます。

USER_IDまたはfriend_idは72

ORに等しい友人のテーブルからすべての行を選択することになるあなたのクエリでは、行は、行のデータ・ストリームに追加するためにのみ1つの条件が真であることが必要であることをここに意味

友達から。

第二段階 - 登録しよう:

を友人行がどこ述語を適用し発見された後、実際の参加処理を開始します。 テーブルの統計とクエリのコストに応じて、エンジンはネストされたループ結合を実行でき、各行は友人からユーザーに対して評価されます。また、1つのテーブルのハッシュテーブルを構築し、ハッシュキー機能を使用して他のテーブルの各ローを調べることもできます。このように、2つのテーブル(友人とユーザー)間でIDを一致させることができます

ONは、比較する必要のある列を定義します。

わかりやすいネストループ結合の場合を考えてみましょう。 この結合タイプは、行ごとに結合されている両方のデータストリーム(フレンドとユーザー)をループし、各行を評価します。

クエリでは、u.idとfriend_idを比較します。この条件がtrueを返す場合、結合は実行され、エンジンは後で処理するためにテーブルの友人とユーザーの一致する行を結合します。ONの最初の条件が偽または不明である場合、エンジンは第2の条件user_idを評価します。 Trueは結合を実行し、falseまたはunknownは行が一致しないことを意味します。この場合、条件の両方が失敗するように返されません。

第三ステップ - SELECT:

をテーブルが結合された後にエンジンが、それは最終的にあなたがそれを求めてきました列を返すSELECT文を実行するために必要なすべてのデータを持っています。

関連する問題