利用存储过程来实现分页性能比较

1.生成表

CREATE TABLE [T_User] (

[Id] [bigint] IDENTITY (1, 1) NOT NULL ,

[Name] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,

[Birthday] [datetime] NOT NULL CONSTRAINT [DF_User_Birthday] DEFAULT (getdate()),

CONSTRAINT [PK_User] PRIMARY KEY CLUSTERED

(

[Id]

) ON [PRIMARY]

) ON [PRIMARY]

GO

2.生成1000000的数据库量

declare @i bigint, @n int, @name nvarchar(50)

set @i = 1000000

set @name = ''

while @i > 0

begin

set @n = 50

set @name = ''

while @n > 0

begin

set @name = @name + char(rand() * 74 + 49)

set @n = @n - 1

end

insert into t_user([name], [birthday]) values (@name, dateadd(day, rand() * 1000, getdate()))

set        @i = @i - 1

end

select COUNT(*) FROM T_USER

3.存储过程

1.         使用Top

IF EXISTS (SELECT * FROM sysobjects WHERE type = 'P' AND NAME = 'up_Profile_UsersGet1')

BEGIN

PRINT 'Dropping Procedure up_Profile_UsersGet1'

DROP PROCEDURE up_Profile_UsersGet1

END

GO

PRINT 'Creating Procedure up_Profile_UsersGet1'

GO

/*--------------------------------------------------------------------------------------------

[描述]

使用TOP分页

--------------------------------------------------------------------------------------------*/

CREATE PROCEDURE [dbo].[up_Profile_UsersGet1]

(

@Name NVARCHAR(50) = NULL,

@Sort NVARCHAR(50) = NULL,

@PageNo INT = 0,

@PageSize INT = 0

)

AS

DECLARE

@SQL NVARCHAR(4000),

@Condition NVARCHAR(4000),

@Order NVARCHAR(500),

@PageCount BIGINT

BEGIN

SET @Order = ''

IF (@Sort IS NOT NULL) AND (LTRIM(RTRIM(@Sort)) <> '')

SET @Order = ' ORDER BY ' + @Sort

SET @SQL = ' 1=1 '

IF (@Name IS NOT NULL) AND (LTRIM(RTRIM(@Name)) <> '')

SET @SQL = @SQL + ' AND Name LIKE ''%' + @Name + '%'''

SET @Condition = @SQL

-- 得到总记录数

SET @SQL = 'SELECT @PageCount = COUNT(*) FROM T_User WHERE ' + @Condition

EXECUTE SP_EXECUTESQL @SQL, N'@PageCount INT OUT', @PageCount OUT

IF @PageSize > 0

BEGIN

SET @PageCount = (@PageCount + @PageSize - 1) / @PageSize -- 得到总页数

END

ELSE

BEGIN

SET @PageCount = 0

END

IF @PageNo > @PageCount - 1

SET @PageNo = @PageCount - 1

ELSE IF @PageNo < 0

SET @PageNo = 0

--PRINT @PageNo

IF @PageNo >= 0 AND @PageSize > 0

BEGIN

SET @SQL = 'SELECT TOP ' + CONVERT(NVARCHAR(20), @PageSize) + ' * FROM T_User WHERE '

SET @SQL = @SQL + @Condition + ' AND Id NOT IN (SELECT TOP '

SET @SQL = @SQL + CONVERT(NVARCHAR(20), @PageSize * @PageNo)

SET @SQL = @SQL + ' Id FROM T_User WHERE ' + @Condition + @Order + ')'

END

ELSE

BEGIN

SET @SQL = 'SELECT * FROM T_User WHERE ' + @Condition

END

SET @SQL = @SQL + @Order

PRINT @SQL

EXEC(@SQL)

SELECT @PageCount

END

2.         使用sp_cursoropen

IF EXISTS (SELECT * FROM sysobjects WHERE type = 'P' AND NAME = 'up_Profile_UsersGet2')

BEGIN

PRINT 'Dropping Procedure up_Profile_UsersGet2'

DROP PROCEDURE up_Profile_UsersGet2

END

GO

PRINT 'Creating Procedure up_Profile_UsersGet2'

GO

/*--------------------------------------------------------------------------------------------

[描述]

使用sp_cursoropen分页

--------------------------------------------------------------------------------------------*/

CREATE PROCEDURE [dbo].[up_Profile_UsersGet2]

(

@Name NVARCHAR(50) = NULL,

@Sort NVARCHAR(50) = NULL,

@PageNo INT = 0,

@PageSize INT = 0

)

AS

DECLARE

@SQL NVARCHAR(4000),

@p1 INT,

@Order NVARCHAR(500),

@PageCount INT

BEGIN

SET @Order = ''

IF (@Sort IS NOT NULL) AND (LTRIM(RTRIM(@Sort)) <> '')

SET @Order = ' ORDER BY ' + @Sort

SET @SQL = ' 1=1 '

