0

次のコード スニペットは、同じ作業を行う必要があります。

SELECT t1.* FROM table1 t1
INNER JOIN table2 t2
ON t1.ID = t2.IDService
WHERE t2.Code = @code

SELECT * FROM table1 t1
WHERE t1.ID IN (SELECT IDService FROM table2 WHERE Code = @code)

一般的に、最適なソリューションはどれですか? そして、計算上、2 つの入れ子になった select を使用する方が良いですか、それとも内部結合を使用する方が良いですか?

編集: table1 の PK が でIDあり、table2 の PK がカップル ( IDService,Code) であると考えてください。したがって、コードを修正して (usingWHERE句)、その句ONを IDService に適用すると、各選択の結果は同じであると想定できます。

4

2 に答える 2

0

非常に一般的なルールとして、ほとんどの場合、 JOINはSUB-QUERYよりも優れたパフォーマンスを発揮しますが、例外があります。

サブクエリを使用する場合、EXIST句は通常、ほとんどのユース ケースでINよりも優れたパフォーマンスを発揮します。

テストケースについては、このサイトを調べることができます

次のルールで行く必要があります...

  1. 複数のテーブルからのデータが必要な場合は、いつでも結合できます。

  2. 複数のクエリが必要で、各サブクエリがクエリに含まれるテーブルのサブセットを提供する場合は、サブクエリを使用できます。

  3. クエリに NOT EXISTS 条件が必要な場合、NOT EXISTS はサブクエリでのみ機能するため、サブクエリを使用する必要があります。同じ原則が EXISTS 条件にも当てはまります。

  4. PROCEDURE SQL クエリ オプティマイザは、一部のサブクエリを結合に変更します。一般に、結合はより効率的に処理できます。

于 2013-11-07T12:11:53.780 に答える
0

彼らが同じ仕事をするべきだというあなたの考えは真実ではありません。次のデータのテスト セットを想像してください。

T1

ID
----
1
2
3
4
5

T2

ID
---
1
1
1
2
2
3

DDL

CREATE TABLE dbo.T1 (ID INT NOT NULL);
INSERT dbo.T1 (ID) VALUES (1), (2), (3), (4), (5);

CREATE TABLE dbo.T2 (ID INT NOT NULL);
INSERT dbo.T2 (ID) VALUES (1), (1), (1), (2), (2), (3);

SELECT  *
FROM    dbo.T1
WHERE   T1.ID IN (SELECT T2.ID FROM dbo.T2);

SELECT  T1.*
FROM    dbo.T1
        INNER JOIN dbo.T2
            ON T1.ID = T2.ID;

結果

ID
---
1
2
3

ID
---
1
1
1
2
2
3

検索する列が一意である場合にのみ、結果は同じになります。

CREATE TABLE dbo.T1 (ID INT NOT NULL);
INSERT dbo.T1 (ID) VALUES (1), (2), (3), (4), (5);

CREATE TABLE dbo.T2 (ID INT NOT NULL);
INSERT dbo.T2 (ID) VALUES (1), (2), (3);

SELECT  *
FROM    dbo.T1
WHERE   T1.ID IN (SELECT T2.ID FROM dbo.T2);

SELECT  T1.*
FROM    dbo.T1
        INNER JOIN dbo.T2
            ON T1.ID = T2.ID;

ここに画像の説明を入力

結果は同じですが、実行計画は異なります。を使用する最初のクエリINは、反セミ結合を使用できます。つまり、t2 のデータが不要であることを認識しているため、単一の一致が見つかるとすぐに、それ以上の一致のスキャンを停止できます。

2 番目のテーブルを一意の値のみを持つように制約すると、同じ計画が表示されます。

CREATE TABLE dbo.T1 (ID INT NOT NULL PRIMARY KEY);
INSERT dbo.T1 (ID) VALUES (1), (2), (3), (4), (5);

CREATE TABLE dbo.T2 (ID INT NOT NULL PRIMARY KEY);
INSERT dbo.T2 (ID) VALUES (1), (2), (3);

SELECT  *
FROM    dbo.T1
WHERE   T1.ID IN (SELECT T2.ID FROM dbo.T2);

SELECT  T1.*
FROM    dbo.T1
        INNER JOIN dbo.T2
            ON T1.ID = T2.ID;

ここに画像の説明を入力

要約すると、2 つのクエリが常に同じ結果をもたらすとは限らず、常に同じ計画を持つとは限りません。それは、インデックスとデータ/クエリの幅に大きく依存します。

于 2013-11-07T12:46:33.013 に答える