2017-07-11 6 views
1

私は以下のものを持っているとしましょう。結合の片側から何も選択されていない場合、任意の/すべてのデータベースクエリオプティマイザは結合を無視しますか?

SELECT DISTINCT user_id from users LEFT OUTER JOIN transactions on user_id = buyer_id; 

buyer_idにuser_idとの外部キーの関係があるとしましょう(これは問題ですか?)。クエリオプティマイザは、選択されたものが実際には「トランザクション」テーブルから何も必要ないので、結合を無視するほどスマートになりますか?

答えて

1

第1に、オプティマイザは一般的に結合を排除しません。それは間違いなく選択肢です。特に、適切なキーがuniqueと宣言されている場合は、オプティマイザによって実行されることがあります。

さらに重要なことは、クエリが実行可能なケースではありません。問題?ユーザーは複数のトランザクションを持つことができ、クエリはそのユーザーの複数の行を返します。したがって、それはusersから選択するだけではありません。

+0

良い点は、別のuser_idを選択しているとします。 –

+0

@ NigerLittle-Pooleを反映するように質問を編集します。 。 。次に、あなたは別の質問をするでしょう。新しい質問は、*新しい*質問ではなく、* comment *として尋ねられるべきです。 –

0

これは、クエリ

SELECT last_name FROM contact 
LEFT JOIN orders 
ON contact.id = orders.contact_id 

を実行するときにMS SQLが言うことです。

(126295 row(s) affected) 
Table 'contact'. Scan count 1, logical reads 979, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 

ご覧のとおり、表の注文については言及していません。だから私の答えはYESのオプティマイザを考慮に入れます。少なくともMS SQLで。しかし、あなたの走行距離は変わるかもしれません。

この最適化の理由は、出力ではテーブルのユーザーとテーブルオーダーのデータのみが左結合で結合されるためです。したがって、テーブルオーダーのデータに依存することはなく、無視することができます。

関連する問題