IF (@Name IS NOT NULL) AND (LTRIM(RTRIM(@Name)) <> '')

SET @SQL = @SQL + ' AND Name LIKE ''%' + @Name + '%'''

SET @SQL = 'SELECT * FROM T_User WHERE' + @SQL + @Order

--初始化分页游标

EXEC sp_cursoropen

@cursor = @p1 OUTPUT,

@stmt = @SQL,

@scrollopt = 1,

@ccopt = 1,

@rowcount = @PageCount OUTPUT

SET @PageNo = @PageNo + 1

--计算总页数

IF ISNULL(@PageSize, 0) < 1

SET @PageSize = 10

SET @PageCount = (@PageCount + @PageSize - 1) / @PageSize

IF ISNULL(@PageNo, 0) < 1

SET @PageNo = 1

ELSE IF ISNULL(@PageNo, 0) > @PageCount

SET @PageNo = @PageCount

SET @PageNo = (@PageNo - 1) * @PageSize + 1

--显示指定页的数据

EXEC sp_cursorfetch @p1, 16, @PageNo, @PageSize

--关闭分页游标

EXEC sp_cursorclose @p1

SELECT @PageCount AS [PageCount]

END

3.         使用临时表,将主键放在临时表中

IF EXISTS (SELECT * FROM sysobjects WHERE type = 'P' AND NAME = 'up_Profile_UsersGet3')

BEGIN

PRINT 'Dropping Procedure up_Profile_UsersGet3'

DROP PROCEDURE up_Profile_UsersGet3

END

GO

PRINT 'Creating Procedure up_Profile_UsersGet3'

GO

/*--------------------------------------------------------------------------------------------

[描述]

使用临时表分页

--------------------------------------------------------------------------------------------*/

CREATE PROCEDURE [dbo].[up_Profile_UsersGet3]

(

@Name NVARCHAR(50) = NULL,

@Sort NVARCHAR(50) = NULL,

@PageNo INT = 0,

@PageSize INT = 0

)

AS

DECLARE

@SQL NVARCHAR(4000),

@Condition NVARCHAR(4000),

@Order NVARCHAR(500),

@PageCount BIGINT

BEGIN

SET @Order = ''

IF (@Sort IS NOT NULL) AND (LTRIM(RTRIM(@Sort)) <> '')

SET @Order = ' ORDER BY ' + @Sort

SET @SQL = ' 1=1 '

IF (@Name IS NOT NULL) AND (LTRIM(RTRIM(@Name)) <> '')

SET @SQL = @SQL + ' AND Name LIKE ''%' + @Name + '%'''

SET @Condition = @SQL

-- 得到总记录数

SET @SQL = 'SELECT @PageCount = COUNT(*) FROM T_User WHERE ' + @Condition

EXECUTE SP_EXECUTESQL @SQL, N'@PageCount INT OUT', @PageCount OUT

IF @PageSize > 0

BEGIN

SET @PageCount = (@PageCount + @PageSize - 1) / @PageSize -- 得到总页数

END

ELSE

BEGIN

SET @PageCount = 0

END

IF @PageNo > @PageCount - 1

SET @PageNo = @PageCount - 1

ELSE IF @PageNo < 0

SET @PageNo = 0

--PRINT @PageNo

IF @PageNo >= 0 AND @PageSize > 0

BEGIN

SET @SQL = 'SELECT * FROM T_User WHERE ' + @Condition + ' AND Id > '

SET @SQL = @SQL + CONVERT(NVARCHAR(20), @PageSize * @PageNo)

SET @SQL = @SQL + ' AND Id < ' + CONVERT(NVARCHAR(20), @PageSize * (@PageNo + 1) + 1)

END

ELSE

BEGIN

SET @SQL = 'SELECT * FROM T_User WHERE ' + @Condition

END

SET @SQL = @SQL + @Order

PRINT @SQL

EXEC(@SQL)

SELECT @PageCount

END

4.      性能比较

在查询分析器中执行语句

declare @t1 datetime, @t2 datetime

set @t1 = getdate()

exec up_Profile_UsersGet1 'HXH', 'BIRTHDAY DESC', 678, 10

set @t2 = getdate()

select @t2 - @t1

执行语句

耗费时间

exec up_Profile_UsersGet1 'HXH', 'BIRTHDAY DESC', 678, 10

00:01:01.407

exec up_Profile_UsersGet2 'HXH', 'BIRTHDAY DESC', 678, 10

00:00:21.580

exec up_Profile_UsersGet1 null, 'BIRTHDAY DESC', 678, 10

00:00:55.453

exec up_Profile_UsersGet2 null, 'BIRTHDAY DESC', 678, 10

00:00:21.373

exec up_Profile_UsersGet1 null, null, 678, 10

00:00:03.047

exec up_Profile_UsersGet2 null, null, 678, 10

00:00:18.327

exec up_Profile_UsersGet1 null, null, 111678, 10

00:00:09.330

