1

この質問の目的は、内部結合を使用して結果を除外する方法を見つけることです。
1つの列で関連付けられた2つのテーブルがあります。テーブルNamesには約100,000以上のレコードが含まれています。

Table: Names
+----+------+
| ID | Name |
+----+------+
| 1  | A100 |
| 2  | A100 |
| 3  | A100 |
| 4  | A200 |
...

Table: TableB
+----+---------------+
| ID | ChildrenCount |
+----+---------------+
| 1  |  20           |
| 2  |  25           |
| 3  |  10           |
| 4  |  70           |
...

質問1
これらのクエリのどれがより効率的ですか?

select n.[ID]
from Names n
inner join TableB b
  on b.[ID] = n.[ID]
    and b.[ChildrenCount] > 50
where n.[Name] Like 'A%'

また

select n.[ID]
from Names n
inner join TableB b
  on b.[ID] = n.[ID]
    and b.[ChildrenCount] > 50
    and n.[Name] Like 'A%'


質問2
[クエリ1]は最初に句を除外してからwhere、結果セットに対して内部結合を実行しますか、それともフィルタリングは順番に進行しますか(最初に内部結合、次にwhere句)?

4

1 に答える 1

2

理論的には、関係代数に従って、最初に結合が適用され、次にセット全体がWHERE句によってフィルタリングされるため、最初の例からのクエリの方がうまく機能するように見えます。ただし、SQL Serverはクエリを最適化し、適切と思われる場合はこれらの操作の順序を変更します。したがって、結合前に適用できるこれらのフィルターが適用されてから結合され、後で以前は適用できなかった他のフィルターが適用されます。さらに、これら両方のクエリの実行計画は完全に同じである必要があります。これを自分でチェックしてください。

于 2013-03-19T16:40:19.240 に答える