我自己写的一个分页存储过程,请大家评评。

whybask 四川航空股份有限公司 技术总监  2005-09-28 12:10:29
程序优点:
做到了调用方便、通用;
由于是把查询结果先存放到临时表中,所以,不需要主查询有主键;
个人测试,在2.0G、1G内存、80万条记录条件下,最长需要4秒时间;

想请高手给点指点,看看是否能够优化,或者提出更好的方案。
-------------------------------------

首先实现这个分页的通用存储过程:

--------------------------------------------------------------
-- 通用分页查询过程
-- exec p_PageRecordset_Table '#TempTable',20,1,100,0
--------------------------------------------------------------
CREATE PROCEDURE p_PageRecordset_Table
(
@TableName NVARCHAR(100),--全局临时表名称
@PageSize INT, --每页的记录条数
@PageNumber INT, --当前页面
@TotalSize INT, --总记录条数
@TotalPage INT OUTPUT --总页数
)
AS
BEGIN

SET NOCOUNT ON
DECLARE @SqlText AS NVARCHAR(1000)

-- 计算总页数
IF @PageSize>0
BEGIN
SET @TotalPage=@TotalSize/@PageSize
IF (@PageSize*@TotalPage)<>@TotalSize
SET @TotalPage=@TotalPage+1
END
ELSE
BEGIN
SET @TotalPage=1
END

-- 校正输入参数
IF @PageNumber<1 SET @PageNumber=1
IF @PageNumber>@TotalPage SET @PageNumber=@TotalPage

IF @PageSize<=0 OR @TotalSize=0
BEGIN
--如果设置PageSize小于等于0,表示不分页。
SET @SqlText='
SELECT * FROM ' + @TableName + '
DROP TABLE ' + @TableName
END
ELSE
BEGIN
SET @SqlText='
SET NOCOUNT ON

SELECT * FROM ' + @TableName + '
WHERE
' + CAST((@PageNumber-1)*@PageSize+1 AS NVARCHAR(30)) + '<=ROWNUM and ROWNUM<=' + CAST(@PageNumber*@PageSize AS NVARCHAR(30)) + '
ORDER BY ROWNUM

DROP TABLE ' + @TableName
END

-- PRINT @SqlText
EXEC(@SqlText)

End
GO


-------------------------------------
调用实例:


DECLARE @PageSize INT
DECLARE @PageNumber INT
DECLARE @TotalSize INT
DECLARE @TotalPage INT

SET @PageSize=5
SET @PageNumber=1

SET NOCOUNT ON

-- 把查询的结果放到一个临时表中,供分页处理。
SELECT
CAST(EmployeeID as INT) AS EmployeeID, -- 如果源表中有自编号的字段,要转换一下。
LastName,
FirstName,
BirthDate,
Address,
Region,
PostalCode,
Country,
IDENTITY(INT,1,1) AS ROWNUM -- 添加一个新的编号列,供分页存储过程使用。
INTO #tbl_p_Page_List -- 可以随机生成一个临时表名
FROM Employees
ORDER BY LastName,FirstName



--------------------------------------------------
-- 以下是通用的分页过程
--------------------------------------------------
--取得总记录条数
SELECT @TotalSize=@@ROWCOUNT

-- 调用通用的分页处理过程
-- 注意:临时表中必须有自动编号的字段 IDENTITY(INT,1,1) AS ROWNUM
EXEC p_PageRecordset_Table '#tbl_p_Page_List',
@PageSize,@PageNumber,@TotalSize,@TotalPage OUTPUT
--------------------------------------------------

PRINT @TotalSize
PRINT @TotalPage

GO
...全文
244 点赞 收藏 7
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
zxbyhcsdn 2005-10-18
最好不用临时表!用的人多了,系统开销很大!
回复
whybask 2005-10-18
用了临时表,性能方面是要差一点。运行后,我查看了执行计划,大概的时间消耗比例如下

查询1:查询成本(相对于批处理):54.33%
table select(clustered index scan) 82%
table insert 成本 15%

查询2:查询成本(相对于批处理):45.67%
table scan 成本96%
Sort 成本 4%

