3

私はまだSQLを学んでいます。私は 2 つの異なる方法で同様のクエリを実行しましたが、どちらが優れているのか、その理由は何なのか疑問に思っていました。

UPDATE R
    SET R.something = 1
    FROM Table1 R
    JOIN Table2 U
    ON R.value1 = U.value2
    WHERE
        U.value3 BETWEEN 1 AND 5

また

UPDATE R
    SET R.something = 1
    WHERE R.value1 IN
    (SELECT U.value2
    FROM U
    WHERE
        U.value3 BETWEEN 1 AND 5
    )
4

6 に答える 6

2

あなたの質問には単一の答えがありません。SQL は記述言語であり、手続き型言語ではありません。それは、より効率的なデータベース エンジンに依存します。さらに、インデックスはパフォーマンスに大きな影響を与える可能性があります。

ところで、あなたの 2 つのクエリは同等ではありません。「U」に複数の値がある場合、最初の行は複数の行を返すことができます。「IN」を含むバージョンは、暗黙の「DISTINCT」を行います。これを修正するには、特定の「DISTINCT」を追加する必要があります。

UPDATE R
    SET R.something = 1
    FROM Table1 R
         JOIN (select distinct value2
               from Table2 U
               WHERE U.value3 BETWEEN 1 AND 5 
              ) u
         ON R.value1 = U.value2  

また、個人的にはアップデートの "FROM" ステートメントが気に入っていますが、すべてのデータベースがサポートしているわけではありません。「IN」が付いているバージョンは、より幅広いデータベース エンジンと互換性があります。

于 2012-07-09T15:46:31.710 に答える
1

最初のクエリの方が優れています。

リレーショナルデータベースは、使用している実際のDBMSに関係なく、その方法でデータを結合し、where句でデータをフィルタリングするように正確に構築されています。それは彼らのパンとバターです。2番目のクエリでは、サブクエリを使用して追加のデータを収集しています。それは完全にクールであり、リレーショナルデータベースもそれをうまく処理します。ただし、サブクエリを使用すると、この特定のケースでは、2つのクエリが発生します。1つはUデータを取得し、次に外部クエリが発生し、サブクエリのデータを使用してRデータを設定します。

ただし、ここに注意が必要です。クエリでは、サブクエリは完全に別のテーブルを参照します。だからそれはまだ速いでしょう。そのサブクエリは、Uデータのみに含まれています。2つのクエリを取得します。Uデータを取得してから、Uデータを使用してRデータを更新します。ただし、サブクエリがRからのデータを参照する同様のクエリを作成した場合、2つの個別のクエリを取得することはできません。Rのすべてのデータの全表スキャンを実行することになりますが、これはかなり遅くなります。

より完全にするための編集:他の人が言っているように、それの多くはあなたが使用しているDBMSとそれが最も得意なものに帰着します。そして、SQLを最初に学んだとき(私は決して専門家ではありません)、ハードルの1つは、同じことを行い、同じ結果を得る方法が非常に多く、最終的に同じものに最適化されることに気付くことです。 。したがって、明確な「正しい」方法がないため、「正しい」方法を見つけることはしばしば無駄です。私は正確さとスピードだけでなく、保守性のためにも書き込もうとしています-そして、サブクエリは必要以上に脳で難しいことがあることがわかりました。私はそれらを避けることができればそれらなしでやろうとします(代替がカーソルか何かでない限り:-D)。

于 2012-07-09T15:57:51.240 に答える
1

それはすべて、使用する予定のデータベース (Oracle、SQL Server など)、そのバージョン、および場合によってはテーブル内のデータ量によって異なります。ただし、ほとんどのオプティマイザーにとってより簡単で、null の落とし穴が少ないため、通常は JOIN を優先する必要があります。

于 2012-07-09T15:46:40.987 に答える
0

それはデータベースとデータベースのバージョンに依存します。 IN と JOIN のどちらが優れているか (高速) で検索すると、データベースや SQL ステートメントに応じて異なる結果が返されます (IN が高速か、JOIN が高速か)。データベースのバージョン。複数のデータサイズと異なるプラットフォームでテストすることは常に良い考えです!

(クエリ #2 が最も読みやすいですが、遅くなる場合とそうでない場合があります)

于 2012-07-09T15:44:38.247 に答える
0

副選択よりも高速になるため、JOIN を使用したクエリの方が適しています。

于 2012-07-09T15:41:39.293 に答える
0

使用しているエンジンによって異なる場合がありますが、MS SQL Server は両方を同じクエリ プランに最適化すると思います。

エンジンがそうでない場合、この例では劣っていると思います。

于 2012-07-09T15:47:35.197 に答える