2010-12-11 15 views
5

SQL Server 2008ではどちらが優れているのか、データベースが最適化されても問題はありません。テーブルのSQL最大行

SELECT * FROM table 
WHERE datecolumn = (SELECT max(datecolumn) FROM table); 


SELECT TOP 1 * FROM table ORDER BY datecolumn DESC; 
+3

異なる結果が生じる可能性があります。上の例では、複数の行(基本的に最も大きい日付に一致するすべての行)を返すことができます。一番下のクエリは1行しか返しません(そして、タイの日付については何もしません) – Sparky

答えて

9

これらのクエリの実際のSQL実行計画を見ると、まったく同じ実行計画と同じ実行コストが発生します。ただし、インデックスの設定や収集された統計によって異なる場合がありますので、自分で確認することをお勧めします。

注意しなければならないことは、2つのクエリが同じ結果を返さない可能性があることです。第2のSQLは、常にdatecolumnが一意でない場合、最初のレコードが複数の行を返す可能性のあるレコードを1つ返します。

0

実行計画を答えに見る必要があります。

0

SELECT * FROMテーブル WHERE datecolumn =(SELECT max(datecolumn)FROMテーブル);

SELECT TOP 1 * FROM table ORDER BY datecolumn DESC;

これらのクエリは、コストの差の結果を返します。 SQL Serverの実行計画から最初のクエリ。サブクエリが最初に実行され、テーブルタプルをスキャンし、最大の日付欄 を取得した後で、外部クエリがテーブルをスキャンしてdatcolumn = .....を検索します。この方法は効率的ではありません。

テーブルのスキャンタプルが1回だけあるため、2番目のクエリが効率的です。

注:データ列が主キーまたはインデックス列の場合、両方のクエリの重要な違いはありません。この列がインデックスと主キーでない場合は、コストに大きな差が生じる可能性があります。