zoukankan      html  css  js  c++  java
  • 毫秒级百万数据分页存储过程

    原文地址:http://www.searchdatabase.com.cn/showcontent_43246.htm

     数据分页一直是一个经久不衰的话题,今天把我使用的分页代码继续分享,首先生成一个百万数据表;耗时 33 秒;

      然后创建分页存储过程;这个是基于SQL 2005 的ROW_NUMBER的,SQL 2000 不适; SQL 2008 我没有安装,所以也没有测试过,估计应该可以运行。

      2种算法可以选择 1. 使用 BETWEEN ; 2. TOP ; 代码中已经注释了.

      我测试了一下2种方法基本没有什么区别;代码如下:

    USE [DATA_TEMP] 
    GO 
    /****** 对象:  StoredProcedure [dbo].[im531_Page]    脚本日期: 11/26/2010 10:52:35 ******/ 
    SET ANSI_NULLS ON 
    GO 
    SET QUOTED_IDENTIFIER ON 
    GO 
    -- ============================================= 
    -- Author:  im531  
    -- Create date: 2010-10-25 
    -- Description: SQL 2005 ROW_NUMBER 分页 
    -- Modify Date: 2010-10-26 
    -- ============================================= 
    CREATE PROCEDURE [dbo].[im531_Page] 
     @TabeName AS NVARCHAR(50), 
     @Fields AS NVARCHAR(1024), 
     @SearchWhere AS NVARCHAR(1024), 
     @OrderFields AS NVARCHAR(1024), 
     @pageNumber AS INT, 
     @page AS INT 
    AS 
    BEGIN 
     SET NOCOUNT ON; 
     DECLARE @sqlType AS TINYINT 
     SET @sqlType = 0  -- 0 BETWEEN   1 TOP 
     DECLARE @sql AS NVARCHAR(MAX) 
     IF @SearchWhere <> '' SET @SearchWhere = ' WHERE ' + @SearchWhere 
     IF @page < 2 SET @page = 1 
     IF @page = 1 
      BEGIN 
       SET @sql = 'SELECT TOP ' + CONVERT(NVARCHAR(20),@pageNumber) + ' ' + @Fields 
        + 'FROM [' + @TabeName + '][a] WITH(NOLOCK) ' + @SearchWhere + ' ORDER BY ' + @OrderFields 
      END 
     ELSE 
      BEGIN 
       --临时表 
       SET @sql = ';WITH [Page_____Table] AS(' 
        + 'SELECT ROW_NUMBER() OVER(ORDER BY ' + @OrderFields + ') AS [RowNow],' + @Fields 
        + 'FROM ['+ @TabeName +' ][a] WITH(NOLOCK) ' + @SearchWhere 
        + ')' 
       --查找当前页面记录 
       IF @sqlType = 0 
        BEGIN 
        -- A USE BETWEEN 
         SET @sql = @sql + 'SELECT *' 
          + 'FROM [Page_____Table] WITH(NOLOCK)' 
          + 'WHERE [RowNow] BETWEEN ' + CONVERT(NVARCHAR(20),(@page - 1) * @pageNumber + 1) + ' AND ' + CONVERT(NVARCHAR(20),@page * @pageNumber) 
          + 'ORDER BY [RowNow]' 
        END 
       ELSE 
        BEGIN 
        -- B USE TOP 
         SET @sql = @sql + 'SELECT TOP ' + CONVERT(NVARCHAR(20),@pageNumber) + ' *' 
          + 'FROM [Page_____Table] WITH(NOLOCK)' 
          + 'WHERE [RowNow] > ' + CONVERT(NVARCHAR(20),(@page - 1) * @pageNumber) 
          + 'ORDER BY [RowNow]' 
        END 
      END 
     EXEC(@sql) 
    END

      然后测试分页性能;每页显示20条记录, 百万数据最大50000页,当前页采用随机数取值;

    DECLARE @d DATETIME 
    SET @d = GETDATE() 
    DECLARE @M AS INT;DECLARE @N AS INT;DECLARE @cPage AS INT 
    SET @M = 50000;SET @N = 1 
    SET @cPage = CAST((rand()*(@M-@N)+@N) AS INT) 
    EXECUTE [im531_Page] 
     @TabeName = 'Table_1', 
     @Fields = '[a],[b]', 
     @SearchWhere = '[a] > 0', 
     @OrderFields = '[a] DESC', 
     @pageNumber = 20, 
     @page = @cPage


    SELECT [当前页] = @cPage,[分页执行耗时间(毫秒)] = DATEDIFF(ms,@d,GETDATE())

      在我的机器上面测试均为毫秒级!!!!

      

      

      

      

  • 相关阅读:
    BZOJ3732: Network(Kruskal重构树)
    AtCoder Beginner Contest 103
    2018.7.21NOIP模拟赛?解题报告
    PE刷题记
    杜教筛入门
    浅谈积性函数的线性筛法
    BZOJ4916: 神犇和蒟蒻(杜教筛)
    BZOJ2818: Gcd(莫比乌斯反演)
    LD1-B(最短路径-SPFA)
    UVa 10837 A Research Problem 欧拉函数
  • 原文地址:https://www.cnblogs.com/niaowo/p/3859799.html
Copyright © 2011-2022 走看看