私は2つのテーブルA、Bを持っていますが、IDフィールドは共通キーです。 以下のいずれかのクエリを使用すると、結果は同じになります。2クエリ間の性能比較
select * from A,B where A.ID=B.ID and A.Id = 10;
select * from A inner join B on A.ID=B.ID where A.Id = 10;
どのクエリがパフォーマンス面で優れているのか、その理由を教えてください。
私は2つのテーブルA、Bを持っていますが、IDフィールドは共通キーです。 以下のいずれかのクエリを使用すると、結果は同じになります。2クエリ間の性能比較
select * from A,B where A.ID=B.ID and A.Id = 10;
select * from A inner join B on A.ID=B.ID where A.Id = 10;
どのクエリがパフォーマンス面で優れているのか、その理由を教えてください。
これらはおおよそ同じように実行する必要があります。ただし、最初のクエリはSQLの反パターンであり、決して使用しないでください。暗黙的な結合は、問題を引き起こすことがあります。なぜなら、より複雑になると、where節が誤って省略されることが多いからです。これは、明示的な結合構文を使用するほとんどのデータベースでは構文チェックに合格しません。事故によってwhere句がクロスジョインを引き起こし、その結果が正しくないという欠点があります。
さらに、左側の結合に1つの結合を変更し、明示的な結合を使用する必要がある場合は、メンテナンス後の結果が矛盾することがあります(特に、暗黙的な左結合構文がもはや許可されず、そして決して使用されるべきではありません)、ジョインを混合することになります(ほとんどのクエリで共通のように複数のジョインがある場合)。
さらに、実際にクロスジョインをしたい場合は、後でメンテナンスを行う人がそれを知り、コードが間違っていて内部結合が必要と思われる可能性がありません。明示的な結合を使用すると、意図が明確になります。
私はあなたの説明計画を見てみるつもりですが、クエリは絶対に同じで、構文がまったく違います。ほとんどの場合、明示的な結合構文を使用するよう指示されます。どのDBMSを使用していますか? – Jeremy
通常、パフォーマンスに違いはありません。 join条件を忘れた場合、構文エラーが発生するため、内部結合構文を使用することをお勧めします。他のケースでは、結合条件を忘れた場合、デカルト積分を得ます。 – Natrium
@Jeremy 'explain plan' <=あなたは'実行計画 'を意味すると思いますか? – Igor