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 select 来产生这个结果。

我的问题是:有没有人对此有更好的想法?就像桌子末端的精选顶部一样?

编辑:两个查询的执行计划:看起来亚历克斯的想法很好,但大卫也是对的,只有一个选择和一个排序 在此处输入图像描述

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 -> 只有一个排序。内部查询的 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 回答