1

日付列が特定の日付まで最新である行を選択するパターンに従って、かなりの数のストアド プロシージャがあります。2 つの形式が使用されています。

select top 1 x, y, z from sometable where a=b and date <= @date order by date desc

また

select x, y, z from sometable where a=b and date=(select max(date) from sometable where a=b and date <= @date)

サブクエリの代わりに結合を使用する 2 番目の形式の派生も想像できます。

2 番目のフォームが複数の行を返す場合は無視できます。決してそうではないと仮定してください。

これは多くの場所で使用されており、その一部はパフォーマンスが重要なコードの多数の行に対して使用されているため、より最適なソリューション (他の提案である可能性があります) を標準化したいと考えています。

一部のグーグルでは、TOP 1 と MAX の多数の比較が行われていますが、通常は単一の値であり、サブクエリはありません。その場合、MAX が明らかに勝者ですが、サブクエリがそれを変更するかどうかはわかりません。

この分野で私より知識のある方の意見をいただければ幸いです (ほとんどの方がそうです!)。

4

2 に答える 2

2

結果はテーブルの設計によって異なる場合がありますが、一般的に言えば、日付にインデックスがない場合、TOP 1 / Order by 手法は 2 倍優れています。これは、SQL サーバーがクエリごとにスキャンを実行する必要があるためです。次に、それに基づいて残りの値を調べます。日付にインデックスがある場合 (クエリをカバーするかどうかに関係なく)、計画は同じです。

ここで考慮すべき最も重要なことは、索引付けです。このクエリを頻繁に実行する場合は、日付フィールドにインデックスを作成する必要があります。

特定の状況でTOP 1が最適であるという観点と、すでに触れた問題の両方から、MAXは複数の行を返す可能性があります(ちなみに、一意のインデックスがない限り、いつかそうなるとは思わないでください)日付で)、私は間違いなく TOP 1 手法を好みます。これは、そのようなすべてのクエリに使用する手法です。

于 2009-08-12T12:58:31.373 に答える
1

クエリオプティマイザーは自由度が高く、MAXでもTOP1でも色々と実行できます。それが正確に何をするかは、ソースクエリ、利用可能なインデックス、およびテーブルの統計などによって異なります。明日は、テーブルのサイズまたはその分布が変化するため、別のアプローチを選択する可能性があります。

ですから、最適解は一つではないと思います。実際のパフォーマンスの問題を待ち、それらを 1 つずつ最適化します。

于 2009-08-12T09:01:31.083 に答える