MAXで最大値をとる処理、
TOP 1で最大値をとる処理
どっちがいいのかなぁ~って思っていて、比較してみた。
実験テーブルとして日付だけのmaxtestテーブルを作成し、
300、003行(同日3日つ×100,001)のデータを入れて実験。
SQLは以下の2種類。
SELECT TOP 1 dt FROM maxtest ORDER BY dt DESC;
SELECT MAX(dt) FROM maxtest ;
1回目はインデクスなしで実験をしてみた。
そうしたところ、TOPを使ったSQLではクエリコスト49%、MAXを使ったSQLではクエリコスト2%が出た。
2回目にインデクスありで実験をしてみた。
そうしたら共にクエリコストが0%と出ているのだが、
TOPの方が【インデクススキャン()→TOP→SELECT】の手順で、
MAXの方が【インデクススキャン→TOP→Stream Aggregate→SELECT】になっていた。
#Stream AggregateのCPUコストが0.0000011なので大した差になっていない・・・・。
インデクスなしの場合は、断然MAX関数が有利で
インデクスありの場合は、どちらも大差ない・・・って感じですかねぇ。
だったら、どちらでも安定していけるMAXの方がいいってことかしらん♪
似た感じで、
SELECT TOP 1 * FROM maxtest ORDER BY dt desc ;
SELECT * FROM maxtest WHERE dt IN ( SELECT MAX(dt) FROM maxtest ) ;
ではどうなんだろう?って思ったのでこれまた実験(w
で、結果的には
SELECT TOP 1 * FROM maxtest ORDER BY dt desc ; → クエリコスト89%
SELECT * FROM maxtest WHERE dt IN ( SELECT MAX(dt) FROM maxtest ) ; → クエリコスト11%
でした。
下のSQLの方が手順は多いんですが、
上のSQLではテーブルスキャンし取得した全データをDESCでソートしてしまっているので
コスト高になったようです~。
まぁ、これらの結果はきっと、データの分布や量によって変化するので
一概には言えませんが、
素直なSQLが一番安定しているって事でしょうかねぇ?(^^)