如果你用前台程序就很容易实现了。 如果想用SQL Server自己控制的话,(假设表中有一个主键ID叫做“ID”): 1。建立一个临时表,只有一个字段“MaxID” 2。第一次读取前1000条记录,例如 select top 1000 * from tablename ... 3。然后读取该1000条记录中的最大ID号,并将它存储到变量或者临时表。 4。接着读取后1000条记录: select top 1000 * from tablename where ID > maxID ...
建立索引 create index xx on table(a,b) 在表table的a b 列建立索引 xx drop index xx 删除索引 xx
/* create table tmp ( gdate datetime default getdate(), gid int )*/ /* declare @i int set @i = 1while @i<1000000 beginINSERT tmp(gid) values(@i)print '-------' + cast(@i as char(10)) set @i = @i + 1end select count(*) from tmp */ ------------------------------- --@page 需要取出第几页 --@pageSize 用于分页时,每页显示的记录数目 --@blockSize 在大批量数据库中不必每次取pageSize条记录,每次取一批数据,减轻数据库负担 declare @page int,@pageSize int,@sql char(300), @blockSize int,@d datetime set @page = 100000 set @blockSize = 400 set @pageSize = 20if @page =1 begin set @sql = 'select top ' + cast(@blockSize as varchar) + ' * from tmp order by gdate desc ' end else begin set @sql = 'select top ' + cast(@blockSize as varchar) + ' * from tmp where gdate< (select min(gdate) from ( select top ' + cast((@page - 1)* @pageSize as varchar) + ' gdate from tmp order by gdate desc ) as t ) order by gdate desc' endprint @sqlset @d=getdate()exec(@sql)select [语句执行花费时间(毫秒)]=datediff(ms,@d,getdate()) --select * from t where gid<50000 order by gdate desc用户先根据上面的代码新建一个表tmp 在实际应用中为测试效率问题,因此插入了1KW条记录进行效率考验 根据实际测试,效率还非常高,用户在实际应用中可参考或应用上面的代码。不过没有考虑到并发用户访问数据库情况。 原理:主要是分块取数据,上面代码中每次取400条记录,根据时间排序取数据(最近原则),页面大小和页用户可指定。
--方法1: --适用于 SQL Server 2000/2005 SELECT TOP 页大小 * FROM table1 WHERE id NOT IN ( SELECT TOP 页大小*(页数-1) id FROM table1 ORDER BY id ) ORDER BY id --方法2: --适用于 SQL Server 2000/2005 SELECT TOP 页大小 * FROM table1 WHERE id > ( SELECT ISNULL(MAX(id),0) FROM ( SELECT TOP 页大小*(页数-1) id FROM table1 ORDER BY id ) A ) ORDER BY id --方法3: --适用于 SQL Server 2005 SELECT TOP 页大小 * FROM ( SELECT ROW_NUMBER() OVER (ORDER BY id) AS RowNumber,* FROM table1 ) A WHERE RowNumber > 页大小*(页数-1) --方法四 适用于 SQL Server 2005 DECLARE @pagenum AS INT, @pagesize AS INT SET @pagenum = 2 SET @pagesize = 3 SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY newsid DESC) AS rownum, newsid, topic, ntime, hits FROM news) AS D WHERE rownum BETWEEN (@pagenum-1)*@pagesize+1 AND @pagenum*@pagesize ORDER BY newsid DESC 说明,页大小:每页的行数;页数:第几页。使用时,请把“页大小”和“页大小*(页数-1)”替换成数字。
建立索引 create index xx on table(a,b) 在表table的a b 列建立索引 xx 建立索引 create index xx on table(a) 在表table的a 列建立索引 xx drop index xx 删除索引 xx 在查询分析器里运行以上代码
如果想用SQL Server自己控制的话,(假设表中有一个主键ID叫做“ID”):
1。建立一个临时表,只有一个字段“MaxID”
2。第一次读取前1000条记录,例如
select top 1000 * from tablename ...
3。然后读取该1000条记录中的最大ID号,并将它存储到变量或者临时表。
4。接着读取后1000条记录:
select top 1000 * from tablename where ID > maxID ...
你可以将这些语句写成存储过程,存储过程的输入参数就是上次读取的最后的ID号(MaxID)。
这样你的前台程序就可以通过存储过程任意调用其中的一部分记录。
至于一次返回多少条记录,可以根据你电脑的配置,一般128的内存,一次返回1000条记录比较适当。
在表table的a b 列建立索引 xx
drop index xx
删除索引 xx
create table tmp
(
gdate datetime default getdate(),
gid int
)*/
/*
declare @i int set @i = 1while @i<1000000
beginINSERT tmp(gid) values(@i)print '-------' + cast(@i as char(10))
set @i = @i + 1end
select count(*) from tmp
*/
-------------------------------
--@page 需要取出第几页
--@pageSize 用于分页时,每页显示的记录数目
--@blockSize 在大批量数据库中不必每次取pageSize条记录,每次取一批数据,减轻数据库负担
declare @page int,@pageSize int,@sql char(300),
@blockSize int,@d datetime
set @page = 100000
set @blockSize = 400
set @pageSize = 20if @page =1
begin
set @sql = 'select top ' + cast(@blockSize as varchar) +
' * from tmp order by gdate desc '
end
else
begin
set @sql =
'select top '
+
cast(@blockSize as varchar)
+
' *
from tmp
where gdate<
(select min(gdate) from
(
select top '
+
cast((@page - 1)* @pageSize as varchar)
+
' gdate from tmp order by gdate desc
) as t
)
order by gdate desc'
endprint @sqlset @d=getdate()exec(@sql)select [语句执行花费时间(毫秒)]=datediff(ms,@d,getdate())
--select * from t where gid<50000 order by gdate desc用户先根据上面的代码新建一个表tmp
在实际应用中为测试效率问题,因此插入了1KW条记录进行效率考验
根据实际测试,效率还非常高,用户在实际应用中可参考或应用上面的代码。不过没有考虑到并发用户访问数据库情况。
原理:主要是分块取数据,上面代码中每次取400条记录,根据时间排序取数据(最近原则),页面大小和页用户可指定。
1,如果非并发,是没有问题,要从数据库方面考虑你的进程和锁的问题。
2,数据库并发处理你 还是要考虑的。
3,谨慎用索引 特别是非聚集索引。它是用指针指向 关键字的。
最重要的是程序开发的节省资源问题。
总之不要怕
数据有十几到几十万条,一般的查询语句能行吗 ,可能是可以的,就是你得从节省资源方面 考虑.
--方法1:
--适用于 SQL Server 2000/2005
SELECT TOP 页大小 *
FROM table1
WHERE id NOT IN
(
SELECT TOP 页大小*(页数-1) id FROM table1 ORDER BY id
)
ORDER BY id
--方法2:
--适用于 SQL Server 2000/2005
SELECT TOP 页大小 *
FROM table1
WHERE id >
(
SELECT ISNULL(MAX(id),0)
FROM
(
SELECT TOP 页大小*(页数-1) id FROM table1 ORDER BY id
) A
)
ORDER BY id
--方法3:
--适用于 SQL Server 2005
SELECT TOP 页大小 *
FROM
(
SELECT ROW_NUMBER() OVER (ORDER BY id) AS RowNumber,* FROM table1
) A
WHERE RowNumber > 页大小*(页数-1)
--方法四 适用于 SQL Server 2005
DECLARE @pagenum AS INT, @pagesize AS INT
SET @pagenum = 2
SET @pagesize = 3
SELECT *
FROM (SELECT ROW_NUMBER() OVER(ORDER BY newsid DESC) AS rownum,
newsid, topic, ntime, hits
FROM news) AS D
WHERE rownum BETWEEN (@pagenum-1)*@pagesize+1 AND @pagenum*@pagesize
ORDER BY newsid DESC
说明,页大小:每页的行数;页数:第几页。使用时,请把“页大小”和“页大小*(页数-1)”替换成数字。
在表table的a b 列建立索引 xx
建立索引 create index xx on table(a)
在表table的a 列建立索引 xx
drop index xx
删除索引 xx 在查询分析器里运行以上代码