百万数据分页显示效率的问题
String sql="select * from users where userID between "+num1+" and "+num2;
String sql="select * from (" +"select top "+num1+" * from "+"(select top "+num2+" * from users order by userID) a "+"order by a.userID desc" +") b order by b.userID";String sql="select * from " +"( " +"select t.* , (select count(userID) from users where userID < t.userID) + 1 px from users t" +") m " +"where px between "+num1+" and "+num2;
String sql="select * from ("+"select *,px=(select count(1)+1 from users where userID<t.userID) from users t "+") tt "+"where px between "+num1+" and "+num2;String sql="select count(userID) as sum from users";
package dao;import java.sql.CallableStatement;import java.sql.Connection;import util.MyConnection;public class GbDao { private Connection conn = null; private CallableStatement cs=null; public void initConnection() throws Exception { MyConnection myconn= new MyConnection(); //初始化MyConnection对象 conn = myconn.getConnection(); //调用MyConnection的getConnection()方法得到数据库连接 } public String gbht(String gwm,String zmlm){ String msg=null; String sql="{?=call F_HD_GBHT(?,?)}"; System.out.println("sql="+sql); try{this.initConnection(); CallableStatement cs=conn.prepareCall(sql); cs.registerOutParameter(1, java.sql.Types.VARCHAR); cs.setString(2, gwm); cs.setString(3, zmlm); cs.execute(); msg=cs.getString(1); }catch(Exception ex){ ex.printStackTrace(); }finally{ try{ if(cs!=null){ cs.close(); } }catch(Exception ex){ ex.printStackTrace(); } } return msg; }}
[解决办法]
不用都查出来吧,我建议就加一个top过滤一下,然后增加查询条件,过滤数据,根据条件建立索引优化
[解决办法]
MS SQL的分页使用MS的游标进行分页速度会比较快(hibernate就是使用这种分页),TOP分页只在前几页的数据速度快点,后面的数据速度就会很慢。
CREATE procedure cursorPage
@sqlstr nvarchar(4000), --查询字符串
@CurrPage int, --第N页
@pagesize int, --每页行数
@RecordCount int output , --记录总数
@PageCount int output, --页面总数
@CurrCount int output --当前页面记录条数
as
set nocount on
declare @P1 int --P1是游标的id
exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1,@RecordCount=@RecordCount output
--select ceiling(1.0*@RecordCount/@pagesize) as PageCount,@RecordCount as RecordCount,@CurrPage as CurrPag
set @PageCount = ceiling(1.0*@RecordCount/@pagesize)
--set @CurrPage=(@CurrPage-1)*@pagesize+1
if @CurrPage > @PageCount Set @CurrPage = @PageCount
if @CurrPage - @PageCount >= 0 and (@RecordCount % @PageSize) > 0
Begin
Set @CurrCount = @RecordCount % @PageSize
End
Else
Begin
Set @CurrCount = @PageSize
End
exec sp_cursorfetch @P1,16,@CurrPage,@CurrCount
exec sp_cursorclose @P1
set nocount off
GO
[解决办法]
哪就建议直接使用hibernate的分页,因为Hibernate会针对不同的数据库产生不同的分页代码。
速度也不错
[解决办法]
select top 8 * from message where m_id not in(select top 16 m_id from message )