1

2 つのテーブル間で結合を行う場合、それらを全体として結合したか、必要な列のみを抽出した後に結合したという事実に関して違いはありますか (各テーブルには潜在的に多くの列があると仮定します) )?

例としては、

SELECT tableA.foreignKey, tableB.someValue
FROM tableA JOIN tableB ON tableA.foreignKey=tableB.key

とは異なる

SELECT tableA.foreignKey, tableB.someValue 
FROM (SELECT foreignKey FROM tableA) tableA_filtered 
JOIN (SELECT key, someValue FROM tableB) tableB_filtered 
ON tableA_filtered.foreignKey=tableB_filtered.key

パフォーマンス的に?

4

3 に答える 3

1

2番目は結果の一時テーブルを作成するサブクエリを使用するため、最初のものを使用します。また、テーブルの一部の列を集約していないため、実際に(SELECT valueA FROM tableA)はまったく意味がありません。

サブクエリは時々悪であり、常にではありません。Ttは、使用しているRDBMSによって異なります。

于 2013-03-12T12:32:12.823 に答える
1

原則として、サブクエリは常に遅くなります。処理するデータの量によっては、大きな影響を与える可能性があります。

最近、多くの結合を含む大きな選択からサブクエリを削除しました。SQL は、それ以上ではないにしても、約 100,000 行を処理していました。非常に単純なサブ選択を削除すると、パフォーマンスが 50 秒向上しました。全体的に、SQL には 2 分かかりました。なので、インパクト大でした。

于 2013-03-12T12:52:07.143 に答える
0

テーブルに多くの列がある場合、2番目のクエリの方が高速になると思います。ただし、この 2 つのクエリは同等ではないことに注意してください。最初のものは A と B からのすべての値を表示し、2 番目のものは A からの valueA と B からの valueB のみを表示します! とにかく、それはより理論的な質問であり、一般的に答えるのは難しい.

実際には、この決定はデータベース オプティマイザに任せます。しかし、さらに高速化する方法があるかどうかを本当に知りたい場合、唯一の安全な方法は、両方のクエリの実行時間を測定して比較することです。

補足として、2 番目のクエリは DBMS の書き換えエンジンによってフラット化される可能性が非常に高いため、次のように記述した場合と同じです。

SELECT valueA, valueB FROM A, B WHERE A.valueA = B.valueB;

于 2013-03-12T12:44:19.233 に答える