最后一页分页一卡死,整个网站的性能都会非常明显的下降,不知道为啥,微软有这个BUG一直没处理好。希望SQL2012里不要有这个问题就好了。

参考代码如下:

-- =============================================
-- Author:        吉日嘎拉
-- Create date: 2012年02月23日
-- Description:    2012年02月23日编码规范化
-- =============================================
ALTER PROCEDURE [dbo].[GetRecordByPage] 
    @TableName          VARCHAR(4000),           -- 表名
    @SelectField        VARCHAR(4000),           -- 要显示的字段名(不要加select)
    @WhereConditional   VARCHAR(4000),           -- 查询条件(注意: 不要加 where)
    @SortExpression     VARCHAR(255),            -- 排序索引字段名
    @PageSize           INT = 20,                -- 页大小
    @PageIndex          INT = 1,                 -- 页码
    @RecordCount        INT OUTPUT,              -- 返回记录总数
    @SortDire           VARCHAR(5) = 'DESC'      -- 设置排序类型, 非 0 值则降序
AS
BEGIN

DECLARE @commandText VARCHAR(8000)      -- 主语句
    DECLARE @TopN INT                         -- 获取前几条记录
    DECLARE @PageCount INT                     -- 总共会是几页
    DECLARE @TopLimit INT                     -- 获取多少条记录
    DECLARE @SQLRowCount NVARCHAR(4000)     -- 用于查询记录总数的语句
    DECLARE @SQLOrder VARCHAR(400)          -- 排序类型
    DECLARE @SQLTemp VARCHAR(4000)          -- 临时变量

SET @SortExpression = LTRIM(RTRIM(@SortExpression))
    SET @SortDire = UPPER(LTRIM(RTRIM(@SortDire)))
    
    -- 这里是计算整体记录行数
    IF @RecordCount IS NULL
    BEGIN
        IF @WhereConditional != ''
        BEGIN
          SET @SQLRowCount = 'SELECT @RecordCount=COUNT(1) FROM ' + @TableName + ' WHERE ' + @WhereConditional
        END
        ELSE
        BEGIN
          SET @SQLRowCount = 'SELECT @RecordCount=COUNT(1) FROM ' + @TableName
        END
    END

-- SELECT @RecordCount=@@ROWCOUNT
    EXEC sp_executesql @SQLRowCount, N'@RecordCount INT OUT', @RecordCount out

IF @RecordCount IS NULL
    BEGIN
       SET @RecordCount = 0
    END
    
    -- 这里是控制页数最多少
    SET @PageCount = @RecordCount / @PageSize + 1
    
    -- 这里检查当前页的有效性
    IF (@PageIndex < 1)
    BEGIN
        SET @PageIndex = 1
    END
    
    -- 这里限制最后一页的有效性
    IF (@PageIndex > @PageCount)
    BEGIN
        SET @PageIndex = @PageCount
    END

IF @SortDire != 'ASC'
    BEGIN
        SET @SQLTemp = '<(SELECT MIN'
        SET @SQLOrder = ' ORDER BY ' + @SortExpression + ' DESC'
    END
    ELSE
    BEGIN
        set @SQLTemp = '>(SELECT MAX'
        set @SQLOrder = ' ORDER BY ' + @SortExpression + ' ASC'
    END
    
    -- 这里是调试信息
    -- SELECT @SQLOrder

-- 获取几条数据? 吉日嘎拉 2010-11-02 更新
    SET @TopN = @RecordCount - @PageSize * (@PageIndex - 1)
    IF @TopN > @PageSize
    BEGIN
        SET @TopN = @PageSize
    END

SET @TopLimit = @PageSize * (@PageIndex - 1)
    IF @TopLimit > @RecordCount
    BEGIN
        SET @TopLimit = @RecordCount
    END

SET @commandText = 'SELECT TOP ' + STR(@TopN) + ' ' + @SelectField + ' FROM '
        + @TableName + ' WHERE ' + @SortExpression + @SQLTemp + '('
        + RIGHT(@SortExpression, LEN(@SortExpression) - CHARINDEX('.', @SortExpression)) + ') FROM (SELECT TOP ' + STR(@TopLimit)
        + ' ' + @SortExpression + ' FROM ' + @TableName  + @SQLOrder + ') AS TableTemp)'
        + @SQLOrder

IF @WhereConditional != ''
        SET @commandText = 'SELECT TOP ' + STR(@TopN) + ' ' + @SelectField + ' FROM '
            + @TableName + ' WHERE ' + @SortExpression + @SQLTemp + '('
            + RIGHT(@SortExpression, LEN(@SortExpression) - CHARINDEX('.',@SortExpression)) + ') FROM (SELECT TOP ' + STR(@TopLimit)
            + ' ' + @SortExpression + ' FROM ' + @TableName + ' WHERE ' + @WhereConditional + ' '
            + @SQLOrder + ') AS TableTemp) AND ' + @WhereConditional + ' ' + @SQLOrder

IF @PageIndex = 1
    BEGIN
        -- 第一页的显示效率提高
        SET @SQLTemp = ''
        IF @WhereConditional != ''
            SET @SQLTemp = ' WHERE ' + @WhereConditional