可以看出,调用的分页过程,基本上也占用了一半的执行时间。就是想让大家看看,是否还能优化一下。
回复
syeerzy 2005-10-17
80W都要4秒。。。。性能不太行。 那最少的时候80W数据要多少?
回复
张海霖 2005-10-12
up
回复
lizq2004 2005-09-30
不错!
回复
whybask 2005-09-29
排序是在调用分页前的查询中完成的。这样可以更自由。
回复
天地客人 2005-09-29
不错,最好有排序列!
回复
相关推荐
请求分页存储管理(操作系统课设).rar
所有代码都是我自己写的,同时还对六种算法实现了图像化对比,内容十分丰富。若有采纳,在你的课设后面引用的参考文献中加入该条引用!!!望大家尊重版权!!!! 为了避免完全抄袭,里面的课设报告为PDF版,若...
很常用的存储过程
很常用的存储过程 1 用于产生10条评论数据 SETQUOTED_IDENTIFIERON GO SETANSI_NULLSON GO /**//*存储过程,用于产生10条评论数据*/ --------deletefromreviewswhereoperateID>15 -------...
自己动手操作系统(含源代码).part1
 本书是《自己动手操作系统》的第二版,通过一个具体的实例向读者呈现一个操作系统雏形的实现过程。有关操作系统的书籍资料可以找到很多,但是关注如何帮助读者实现一个试验性操作系统的书籍却不多见,本书便是从...
毕设——基于SpringBoot的电影荐系统
之前做的人工智能和深度学习方向的期末课题一直想博客记录下来着,无奈时间安排上的不足未曾实现,分别是基于深度学习的图像识别系统和基于YOLOv3的人体口罩佩戴检测系统,如果大家感兴趣的话可以找一起聊聊。...
自己动手操作系统(含源代码).part2
 本书是《自己动手操作系统》的第二版,通过一个具体的实例向读者呈现一个操作系统雏形的实现过程。有关操作系统的书籍资料可以找到很多,但是关注如何帮助读者实现一个试验性操作系统的书籍却不多见,本书便是从...
