求助:大数据量SQLSERVER 数据库分页显示的高效查询语句写法

时间:2021-07-04 11:31:45
小弟最近在用JSP对SQLSERVER 实现分页展现时,感到自己在分页展示时使用的SQL语句不好。我现在的SQL写法是这样的: 
SELECT TOP 10 * 
FROM table 
WHERE (Key NOT IN 
          (SELECT TOP 10 Key 
         FROM table 
         )) 
not in 效率好像不高。
在数据量不大的时候,翻页实现起来比较容易,但是,如果是10多万条数据,这种方法就太不好了。 
哪位老大能给指点一个新的效率比较高的写法? 
感激不尽。。。

3 个解决方案

#1


--功能:通用数据库分页
--设计:王文涛
--电邮:wwtcpu@163.com
--QQ: 471432567

CREATE PROCEDURE Ture_Page

    @PageSize    int,        --每页的行数
    @PageIndex    int,        --1 代表第一页
    @Col        varchar(200),    --要显示的字段
    @Table        varchar(200),    --所用到的表,复条的话就写from与where之间的内容
    @Where    varchar(200)='',    --所用到的条件
    @OKey        varchar(50),    --排序字段
    @Order        varchar(20)='ASC'    --排序方式

as
 declare @cmdstr varchar(2000)
 set nocount on
        
        set @cmdstr='select top '
        set @cmdstr=@cmdstr+convert(nvarchar,@PageSize)
        if @Order='DESC' and @PageIndex>1
 set @cmdstr=@cmdstr+' '+@Col+' from '+@Table+' where '+@OKey+'<'
        else if @PageIndex=1
 set @cmdstr=@cmdstr+' '+@Col+' from '+@Table+' where '+@OKey+'>='
        else
 set @cmdstr=@cmdstr+' '+@Col+' from '+@Table+' where '+@OKey+'>'
        if @PageIndex>1
          begin
  if @Order='ASC'
             set @cmdstr=@cmdstr+'(select max ('+@OKey+') from (select top '
 else
        set @cmdstr=@cmdstr+'(select min ('+@OKey+') from (select top ' 
            set @cmdstr=@cmdstr+convert(nvarchar,(@PageIndex-1)*@PageSize)
            set @cmdstr=@cmdstr+' '+@OKey+' from '+@Table+' order by '+@OKey+' '+@Order+') as t) '
          end
        else
          set @cmdstr=@cmdstr+'0 '
        if @Where<>''
            set @cmdstr=(@cmdstr+' and '+@Where+' order by '+@OKey+' '+@Order)
        else
            set @cmdstr=(@cmdstr+'order by '+@OKey+' '+@Order)
        
 print @cmdstr
        exec(@cmdstr)
    set nocount off
GO

#2


忘了说了,实际用是把 print @cmdstr 这一行去掉就行了,那一句是我在测试时加上的

#3


mark

#1


--功能:通用数据库分页
--设计:王文涛
--电邮:wwtcpu@163.com
--QQ: 471432567

CREATE PROCEDURE Ture_Page

    @PageSize    int,        --每页的行数
    @PageIndex    int,        --1 代表第一页
    @Col        varchar(200),    --要显示的字段
    @Table        varchar(200),    --所用到的表,复条的话就写from与where之间的内容
    @Where    varchar(200)='',    --所用到的条件
    @OKey        varchar(50),    --排序字段
    @Order        varchar(20)='ASC'    --排序方式

as
 declare @cmdstr varchar(2000)
 set nocount on
        
        set @cmdstr='select top '
        set @cmdstr=@cmdstr+convert(nvarchar,@PageSize)
        if @Order='DESC' and @PageIndex>1
 set @cmdstr=@cmdstr+' '+@Col+' from '+@Table+' where '+@OKey+'<'
        else if @PageIndex=1
 set @cmdstr=@cmdstr+' '+@Col+' from '+@Table+' where '+@OKey+'>='
        else
 set @cmdstr=@cmdstr+' '+@Col+' from '+@Table+' where '+@OKey+'>'
        if @PageIndex>1
          begin
  if @Order='ASC'
             set @cmdstr=@cmdstr+'(select max ('+@OKey+') from (select top '
 else
        set @cmdstr=@cmdstr+'(select min ('+@OKey+') from (select top ' 
            set @cmdstr=@cmdstr+convert(nvarchar,(@PageIndex-1)*@PageSize)
            set @cmdstr=@cmdstr+' '+@OKey+' from '+@Table+' order by '+@OKey+' '+@Order+') as t) '
          end
        else
          set @cmdstr=@cmdstr+'0 '
        if @Where<>''
            set @cmdstr=(@cmdstr+' and '+@Where+' order by '+@OKey+' '+@Order)
        else
            set @cmdstr=(@cmdstr+'order by '+@OKey+' '+@Order)
        
 print @cmdstr
        exec(@cmdstr)
    set nocount off
GO

#2


忘了说了,实际用是把 print @cmdstr 这一行去掉就行了,那一句是我在测试时加上的

#3


mark