4

巨大なログテーブルがあり、その時点で何が起こっているかを知るために最後の X 行を確認する必要がある場合を知っていますか?

通常、次のことができます。

select top 100 * 
from log_table
order by ID desc

最新の 100 レコードを表示しますが、逆の順序で表示されます (もちろん、DESC による順序のため)。たとえば、次のようになります。

100010
100009
100008
and so on..

しかし、簡単にするために、記録を発生順に見てみたいと思います。次のクエリを実行することでそれを行うことができます。

select * 
from(
    select top 100 * from log_table order by ID desc
    ) a
order by a.id

ここで、ID desc で上位 100 の注文を取得し、結果セットを反転します。動作しますが、この結果を生成するために 2 選択を実行する必要はないようです。

私の質問は次のとおりです。誰かがそれを行うためのより良いアイデアを持っていますか? テーブルの端にあるセレクトトップのような?

編集: 両方のクエリの実行計画: アレックスのアイデアは非常に優れているようですが、デビッドも正しか​​ったです。1 つの選択と 1 つの並べ替えしかありません。 ここに画像の説明を入力

EDIT2: 統計の設定 IO ON:

(10 row(s) affected)
Table 'sysdtslog90'. Scan count 1, logical reads 3, physical reads 0, read-ahead reads 0, lob logical reads 12, lob physical reads 0, lob read-ahead reads 0.

(1 row(s) affected)

(10 row(s) affected)
Table 'sysdtslog90'. Scan count 2, logical reads 5, physical reads 0, read-ahead reads 0, lob logical reads 12, lob physical reads 0, lob read-ahead reads 0.

(1 row(s) affected)
4

2 に答える 2

6

しかし、この結果を生成するために 2 select を実行する必要はないようです。

違う。これは必要である。

詳細: クエリの推定実行計画を確認します。おそらく、ClusteredIndexScan -> Top -> 1 つの Sort のみのように見えます。内部クエリの OrderBy はソートを実行せず、テーブルの「後ろ」から読み取るように実行を指示するだけです。

于 2012-05-24T14:36:14.760 に答える
2

idインデックスが付けられていてシーケンシャルである場合、最も速い方法はおそらく;

select * from log_table where id > (select max(id) from log_table) - N

ただし、順序を保証するには、明示的な order by が引き続き必要です。

于 2012-05-24T14:52:06.770 に答える