SET @commandText = 'SELECT TOP ' + STR(@TopN) + ' ' + @SelectField 
                          + ' FROM ' + @TableName + @SQLTemp + ' ' + @SQLOrder
    END
    ELSE
    BEGIN    
        -- 解决大数据最有一页卡死的问题
        IF @PageIndex = @PageCount
        BEGIN
            IF @SortDire = 'ASC'
            BEGIN
                SET @SQLOrder = ' ORDER BY ' + @SortExpression + ' DESC'
            END
            ELSE
            BEGIN
                SET @SQLOrder = ' ORDER BY ' + @SortExpression + ' ASC'
            END
        
            SET @SQLTemp = ''
            IF @WhereConditional != ''
                SET @SQLTemp = ' WHERE ' + @WhereConditional
                
            SET @commandText = 'SELECT TOP ' + STR(@TopN) + ' ' + @SelectField 
                              + ' FROM ' + @TableName + @SQLTemp + ' ' + @SQLOrder
            
            SET @commandText = 'SELECT ' + @SelectField
                              + ' FROM (' + @commandText + ') AS TableTemp ORDER BY ' + @SortExpression + ' ' + @SortDire
        END
    END
    
    EXEC (@commandText)
    
    -- 这个是调试程序用的
    -- SELECT @commandText
    
END

SQL大数据查询分页存储过程的更多相关文章

  1. [转]Sql server 大数据量分页存储过程效率测试附代码

    本文转自:http://www.cnblogs.com/lli0077/archive/2008/09/03/1282862.html 在项目中,我们经常遇到或用到分页,那么在大数据量(百万级以上)下 ...

  2. SQL 大数据查询如何进行优化?

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而 ...

  3. SQL命令语句进行大数据查询如何进行优化

    SQL 大数据查询如何进行优化? 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索 2.应尽量避免在 where 子句中对字段进行 null 值 ...

  4. MySQL大数据量分页查询方法及其优化

    MySQL大数据量分页查询方法及其优化   ---方法1: 直接使用数据库提供的SQL语句---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N---适 ...

  5. Access大数据高效分页语句

    Access大数据高效分页语句 oracle的分页查询可以利用rowid伪列. db2的分页查询可以利用row_number() over()聚合函数. mysql有limit. access仿佛先天 ...

  6. Facebook 正式开源其大数据查询引擎 Presto

    Facebook 正式宣布开源 Presto —— 数据查询引擎,可对250PB以上的数据进行快速地交互式分析.该项目始于 2012 年秋季开始开发,目前该项目已经在超过 1000 名 Faceboo ...

  7. 比hive快10倍的大数据查询利器presto部署

    目前最流行的大数据查询引擎非hive莫属,它是基于MR的类SQL查询工具,会把输入的查询SQL解释为MapReduce,能极大的降低使用大数据查询的门槛, 让一般的业务人员也可以直接对大数据进行查询. ...

  8. 海胜专访--MaxCompute 与大数据查询引擎的技术和故事

    摘要:在2019大数据技术公开课第一季<技术人生专访>中,阿里巴巴云计算平台高级技术专家苑海胜为大家分享了<MaxCompute 与大数据查询引擎的技术和故事>,主要介绍了Ma ...

  9. SQL大数据操作统计

    SQL大数据操作统计 1:select count(*) from table的区别SELECT object_name(id) as TableName,indid,rows,rowcnt FROM ...

随机推荐

  1. 【转载】React入门-Todolist制作学习

    我直接看的这个React TodoList的例子(非常好!): http://www.reqianduan.com/2297.html 文中示例的代码访问路径:http://127.0.0.1:708 ...

  2. MyBatis 实践 -Mapper与DAO

    MyBatis 实践 标签: Java与存储 MyBatis简介 MyBatis前身是iBatis,是一个基于Java的数据持久层/对象关系映射(ORM)框架. MyBatis是对JDBC的封装,使开 ...

  3. HDU 1695 (莫比乌斯反演) GCD

    题意: 从区间[1, b]和[1, d]中分别选一个x, y,使得gcd(x, y) = k, 求满足条件的xy的对数(不区分xy的顺序) 分析: 虽然之前写过一个莫比乌斯反演的总结,可遇到这道题还是 ...

  4. bzoj2326: [HNOI2011]数学作业

    矩阵快速幂,分1-9,10-99...看黄学长的代码理解...然而他直接把答案保存在最后一行(没有说明...好吧应该是我智障这都不知道... #include<cstdio> #inclu ...

  5. Make AngularJS $http service behave like jQuery.ajax()(转)

    There is much confusion among newcomers to AngularJS as to why the $http service shorthand functions ...

  6. 【转】有趣的Autolayout示例-Masonry实现

    原文网址:http://tutuge.me/2015/05/23/autolayout-example-with-masonry/ 好久没有写Blog了,这段时间有点忙啊=.=本文举了3个比较有“特点 ...

  7. ECshop 每个数据库表结构说明

    ecs_account_log // 用户账目日志表 ecs_activity // 活动表(代码,名称,开始,结束,描述) ecs_ad // 广告表(位置,类型,名称,链接,图片,开始,结束,广告 ...

  8. Free Pascal的IDE界面乱码解决方法

    右击[Free Pascal]快捷图标,选[属性] [属性]窗口中,选择[选项]页,下拉[当前代码页(C)],选择[437 (美国)] 按[确定] 注意:[开始]菜单和桌面中的快捷图标都得设置.

  9. Chrome 实用调试技巧

    Chrome 实用调试技巧 2016-07-23 如今Chrome浏览器无疑是最受前端青睐的工具,原因除了界面简洁.大量的应用插件,良好的代码规范支持.强大的V8解释器之外,还因为Chrome开发者工 ...

  10. Tombstone crash

    首先,android平台应用程序可能产生以下四种crash:App层:Force close crashANR crashNative层:Tombstone crashKernel层:Kernel p ...