2011-08-25 5 views
25

私はいくつかのコードを見直さなければならなかったし、誰かがやったことに遭遇し、私の方法が良いという理由を考えることができません。そして、それはおそらくそうではありません。したがって、より良い/より安全な/より効果的なのでしょうか?MAX対トップ1 - これは良いですか?

SELECT MAX(a_date) FROM a_table WHERE a_primary_key = 5 GROUP BY event_id 

OR

SELECT TOP 1 a_date FROM a_table WHERE a_primary_key = 5 ORDER BY a_date 

私は第二オプションでなくなっが、なぜわからない、それは右かどうだろう。

答えて

13

テーブルのインデックスが作成されている場合、パフォーマンスは一般的に似ています。

フォートワースかかわら考慮:あなたの結果を注文している場合Topは通常は理にかなって(?そうでない場合は、top)結果を注文

は、より多くの処理が必要となります。

Minは必ずしも発注する必要はありません。 (ちょっと変わってきますが、しばしば注文やグループで注文する必要はありません)

2つの例では、speed/x-planが非常に似ていると思います。あなたはいつもあなたの統計に回って確かめることができますが、その違いが重要であるとは思っていません。高速であるかを知るための最良の方法は、クエリプランをチェックして、あなたのベンチマークを行うことです

SELECT MAX(a_date) FROM a_table WHERE a_primary_key = 5 

SELECT TOP 1 a_date FROM a_table WHERE a_primary_key = 5 ORDER BY a_date DESC 

:あなたが必要とするのと同じ結果を持っているために、クエリのために

+1

SQL ServerのTOP 1は、rowNum = 1を使用してOracleとは動作が異なります。注文前に最初に見つかったOracleを実際に取得します。したがって、このメソッドはSQL Serverでのみ有効です。このTOP 1とMax()の別の利点は、該当する注文を含める限り、必要な数の列を取得できることです。私はMax()を使ってテストし、GROUP BYでも1レコードしか得られないように見えることがわかりました。多分より強力なモジョーとして、サブクエリを使用せずに複数の列からトップを取得したい場合は、ただ1つの行を取得する方法を言うことができますか? – gordon

10

これらは異なるクエリです。

最初のものは、第二の一方が一つのレコード(a_primary_key = 5内に見出さ最小a_date)を返す多くのレコード(a_primary_key = 5内で見つかった各event_idの最大a_date

を返します。

+2

o.O最初のクエリはまだ1つのレコードを返します –

+1

@ Shredder a_primary_keyは実際には主キーです。しかし、それが主キーであれば、 'a_date'に日付が1つしかありません。また、' max'も 'top'も必要ありません。 – GSerg

+0

そうでなくても、それでも1つのレコードが返されます。 http://www.w3schools.com/sql/sql_func_max.asp –

0

MAXおよびTOPは機能が異なっている。最初のクエリでは、a_dateの最大値が返され、それぞれ異なるevent_idが見つかった場合はa_primary_key = 5になります。 2番目のクエリは、最初にa_dateを取得し、結果セットにはa_primary_key = 5が含まれています。

+1

最初の値を取得しません。 'Top'は' order by asc'と組み合わせて最小の値を選択します。 – GSerg

+0

wthはあなたの喫煙者です。その中には何かがあります。最初に見つかった値を取得します。この場合、ASCによる注文は最小から最大になり、最初の値を最小にします.. –

5

。テーブル/ヒープサイズなど、速度に影響する多くの要因があります。同じデータベースの異なるバージョンであっても、あるクエリを優先して最適化することができます。

+3

最初の例でグループ化する必要はありません(WHERE節ごとに1つのグループしかないため)。 – Chains

+0

@kuru:集計関数を使うことはできませんが、もしそうなら... – vol7ron

+3

あなたが答えを書いている間だけaggsを選択している限り、君は大丈夫だよ。あなたが選択に非agg値を含める場合、でグループを必要とします。 – Chains

28

1)がテーブルにクラスタ化インデックスおよび照会する列、両方MAX()オペレータであり、クエリSELECT TOP 1はほぼ同じ性能を有することになります。

2)テーブルにクラスタ化インデックスがなく、クエリ対象の列がない場合は、MAX()演算子がより優れたパフォーマンスを提供します。

参考:http://www.johnsansom.com/performance-comparison-of-select-top-1-verses-max/

0

私は20,00,000+、レコード、 で一つのテーブルの上に最大とトップを実行し、トップが最大または最小機能より順に速く結果を与えることがわかりました。

だから、最善の方法は、クエリを1つずつ実行してから、接続経過時間を確認することです。

関連する問題