exec up_Profile_UsersGet2 null, null, 111678, 10

00:00:16.190

转载于:https://www.cnblogs.com/angushine/archive/2008/07/30/1256872.html

利用存储过程来实现分页性能比较相关推荐

  1. MySQL— 索引,视图,触发器,函数,存储过程,执行计划,慢日志,分页性能...

    一.索引,分页性能,执行计划,慢日志 (1)索引的种类,创建语句,名词补充(最左前缀匹配,覆盖索引,索引合并,局部索引等): import sys # http://www.cnblogs.com/w ...

  2. oracle分页性能不同,oracle高效分页

    什么是分页查询 对于基于Web的应用而言,对查询的结果集进行分页是一个比较常见的需求.假设浏览器界面每页可以显示10条记录,最初界面显示头10条记录给用户,当终端用户点击"下一页" ...

  3. 客户端如何通过咏南中间件调用存储过程和数据分页查询和文件传输的演示

    客户端如何通过咏南中间件调用存储过程和数据分页查询和文件传输的演示 演示使用MSSQL 2000的存储过程,其它类型的数据库的存储过程的语法是有所不同的. 1)MSSQL2000通用数据分页存储过程, ...

  4. MySQL基础系列之 记一次利用存储过程实现2600万数据水平分表

    日常开发中我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表.这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,性能低下,如果涉及联合查询的情况,性能会更加糟糕.分表的目的 ...

  5. mysql分页与分页性能查询优化

    为什么80%的码农都做不了架构师?>>>    mysql分页就直接使用limit进行操作,limit如果我们直接不加任何处理可能数据大了就会很卡的. 一. 最常见MYSQL最基本的 ...

  6. oracle接收输入参数,Oracle带输入输出参数存储过程(包括sql分页功能)

    记录一下,免得以后忘记了又要到处去找. begin /*这里不能直接执行select语句但可以直接执行update.delete.insert语句*/ end里面不能接执行select语句,声明会话级 ...

  7. 用存储过程实现数据分页

    参考:http://blog.csdn.net/wellknow/archive/2004/07/29/55167.aspx 用的是NOT IN 的方法 /**//****************** ...

  8. MySQL利用存储过程清除所有表中的所有记录

    MySQL利用存储过程清除所有表中的所有记录 在使用MySQL过程中,难免会出现一些测试数据,然而这些测试数据在真正部署运行的时候,通常要被清楚掉,并且自增长的字段要回复初始值.如何高效快速的实现以上 ...

  9. 微信小程序利用缓存提高接口请求性能

    对于接口数据过多的接口可以使用缓存提升用户体验和性能,同时也可以防止用户重复请求过多次数 data: {leftMenuList:[],//左侧菜单数据rightContent:[],//右侧的商品数 ...

最新文章

  1. How to enable javascript in windows server 2008 R2 enterprise
  2. shiro+springboot分析思路
  3. npm安装less插件 - cmd篇
  4. 95-138-010-源码-Function-ProcessFunction
  5. Cron 表达式解析,crontab表达式解析
  6. Java基础知识总结(2022最新版一)|CSDN创作打卡
  7. MMCODE 1003: 小谭变美日记(c++)
  8. Minimum supported Gradle version is 4.6. Current version is 4.4.
  9. 分享一篇前端大佬关于前端职业规划的建议
  10. 左神---基础提升笔记
  11. 全球化经营必备,盘点主流跨境电商平台
  12. 超赞!每个设计师都应该了解的IOS编年史
  13. mfc 子窗口 跟随 主窗口
  14. 2017西安php行业工资,西安2020冬季平均工资出炉!基金、IT服务这些行业薪资高...
  15. 提供凭证不足 无法访问这台计算机,xp系统连接win7的共享打印机时显示“提供的凭证不足”怎么办...
  16. Android Notification 没有声音 没有震动 的情况
  17. oneplus two 刷入nethunter及 “刷机错误:7“
  18. Netbackup8.0以上版本,服务端生成证书,客户端获取、更新证书方式(整理中)
  19. win10电脑提示bootmgr is missing的解决方法
  20. 开视频聊天室怎么赚钱 如何利用聊天室赚钱

热门文章

  1. linux各版本使用率,Windows10系统各版本份额出炉:十月更新占有率不高。
  2. java 模拟实现mq,RabbitMQ的5种模式,并使用java进行模拟操作
  3. LTE-TDD与LTE-FDD技术比较
  4. [译] PHP7 数组:HashTable
  5. unix amp; linux oralce用户 内存使用情况分析
  6. Oracle 10.2.0.4和10.2.0.5 中 OEM bug 8350262
  7. [导入]ZT笑到内伤:史上最雷,最爆寒的电影字幕
  8. Zookeeper3.4.9分布式集群安装
  9. Vue创建组件的三种方式
  10. 函数语法:JS获取浏览器窗口大小 获取屏幕,浏览器,网页高度宽度(转载)...