个人总结:

本人以前写的一篇,在大数据时很明显,现换以下存储过程:

 

ALTER   procedure   sp_pagesite   
  (   
  
/*   
  @Tables           表名                                         必选     
  @PrimaryKey   主关键字                                 必选   
  @pagesize       页码大小                                 可选     默认值:1   
  @pageindex     当前页                                     可选     默认值:1   
  @docount         是否只统计总记录数             可选   默认值:否   
  @Fields           选择字段                                 可选   默认:所有字段   
  @Sort               排序语句,不带Order   By     可选   
  @Filter           过滤语句,不带Where           可选   
  
*/   
  
@Tables   nvarchar(400),   
  
@PrimaryKey   nvarchar(100),   
  
@pagesize   int=1,   
  
@pageindex   int=1,   
  
@docount   bit=0,   
  
@Fields   varchar(1000)   =   '*',   
  
@Sort   varchar(1000)   =   NULL,   
  
@Filter   varchar(1000)   =   NULL)   
  
as   
  
set   nocount   on   
    
  
DECLARE   @strFilter   varchar(1000)   
  
DECLARE   @strSort   varchar(1000)   
  
IF   @Filter   IS   NOT   NULL   AND   @Filter   !=   ''   
  
BEGIN   
  
SET   @strFilter   =   '   WHERE   '   +   @Filter   +   '   '   
  
END   
  
ELSE   
  
BEGIN   
  
SET   @strFilter   =   ''   
  
END   
  
IF   @Sort   IS   Not   NULL   And   @Sort!=''   
                  
Begin   
                                  
Set   @strSort='order   by   '+@Sort+''   
                  
End   
                            
  
if(@docount=1)   
    
  
exec('select   count('+@PrimaryKey+')   from   '+@Tables+'   '+@strFilter+'')   
  
else   
  
begin   
  
declare   @PageLowerBound   int   
  
declare   @PageUpperBound   int   
  
set   @PageLowerBound=(@pageindex-1)*@pagesize   
  
set   @PageUpperBound=@PageLowerBound+@pagesize   
  
create   table   #pageindex(id   int   identity(1,1)   not   null,nid   int)   
  
set   rowcount   @PageUpperBound   
  
exec(   
  
'   
  insert   into   #pageindex(nid)   
  select   
'+@PrimaryKey+'   from   '+@Tables+'   '+@strFilter+'   '+@strSort+'   
  select   O.
'+@Fields+'   
  from   
'+@Tables+'   O,#pageindex   p   
  where   O.
'+@PrimaryKey+'=p.nid   and   p.id>'+@PageLowerBound+'   and   p.id<='+@PageUpperBound+'   order   by   p.id   
  
'   
  ) 
  drop table #PageIndex  
  
end   
  
set   nocount   off   

注:此存储过程需在一个主健(PrimaryKey)为索引,而ROW_NUMBER()不用,各有各的好处,看情况而用!

在非视图下,用ROW_NUMBER分页时(Row_Number()虽然它必须先为10万条记条生成RowNumber,但是在百万级数据下效率不会很差),用日期排序只要不把大文本数据读出来效率还是行的。或者用id进行排序那把大文本数据读出来也还行。
而上面的方法就只要提供一个主健(PrimaryKey)为索引不管是视图还是表读取效率都还行。

附文章:SQL Server 2005下的分页SQL

 

其实基本上有三种方法:

1、使用SQL Server 2005中新增的ROW_NUMBER

几种写法分别如下:

 

1大数据的通用分页总结!SELECT TOP 20 * FROM (SELECT
2大数据的通用分页总结!   ROW_NUMBER() OVER (ORDER BY Namec) AS RowNumber,
3大数据的通用分页总结!   *
4大数据的通用分页总结!FROM
5大数据的通用分页总结!   dbo.mem_member) _myResults
6大数据的通用分页总结!WHERE
7大数据的通用分页总结!   RowNumber > 10000
8大数据的通用分页总结!

 

1大数据的通用分页总结!SELECT * FROM (SELECT
2大数据的通用分页总结!   ROW_NUMBER() OVER (ORDER BY Namec) AS RowNumber,
3大数据的通用分页总结!   *
4大数据的通用分页总结!FROM
5大数据的通用分页总结!   dbo.mem_member) _myResults
6大数据的通用分页总结!WHERE
7大数据的通用分页总结!   RowNumber between 10000 and 10020

 

