0

データベースには論理的な削除があり、各テーブルには「削除済み」フラグがあり、これは null 許容の日時フィールドです。

Deleted DATETIME NULL

クエリでは、次のパターンを使用します。

SELECT *
FROM TableA a
INNER JOIN TableB b 
   ON b.id = a.pkid
   AND b.deleted IS NULL
INNER JOIN TableC c
   ON c.id = b.pkid
   AND c.deleted IS NULL
WHERE a.deleted IS NULL

それはより効率的ですか:

SELECT *
FROM TableA a
INNER JOIN TableB b 
   ON b.id = a.pkid
INNER JOIN TableC c
   ON c.id = b.pkid
WHERE a.deleted IS NULL
AND b.deleted IS NULL
AND c.deleted IS NULL

Left Join が入ると、親が変わることを理解しています。ここで INNER の結合について話している。

サーバーがクエリを実行する方法のため、最初の方法がより効率的だと思います。ステージについて見たページが見つかりません...つまり、最初に結合、次に場所、次に順序、選択...しかし、最初の例ではデータが制限され、次に場所が起動されます。 WHEREがカバーするデータが少ないのですか?

4

1 に答える 1

1

最初の結合に a の述語を追加することもできます ...

SELECT *
FROM TableA a
   JOIN TableB b 
      ON b.id = a.pkid
         AND a.deleted IS NULL
         AND b.deleted IS NULL
   JOIN TableC c
      ON c.id = b.pkid
         AND c.deleted IS NULL

しかし、一般に、ある特定の構文アプローチを当てにして、別の構文アプローチよりも優れたパフォーマンスまたは劣ったパフォーマンスを生成することは信頼できません。クエリ オプティマイザーはいくつかの奇妙なことを行うことができ、多くの場合、2 つの大きく異なるクエリを同じプランに変換します。両方を試して、クエリ プランを調べて何が起こるかを確認してください。

于 2013-10-16T00:29:49.517 に答える