PowerJob 在线日志饱受好评的秘诀:小但实用的分布式日志系统
本文适合有 Java 基础知识的人群作者:HelloGitHub-SalieriHelloGitHub 推出的《讲解开源项目》系列。项目地址:https://github.com/KFC...
一个读者大佬精心总结的阿里、腾讯、宇宙条大厂 Offer 面经和硬核面试攻略
作者:见习格子衫去年11 月底,在经历了充分的思想斗争后,终于下定决心寄出了三方,历时三个多月的秋招也终于尘埃落定。过去的三个多月里,面试时间可能只有一个月左右,剩下的两个多月的时间都...
十大管理47个过程说明:含义,输入,输出,工具,解释
制定份正式批准项目或阶段的文件,并记录能反映干系人需要和期望的初步要求的过程 1、项目工作说明书 2、商业论证 3、协议 4、事业环境因素 5、组织过程资产 1、专家判断2、引导技术 ...
sql优化+索引优化+详解(存储过程+函数 创建千万的测试数据)
存储过程+函数 创建千万的测试数据 用MYSQL的存储过程创建千万级测试数据表 1创建表 CREATE TABLE `think_user` ( `uid` int(11) NOT NULL AUTO_INCREMENT, `u_name` varchar(20) NOT NULL, `u_pwd` varchar(64) ...
数据库的读写分离、分库分表(
虽然近十年来各种存储技术飞速发展,但关系数据库由于其 ACID 的特性和功能强大的 SQL 查询,目前还是各种业务系统中关键和核心的存储系统,很多场景下高性能的设计最核心的部分就是关系数据库的设计。不管是为了...
Mycat读写分离、主从切换、分库分表的操作记录
系统开发中,数据库是非常重要的一个点。除了程序的本身的优化,如:SQL语句优化、代码优化,数据库的处理本身优化也是非常重要的。主从、热备、分表分库等都是系统发展迟早会遇到的技术问题问题。Mycat是一个广受...
Oracle存储过程的一点使用总结
想起1年前在一个数据处理相关项目结束后,代金排主管让一个数据库开发总结文档和一个Toad、PL/SQL Developer工具的存储过程测试方法总结文档,并安排讲解给其他同事们(高级主管、主管、几年工作经验的开发同事...
计算机二级2017年3月第套,3月全国计算机等级二级office题库
最简单的计算机网络就只有两台计算机和连接它们的条链路,即两节点和条链路。下面是小编整理的关于全国计算机等级二级office题库,欢迎大家参考!、选择题1、下列数据结构中,属于非线性结构的是( ).A.循环...
Java学习的正确打开方式
对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读...博主所理解的学习,它是一个过程,...
强烈推荐大家看这篇文章:iOS开发常用三方库、插件、知名博客等等(特别有用)
Swift版本点击这里欢迎加入交QQ流群: 594119878github排名 ...引入评价机制:根据作者们的主观评价,对库是用"赞"、“很赞”、“非常赞”这3个评价伺候,便于大家在初次选择库时有一个选择依
万字总结:学习MySQL优化原理,这篇就够 了!【转】
说起MySQL的查询优化,相信大家收藏了堆奇技淫巧:不能使用SELECT *、不使用NULL字段、合理创建索引、为字段选择合适的数据类型..... 你是否真的理解这些优化技巧?是否理解其背后的工作原理?在实际场景下性能真...
iOS常用三方库、插件、知名技术博客、常用开发工具使用介绍等等,大家可以次性下载了!
iOS开发常用三方库、插件、知名博客等等,大家可以一览无余了,期待大家和我们一起共同维护,同时也期望大家随时能提出宝贵的意见。 重点说明:此库完全在TimLiu-iOS(大概16-7-9日fork)的基础上面更新,因没...
Mysql - 百万级数据查询优化笔记(PHP Script)
订阅、第一个书单、给哪篇文打赏最多、给哪篇文评论最多、你看过那个作 者的文时长最长、做过多少个书单,分享可以获得海星奖励 开发过程分为两部分处理: 时间轴:第一次做某个动作(注册账号/评论/长/打赏/...
读写分离mycat简单配置
系统开发中,数据库是非常重要的一个点。除了程序的本身的优化,如:SQL语句优化、代码优化,数据库的处理本身优化也是非常重要的。主从、热备、分表分库等都是系统发展迟早会遇到的技术问题问题。Mycat是一个广受...
牛逼!Java 从入门到精通,超全汇总版
文章目录Java 基础Head First JavaJava 核心技术卷一...Java 虚拟机Java 虚拟机规范HotSpot 实战自己动手 Java 虚拟机MySQLMySQL 基础教程SQL 基础教程深入浅出 MySQLMySQL 必知必会SQL 必知必会高性能 MySQLMySQL
Mycat 读写分离、主从切换、分库分表的操作记录
下面就针对Mycat的基础知识和应用做一总结性梳理,这些内容有的是从网上收集的,有的是自己做的测试验证信息,如有错误,烦谅解和指出! 一、MyCat简单介绍 MyCat是一个开源的分布式数据库系统,是一个
聊聊是如何拿到这么多大厂offer的
这是2021年的第5篇原创文章,原汁原味的技术之路尽在JerrycodesJerry 哥作为一个刚刚结束 2020 秋招的人,谈谈自己一开始的乌托邦和最后的实现Jerry 哥面试期间拿...
24个带后台的小程序源码
24个带有后台的小程序源码下载,供大家交流学习(后台语言多种)
CListControl设置颜色
CListControl类派生,设置单元格颜色,丰富功能
SSIM 指标说明 文章
介绍 SSIM 图像评价指标和由来,比较一般的图像质量评价标准,比较ssim 和尖峰信噪比的差异,等等,是英文资料
C语言--视频精讲
C语言作为被长期使用的编程语言,可以被运用到各种操作系统,游戏,开发中。本课程作为互联网上首家使用C99录制的C语言教程,展现了全面、专业。标准的C语言教程。可以帮助学员从基础开始一点点的深刻理解C语言。 a:0:{}
Linux系统管理员/网络管理员(PDF版)
两本非常好的Linux系统学习的书 系统管理主要介绍Linux系统的结构、管理、命令等 网络管理主要从网络协议角度出发阐述Linux的网络功能
STM32F103中文数据手册
这个里面包含了STM32F103的各种型号的数据手册,方面理解
QRegExp的详细解析
引言 正则表达式(regular expression)就是用一个“字符串”来描述一个特征,然后去验证另一个“字符串”是否符合这个特征。比如 表达式“ab+” 描述的特征是“一个 'a' 和 任意个 'b' ”,那么 'ab', 'abb', 'abbbbbbbbbb' 都符合这个特征。 正则表达式可以用来:(1)验证字符串是否符合指定特征,比如验证是否是合法的邮件地址。(2)用来查找字符串,从一个长的文本中查找符合指定特征的字符串,比查找固定字符串更加灵活方便。(3)用来替换,比普通的替换更强大。
WPF中用于嵌入其他进程窗口的自定义控件(AppContainer)
WPF中用于嵌入其他进程窗口的自定义控件(AppContainer) 具体见博文:http://blog.csdn.net/zzzwwwppp11199988899/article/details/78131292
发帖
应用实例
创建于2007-09-28

2.7w+

社区成员

MS-SQL Server 应用实例
申请成为版主
帖子事件
创建了帖子
2005-09-28 12:10
社区公告
暂无公告