6

クライアントの特定の現地時間に電子メールを送信するプログラムを作成しています。タイムゾーンと時刻と宛先タイムゾーンを取り、そのタイムゾーンの時刻を返す .NET メソッドがあります。したがって、私の方法は、データベース内のすべての異なるタイムゾーンを選択し、その方法を使用して正しい時刻であるかどうかを確認し、そのタイムゾーンを持つデータベースからすべてのクライアントを選択することです。

クエリは次のいずれかのようになります。結果セットの順序は重要ではないことに注意してください。したがって、結合は問題ありません。どちらがより速く実行されますか、または実際に同じことを行いますか?

SELECT email FROM tClient WHERE timezoneID in (1, 4, 9)

また

SELECT email FROM tClient WHERE timezoneID = 1
    UNION ALL SELECT email FROM tClient WHERE timezoneID = 4
    UNION ALL SELECT email FROM tCLIENT WHERE timezoneID = 9

編集: timezoneID は、主キー timezoneID と varchar(20) フィールド timezoneName を持つテーブルである tTimezone への外部キーです。 また、WHERE INアナライザーを開けたくないので、これにしました。

編集 2:クエリは 100 ミリ秒未満で 20 万行を処理するため、この時点で完了です。

4

7 に答える 7

3

おい!これらのクエリは同等ではありません。

1 つの電子メールが 1 つのタイム ゾーンのみに属していると仮定した場合にのみ、結果は同じになります。もちろんそうですが、SQLエンジンはそれを認識せず、重複を削除しようとします。したがって、最初のクエリはより高速になるはずです。

UNION を使用する理由がわからない場合は、常に UNION ALL を使用してください。

違いがわからない場合は、このSO の質問を参照してください。

注:その叫び声は以前のバージョンの質問に属しています。

于 2008-08-24T19:25:50.520 に答える
2

ほとんどのデータベース関連のパフォーマンスに関する質問に対する本当の答えは、それを実行して、DB がデータセットに対して何を行っているかを分析することです。説明計画またはトレースを実行して、クエリが適切なインデックスにヒットしているかどうかを確認するか、必要に応じてインデックスを作成します。

IN 句を使用する最初の句を使用する可能性があります。これは、必要なセマンティクスが最も多いためです。timezoneID は、一部のタイムゾーン テーブルの主キーのように見えるため、メールの外部キーであり、インデックスが作成されている必要があります。DB オプティマイザーによっては、外部キー インデックスに対してインデックス スキャンを実行する必要があると思います。

于 2008-08-24T17:00:45.143 に答える
1

私の最初の推測はそれでしょう

SELECT email FROM tClient WHERE timezoneID in (1, 4, 9)
結果を見つけるためにテーブルを 1 回スキャンするだけで済むため、高速になりますが、両方のクエリの実行計画を確認することをお勧めします。

于 2008-08-24T16:58:30.937 に答える
1

私の仮説を実際に確認するための MS SQL Query Analyzer は手元にありませんが、UNION サーバーでは 3 つのテーブル スキャンを実行する必要があるのに対し、WHERE IN では 1 つしか必要ないため、WHERE IN バリアントの方が高速になると思います。Query Analyzer を使用している場合は、両方のクエリの実行計画を確認してください。

インターネットでは、WHERE IN を使用しないようにという提案に遭遇することがよくありますが、それはサブクエリが使用されている場合を指します。したがって、このケースはこの推奨事項の範囲外であり、さらに読みやすく理解しやすいものです。

于 2008-08-24T17:03:58.787 に答える
1

質問にはいくつかの非常に重要な情報が欠けていると思います。まず第一に、timezoneID がインデックス化されているかどうか、主キーの一部であるかどうかなど、天候が非常に重要です。アナライザーを確認することをお勧めしますが、私の経験では、特に WHERE 句の方が高速である必要があります。インデックス。ロジックは、ユニオンクエリに追加のオーバーヘッドがあり、型、それぞれの列番号などをチェックするようなものです.

于 2008-08-24T18:07:58.163 に答える
1

「SQL Performance Tuning」という本の中で、著者は、テストした 7 つの DBMS (SQL Server 2000、Sybase ASE 12.5、Oracle 9i、DB2 など) すべてで UNION クエリが遅いことを発見しました。 google.com/books?id=3H9CC54qYeEC&pg=PA32&vq=UNION&dq=sql+performance+tuning&source=gbs_search_s&sig=ACfU3U18uYZWYVHxr2I3uUj8kmPz9RpmiA#PPA33,M1

後の DBMS では、その違いが最適化されている可能性がありますが、それは疑わしいものです。また、UNION メソッドは、IN に比べてはるかに長く、維持するのがより困難です (3 番目のメソッドが必要な場合はどうすればよいでしょうか?)。

UNION を使用する正当な理由がない限り、OR/IN メソッドを使用してください。

于 2008-08-24T18:58:53.110 に答える
0

一部の DBMS のクエリ オプティマイザーは、クエリをより効率的にするためにクエリを変更するため、使用している DBMS によっては、おそらく気にする必要はありません。

于 2008-08-24T17:28:11.380 に答える