在sql server数据库中,如果一个查询结果数据量比较大,就需要在查询的时候分页,每次只返回其中一页。下面就将为您讲解比较sql server分页的两种方法,如果您对sql server分页感兴趣的话,不妨一看。
sql server分页***种方法: 思路是根据页号取出两部分数据,比如取出前90条,然后取出前100条,然后比较取出两次结果的差集。
在30万条记录的情况下,如果只分100页(结果有10000条记录),大约需要1分半钟。索引建得好的话,1分钟左右。
//select * from //这一句是不能修改的了,因为它是从结果中读取,所以必须要用*//(select Top @h_count (@filedlist) from @tableName …..) as big //取出符合条件的上限的记录//where//big.guid //这里是关键,根据主键从下限结果中过滤掉重复的记录(只留下不同的数据,也就是求交集)//not in//(select top @l_count guid from @table …..)//下限//order @orderby //原来的格式,这里只保留了orderby之后的,应该保留条件之后所有的,包括gruopby什么的
函数类似如此:public string MakeSqlPager(string sourceSql,int pageIndex){//使用默认页面大小string orderbyStr=sourceSql.Substring(sourceSql.ToLower().IndexOf(“order by”));int index=sourceSql.ToLower().IndexOf(“select”);string bigRes=”(“+ sourceSql.Insert(index+6,” top “+((pageIndex+1)*_pageSize).ToString()+” “)+”) as big”;string smallRes=”(“+ sourceSql.Insert(index+6,” top “+(pageIndex*_pageSize).ToString()+” “)+”)”;return “select * from “+bigRes+” where big.guid not in “+smallRes+” “+orderbyStr;}
这种方法还可以改进,就是第二次取过滤时从***个的结果里面过滤。
sql server分页第二种方法: 掐头去尾,程序还没写SELECT * FROM(SELECT ***00 * FROM(SELECT ***00000 * FROM pagetest ORDER BY regt ASC) as aORDER BY regt desc) as bORDER BY regt ASC
测试了一下,大约用时间29秒。
比较:***种方法的效率很低,猜测是因为多次需要循环比较,时间复杂度要高一个等级。比如,这种方法的响应时间和所取得的页号有很大关系。第二种方法还是可以接受的,和页号无关,但是也需要两次比较。
【编辑推荐】
SQL SERVER分区视图
SQL中用函数代替游标的方法
SQL中的分析函数
创建SQL函数的实例
SQL中DATENAME函数的用法
getSession().createQuery(queryStr)方法的参数是一个hql语句,当我只有一个list时,如何分页
Query query = (String hql);(int first);(int max);return ();这其中的first和max两个参数是方法需要传的两个参数,返回是list集合。

mysql中的分页查询在ssh中有几种方法
分两种了,第一种是前台分页,也叫假分页,把查询得到的所有结果全部传到前台,利用js插件啥的分页,网上很多类似的插件,数据不多时用这个就可以了;第二种是后台分页,只查询你页面显示的值,要实现这个功能,除了必要的参数,查询起始列数,要查询的条数也要传过去,调用hibernate分页,若有删除功能,还要把满足条件的数据的总条数传过去(最后一页只有一条数据时会用到,这样你就能实现网页显示前一页的内容,当然也可以每次跳页都查一遍),这里我也推荐一个插件,pager-taglib
用SQL语句怎么实现数据库分页?
CREATE PROC sp_PageView@tbname sysname, --要分页显示的表名@FieldKey nvarchar(1000),--用于定位记录的主键(惟一键)字段,可以是逗号分隔的多个字段@PageCurrent int=1,--要显示的页码@PageSize int=10,--每页的大小(记录数)@FieldShownvarchar(1000)=, --以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段@FieldOrdernvarchar(1000)=,--以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC用于指定排序顺序@Where nvarchar(1000)=,--查询条件@PageCountint OUTPUT --总页数ASSET NOCOUNT ON--检查对象是否有效IF OBJECT_ID(@tbname) IS NULLBEGINRAISERROR(N对象%s不存在,1,16,@tbname)RETURNENDIF OBJECTPROPERTY(OBJECT_ID(@tbname),NIsTable)=0AND OBJECTPROPERTY(OBJECT_ID(@tbname),NIsView)=0AND OBJECTPROPERTY(OBJECT_ID(@tbname),NIsTableFunction)=0BEGINRAISERROR(N%s不是表、视图或者表值函数,1,16,@tbname)RETURNEND--分页字段检查IF ISNULL(@FieldKey,N)=BEGINRAISERROR(N分页处理需要主键(或者惟一键),1,16)RETURNEND--其他参数检查及规范IF ISNULL(@PageCurrent,0)<1 SET @PageCurrent=1IF ISNULL(@PageSize,0)<1 SET @PageSize=10IF ISNULL(@FieldShow,N)=N SET @FieldShow=N*IF ISNULL(@FieldOrder,N)=NSET @FieldOrder=NELSESET @FieldOrder=NORDER BY +LTRIM(@FieldOrder)IF ISNULL(@Where,N)=NSET @Where=NELSESET @Where=NWHERE (+@Where+N)--如果@PageCount为NULL值,则计算总页数(这样设计可以只在第一次计算总页数,以后调用时,把总页数传回给存储过程,避免再次计算总页数,对于不想计算总页数的处理而言,可以给@PageCount赋值)IF @PageCount IS NULLBEGINDECLARE @sql nvarchar(4000)SET @sql=NSELECT @PageCount=COUNT(*)+N FROM +@tbname+N +@WhereEXEC sp_executesql @sql,N@PageCount int OUTPUT,@PageCount OUTPUTSET @PageCount=(@PageCount+@PageSize-1)/@PageSizeEND--计算分页显示的TOPN值DECLARE @TopN varchar(20),@TopN1 varchar(20)SELECT @TopN=@PageSize,@TopN1=@PageCurrent*@PageSize--第一页直接显示IF @PageCurrent=1EXEC(NSELECT TOP +@TopN+N +@FieldShow+N FROM +@tbname+N +@Where+N +@FieldOrder)ELSEBEGIN--生成主键(惟一键)处理条件DECLARE @Where1 nvarchar(4000),@s nvarchar(1000)SELECT @Where1=N,@s=@FieldKeyWHILE CHARINDEX(N,,@s)>0SELECT @s=STUFF(@s,1,CHARINDEX(N,,@s),N),@Where1=@Where1+N AND a.+LEFT(@s,CHARINDEX(N,,@s)-1)+N=+LEFT(@s,CHARINDEX(N,,@s)-1)SELECT @Where1=STUFF(@Where1+N AND a.+@s+N=+@s,1,5,N),@TopN=@TopN1-@PageSize--执行查询EXEC(NSET ROWCOUNT +@TopN1+N SELECT +@FieldKey+N INTO # FROM +@tbname+N +@Where+N +@FieldOrder+N SET ROWCOUNT +@TopN+N DELETE FROM #+N SELECT +@FieldShow+N FROM +@tbname+N a WHERE EXISTS(SELECT * FROM # WHERE +@Where1+N) +@FieldOrder)END
发表评论