用存储过程。创建一个临时表,将记录按我需要的顺序存入。然后取得我需要的数据。
加上一字段,identity(int,1,1) as tempid 然后如取21~40的记录:select * from tempid where tempid>20 and tempid<40 仅是建议而已!
加上一字段,identity(int,1,1) as tempid 然后如取21~40的记录:select * from tempid where tempid>20 and tempid<40 仅是建议而已!
你的方法正是我说的第二种方法。当数据量很大,比如取名张三的有10万,取名李
四的有10万。现在按名字升序排列,则李四在前,张三在后(它们的nID是不定的
的,1可能是张三,2可能是李四)。现在我要取第21至第40条的记录,就不得不把
全部的数据放到临时表中,这样会占用大量的内存,处理速度也很慢。
另外,我试了这样的例子:数据库有20万条记录。按nID排序(或是一个不允许
重复的字段),每次取20条,用如下的SQL:
select top 20 * from test where nID > <条件值>
响应时间在一秒之内。现在我想,如实在不行,则不允许按可重复字段排序。
再建一个索引 (sName,sAddress),应该会快些。
关于快速查询:字符的字段的查询一定比INT的要慢,所以将表的结构改小,在要查询的主表已INT字段为主,字符字段记录在另一表中,这样在一个页下可以保存更多的记录,再加上合理的INDEX,查询的效率会提高.
EXAMPLE:select * from Test where sName > '张三'改为
select * from test left join test2 on test.id=test2.id where sname_id >10002
再者,从现在来说,使用临时表来分页处理是目前最好的方式,现在涉及到还要对按条件检索后的数据进行分页的问题,而且就算你使用别的方式,也可能在后台SQLSERVER也是使用临时表在处理,只是在程序中看不到罢了。你也可以这样处理:不按条检索可以使用ID》20的方式。使用按条件检索的数据使用临时表的方式。我想这样是效率最高。
表的设计问题不大。比如记录企业的信息表:
Create Person(
nID int not null, /*编号*/
sName varchar(10) not null, /*企业名称,不重复*/
nCityID int not null, /*所在城市编号*/
Primary key (nID),
Foreign key (nCityID) References ...
)
城市用另一个表存储。比如北京市的人有10万。现在要取出按城市排序的记录集中
的第20至40条。
你还可以建立VIEW,根据SNAME的开始字母,在VIEW上再建立INDEX(ONLY SQLSERVER 2K)性能会有很大的提高,试试看吧!