3
Tables A and B in action.
A [commonfield, otherfields]
B [commonfield]

クエリ 1

select
        A.otherfields
from
        A,B
where
        A.commonfield = B.commonfield
        and some filters ( A.commonfield )

クエリ 2

select
        A.otherfields
from
        A
where
        A.commonfield in ( select B.commonfield from B )
        and some filters ( A.commonfield )

クエリ 1 はクエリ 2 と同等です。(a) メモリ使用量と (b) 速度に関して、どちらが優れていますか?

4

4 に答える 4

5

それを行う最善のANSI標準の方法は

クエリ #3:

select
        A.otherfields
from
        A
inner join
        B ON A.commonfield = B.commonfield
where
        some filters ( A.commonfield )
于 2013-04-24T19:01:40.973 に答える
1

別の可能性:

SELECT
        A.otherfields
FROM
        A
WHERE EXISTS (SELECT * FROM B WHERE A.commonfield = B.commonfield)
        AND some filters ( A.commonfield )

Where exists は SQL Server で最速になる傾向がありますが、すべてのデータベースではそうではありません。

私はすべての可能性をテストします (暗黙の結合を使用するものを除きます。これは、それ自体が貧弱なプログラミング手法であり、明示的な結合を使用できないほど古いデータベースがない限り使用しないでください)) で最高のパフォーマンスを判断します特定のデータベースとセットアップ。

于 2013-04-24T19:10:14.747 に答える
0

これら 2 つのクエリは、実行前にコンパイルされます。

パフォーマンスは、クエリ コンパイラの SQL Server ベンダーの実装に依存します。

1 つのベンダーが、実行される同じコードに両方を最適化する場合があります。

私は SQL Server 2000 を使用していますが、両方の式で同等のコードが同等のパフォーマンスで得られました。

于 2013-04-24T19:13:10.023 に答える
0

クエリ 1 はクエリ 2 と同等ではありません。

B に複数の一致がある場合、クエリ 1 は複数の行を返します。クエリ 2 は A の行のみを返し、重複はありません。

これらは同等の結果セットを返さないため、パフォーマンスを比較することはお勧めできません。

ただし、クエリ 1 は重複排除を行っていないため、パフォーマンスが向上する可能性があります。一方、適切なインデックスがある場合、2 つのクエリは似ているか、クエリ 2 の方が優れている可能性があります。

于 2013-04-24T21:43:24.027 に答える