日期:2014-05-17 浏览次数:20623 次
--> 测试数据:[test] if object_id('[test]') is not null drop table [test] create table [test]([Id] int,[Num] int) insert [test] select 0,0 union all select 1,1 union all select 2,3 union all select 3,6 union all select 4,9 union all select 5,12 union all select 6,15 --这个方法也可以,不过没这个简单 declare @min int declare @max int select @min=Min(num),@max=Max(num) from test select number as [Num], ISNULL([Id],(select max(id) from test c where c.Num<a.number)) id from master..spt_values a left join test b on a.number=b.Num where number between @min and @max and type='p' --你这个应该是比较简单的了,我看了执行计划 select top 1 id from test where num<=5 order by Num desc /* Num id 0 0 1 1 2 1 3 2 4 2 5 2 6 3 7 3 8 3 9 4 10 4 11 4 12 5 13 5 14 5 15 6 */
------解决方案--------------------
--这是我刚刚写的语句的执行的扫描和读取次数 表 'test'。扫描计数 1,逻辑读取 1 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。 表 'test'。扫描计数 2,逻辑读取 2 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。 表 'spt_values'。扫描计数 1,逻辑读取 2 次,物理读取 1 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。 --这是你这个语句执行的的: 表 'test'。扫描计数 1,逻辑读取 1 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。 从效率上讲你这个语句是最简单了了