最適なものは何ですか? UNIONとWHERE IN(str1、str2、str3)
-
09-06-2019 - |
質問
クライアントの特定の現地時間にメールを送信するプログラムを書いています。タイムゾーンをとる.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万行を処理するので、この時点で完了です。
他のヒント
ほとんどのデータベース関連のパフォーマンスの質問に対する本当の答えは、それを実行し、データセットに対してDBが何をするかを分析することです。 EXPLAIN PLANまたはトレースを実行して、クエリが適切なインデックスにヒットしているかどうかを確認するか、必要に応じてインデックスを作成します。
IN句を使用する最初の方法を使用する可能性が高いのは、必要なもののセマンティクスが最も多いからです。 timezoneIDは、いくつかのタイムゾーンテーブルの主キーのように見えるため、電子メールの外部キーであり、インデックス化されている必要があります。 DBオプティマイザーによっては、外部キーインデックスでインデックススキャンを実行する必要があると思います。
最初の推測では、結果を見つけるためにテーブルを1回スキャンするだけで済むため、
SELECT email FROM tClient WHERE timezoneID in (1, 4, 9)の方が高速になりますが、両方のクエリの実行プランを確認することをお勧めします。
仮説を実際に確認するためのMS SQL Query Analyzerは手元にありませんが、UNIONサーバーでは3つのテーブルスキャンを行う必要があるのに対し、WHERE INでは1つしか必要ないため、WHERE INバリアントの方が高速になると思います。 Query Analyzerを使用している場合は、両方のクエリの実行計画を確認してください。
インターネット上では、WHERE INの使用を避けるための提案に出くわすことがよくありますが、これはサブクエリが使用される場合を指します。したがって、このケースはこの推奨事項の範囲外であり、さらに読みやすく理解しやすいです。
質問にはいくつかの非常に重要な情報が欠けていると思います。まず、timetimeIDがインデックス化されているかどうか、プライマリキーの一部であるかどうかなど、非常に重要です。アナライザーを確認することをお勧めしますが、私の経験では、WHERE句は特に高速です。インデックス。ロジックは次のようなものです。ユニオンクエリには追加のオーバーヘッドがあり、型、各列の列番号などをチェックします。
書籍「SQL Performance Tuning」では、著者は、テストした7つのDBMSすべて(SQL Server 2000、Sybase ASE 12.5、Oracle 9i、DB2など)でUNIONクエリが遅いことを発見しました:
一部のDBMSのクエリオプティマイザーはクエリを変更してより効率的にするため、使用しているDBMSによっては、おそらく気にする必要はありません。