1大数据的通用分页总结!WITH OrderedResults AS 
2大数据的通用分页总结!
3大数据的通用分页总结!(SELECT *, ROW_NUMBER() OVER (order by Namec) as RowNumber FROM dbo.mem_member)
4大数据的通用分页总结!
5大数据的通用分页总结!SELECT * 
6大数据的通用分页总结!
7大数据的通用分页总结!FROM OrderedResults
8大数据的通用分页总结!
9大数据的通用分页总结!WHERE RowNumber between 10000 and 10020

不管哪种写法,性能都不理想。在8,9万条数据的情况下要运行6秒左右。

2、使用临时表再加存储过程

 1大数据的通用分页总结!BEGIN
 2大数据的通用分页总结!                DECLARE @PageLowerBound int
 3大数据的通用分页总结!                DECLARE @PageUpperBound int
 4大数据的通用分页总结!                
 5大数据的通用分页总结!                -- Set the page bounds
 6大数据的通用分页总结!                SET @PageLowerBound = 10000
 7大数据的通用分页总结!                SET @PageUpperBound = 10020
 8大数据的通用分页总结!
 9大数据的通用分页总结!                -- Create a temp table to store the select results
10大数据的通用分页总结!                Create Table #PageIndex
11大数据的通用分页总结!                (
12大数据的通用分页总结!                    [IndexId] int IDENTITY (11NOT NULL,
13大数据的通用分页总结!                    [Id] varchar(18
14大数据的通用分页总结!                )
15大数据的通用分页总结!                
16大数据的通用分页总结!                -- Insert into the temp table
17大数据的通用分页总结!                declare @SQL as nvarchar(4000)
18大数据的通用分页总结!                SET @SQL = 'INSERT INTO #PageIndex (Id)'
19大数据的通用分页总结!                SET @SQL = @SQL + ' SELECT'
20大数据的通用分页总结!                SET @SQL = @SQL + ' TOP ' + convert(nvarchar@PageUpperBound)
21大数据的通用分页总结!                SET @SQL = @SQL + ' m_id'
22大数据的通用分页总结!                SET @SQL = @SQL + ' FROM dbo.mem_member'
23大数据的通用分页总结!                SET @SQL = @SQL + ' ORDER BY NameC'
24大数据的通用分页总结!                
25大数据的通用分页总结!                -- Populate the temp table
26大数据的通用分页总结!                exec sp_executesql @SQL
27大数据的通用分页总结!
28大数据的通用分页总结!                -- Return paged results
29大数据的通用分页总结!                SELECT O.*
30大数据的通用分页总结!                FROM
31大数据的通用分页总结!                    dbo.mem_member O,
32大数据的通用分页总结!                    #PageIndex PageIndex
33大数据的通用分页总结!                WHERE
34大数据的通用分页总结!                    PageIndex.IndexID > @PageLowerBound
35大数据的通用分页总结!                    AND O.[m_Id] = PageIndex.[Id]
36大数据的通用分页总结!                ORDER BY
37大数据的通用分页总结!                    PageIndex.IndexID
38大数据的通用分页总结!                
39大数据的通用分页总结!drop table #PageIndex            
40大数据的通用分页总结!                END

而使用这种方法,在同样的情况下用时只需1秒。
看样子,row_number是个鸡肋。

3、如果觉得临时表不好,还可以使用SET ROWCOUNT

 1大数据的通用分页总结!begin
 2大数据的通用分页总结!DECLARE @first_id varchar(18), @startRow int
 3大数据的通用分页总结!    
 4大数据的通用分页总结!SET ROWCOUNT 10000
 5大数据的通用分页总结!SELECT @first_id = m_id FROM mem_member ORDER BY m_id
 6大数据的通用分页总结!
 7大数据的通用分页总结!SET ROWCOUNT 20
 8大数据的通用分页总结!
 9大数据的通用分页总结!SELECT m.* 
10大数据的通用分页总结!FROM mem_member m
11大数据的通用分页总结!WHERE m_id >= @first_id
12大数据的通用分页总结!ORDER BY m.m_id
13大数据的通用分页总结!
14大数据的通用分页总结!SET ROWCOUNT 0
15大数据的通用分页总结!end

 

不过,这种方法有缺点。按ID排序就快,按其他字段排序就慢。

相关文章:

  • 2021-09-12
  • 2021-06-02
  • 2021-12-28
  • 2022-12-23
  • 2022-02-04
  • 2022-12-23
猜你喜欢
  • 2021-10-06
  • 2021-11-20
  • 2022-02-24
  • 2022-02-15
相关资源
相似解决方案