我现在有一个表news,里面包含100W条数据。我要取其中时间从2006-05-04到2006-08-01之间的数据当中的第100到109条,SQL怎么写查询效率才最高?谢谢!
解决方案 »
- php 里使用 mssql_pconnect 连接sqlserver经常性连接错误
- 紧急!!菜鸟求一个SQL
- 求救:如何分区间GROUP BY?
- 求一个汇总的sql语句
- 大家请帮忙,将这段简单的T-SQL转换为PL-SQL
- 网络库中的"命名管道"的设置是什么意思呀?\\.\pipe\mssql\sql\query 是什么意思呀,而且服务器端与客户端设置还不一样.
- 请教关于Like的用法?
- 如何解决联表查询记录重复问题:急,马上结题
- 如何调试局域网内远程服务器中的触发器?
- SQL写法,请各位大虾赐招!!在线等待......
- 是关于SQL Server 2000 的!
- 问题尚未解决,急,再开帖~~
where date not in (select top 100 date from news where date >'2006-05-04') and date >'2006-05-04'
(select top 109 * from news where date>'2006-5-4' and date<'2006-8-1' order by date)
order by date desc
select top 9 * from
(select top 109 * from news where date > '2006-5-4 ' and date < '2006-8-1 ' order by date) A
order by date desc
或设id为非标识列,但是程序自动加上去的如 '0000001' ,'000002' ,'00000N, '999999'这样的可以排序,可以比较大小的列, PRIMARY如果news表没有这样的列(当然,列名,或若是非标识列时,编码算法可以不同),你可以直接GG了,不用答了在id上建立聚集索引,顺序排列--首先取数据的id大致区间范围,我假设fdate是新闻的发布时间,而不是修改时间,那么id的区间跟fdate的区间的走势是一样的。
--如果fdate要取的是修改时间,请勿用此方法,因为id走势跟fdate就不一样了,取的数据就是错的。
declare @maxid int,@minid int --若是varchar型,就varchrchar(长度)
select @minid=max(id) from news where fdate<'2006-5-4'
select @maxid=min(id) from news where fdate>'2006-8-1'--还可以根具@minid和@maxid的区间中的记录数来确定是否需要生成区间内的记录的临时表。select top 10 * from news where id between @minid and @maxid
and id>(select max(id) from
(select top 99 id from tb where id between @minid and @maxid and fdate between '2006-05-04 ' and '2006-08-01') x
)在实际使用中,数据统计,需要做一些定期的维护,或对数据的分析。可以是手工的,也可以是job跑,将一些统计数据放在维护表。 比如 你的站点首页总是放了最新新闻,本月点击排行,本周点击排行,将上月最大id存放在维护表里,那么使用id区间,对于效率很有用。
到下个月时,再查一次. 程序每次都要查一次maxid的值没有意义.
02年我写论坛时,为了提高页面执行效率,想了一个办法.
表中有identity列, id ,primary 如果按id来分页排序, 每页显示 15 条, 那么 第一页显示就是 id bewteen 1 and 15
第二页, id between (@page-1)*pageNum+1 and @page*pageNum
这样,只用一个page和pageNum参数就可以在每一个页只取pageNum条记录. 速度是相当快的.
但这种想法有问题,当数据进行过删除后,id不连续,那么某些页面选取的数据数可能就小于15,甚至一条都没有
后来,有个朋友写了另一种方法
select top pageNum * from tb where id not in(select top pageNUm*(page-1) id from tb)
(我这里的pageNum和page都是用来表示的,不代表语法问题)
但这种分页有个问题, 前几页很快,越到后面,子查询里数据越多,也即页面page数越大,查询越慢再到后来,我们将写法改进了
select top pageNum * from tb where id>(select max(id) from (select top pageNum*(page-1) id from tb))
虽然也是越到后面越慢,但二者比较的是id的大小,二不是用in去匹配.当然,我们当时确实是这样弄的, 也可能早有很多人先我们就采用了这种方法,只是我们当初不知道.
(select *, row_number() over(order by date1) as rowNum from news
where date1 between '2006-05-04' and '2006-08-01')select * from x
where rowNum between 100 and 109