SQL大数据查询分页存储过程
最后一页分页一卡死,整个网站的性能都会非常明显的下降,不知道为啥,微软有这个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大数据查询分页存储过程的更多相关文章
- [转]Sql server 大数据量分页存储过程效率测试附代码
本文转自:http://www.cnblogs.com/lli0077/archive/2008/09/03/1282862.html 在项目中,我们经常遇到或用到分页,那么在大数据量(百万级以上)下 ...
- SQL 大数据查询如何进行优化?
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而 ...
- SQL命令语句进行大数据查询如何进行优化
SQL 大数据查询如何进行优化? 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索 2.应尽量避免在 where 子句中对字段进行 null 值 ...
- MySQL大数据量分页查询方法及其优化
MySQL大数据量分页查询方法及其优化 ---方法1: 直接使用数据库提供的SQL语句---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N---适 ...
- Access大数据高效分页语句
Access大数据高效分页语句 oracle的分页查询可以利用rowid伪列. db2的分页查询可以利用row_number() over()聚合函数. mysql有limit. access仿佛先天 ...
- Facebook 正式开源其大数据查询引擎 Presto
Facebook 正式宣布开源 Presto —— 数据查询引擎,可对250PB以上的数据进行快速地交互式分析.该项目始于 2012 年秋季开始开发,目前该项目已经在超过 1000 名 Faceboo ...
- 比hive快10倍的大数据查询利器presto部署
目前最流行的大数据查询引擎非hive莫属,它是基于MR的类SQL查询工具,会把输入的查询SQL解释为MapReduce,能极大的降低使用大数据查询的门槛, 让一般的业务人员也可以直接对大数据进行查询. ...
- 海胜专访--MaxCompute 与大数据查询引擎的技术和故事
摘要:在2019大数据技术公开课第一季<技术人生专访>中,阿里巴巴云计算平台高级技术专家苑海胜为大家分享了<MaxCompute 与大数据查询引擎的技术和故事>,主要介绍了Ma ...
- SQL大数据操作统计
SQL大数据操作统计 1:select count(*) from table的区别SELECT object_name(id) as TableName,indid,rows,rowcnt FROM ...
随机推荐
- Qt之自定义界面(右下角冒泡)
简述 网页右下角上经常会出现一些提示性的信息,桌面软件中也比较常见,类似360新闻.QQ消息提示一样! 这种功能用动画实现起来很简单,这节我们暂时使用定时器来实现,后面章节会对动画框架进行详细讲解. ...
- Android开发时提示Your project contains error(s),please fix them be
有次在使用eclipse写好Android的代码,代码没有报错.然后 想在AVD中运行测试时,总是会弹出错误框,提示信息为: “Your project contains error(s),pl ...
- hdu 4612 Warm up(缩点+树上最长链)
本来就是自己负责图论,结果水了= = 题目其实很裸,就是求桥的数量,只是要新加上一条边罢了.做法:先缩点.再在树上搜最长链(第一场多校的hdu 4607Park Visit就考了最长链,小样,套个马甲 ...
- LeetCode Binary Tree Preorder Traversal 先根遍历
题意:给一棵树,求其先根遍历的结果. 思路: (1)深搜法: /** * Definition for a binary tree node. * struct TreeNode { * int va ...
- Windows下FFmpeg快速入门
本系列文章导航 Windows下FFmpeg快速入门 ffmpeg参数解释 mencoder和ffmpeg参数详解(Java处理视频) Java 生成视频缩略图(ffmpeg) 使用ffmpeg进行视 ...
- 载入在线jQuery库
以百度库为例 <script src="http://libs.baidu.com/jquery/1.11.1/jquery.min.js"></script&g ...
- golang windows程序获取管理员权限(UAC ) via gocn
golang windows程序获取管理员权限(UAC ) 在windows上执行有关系统设置命令的时候需要管理员权限才能操作,比如修改网卡的禁用.启用状态.双击执行是不能正确执行命令的,只有右键以管 ...
- HDU 5818 Joint Stacks
Joint Stacks Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tota ...
- [Everyday Mathematics]20150206
$$\bex \sen{fg}_{L^1}\leq C\sen{f}_{L^{r,\al}}\sen{g}_{L^{r',\al'}}, \eex$$ 其中 $$\bex f\in L^{r,\al} ...
- java 中常见异常
1. Java.lang.NullPointerException 这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用了未经初始化的对象或者是不存在的 ...