Server分页存储过程的五种方法及性能比较-SQL (server是什么意思)

教程大全 2025-07-19 10:56:51 浏览

数据库操作中,我们常常会用到 存储过程 对实现对查询的数据的 分页 处理,以方便浏览者的浏览。本文我们总结了五种SQL Server分页存储过程的方法,并对其性能进行了比较,接下来就让我们来一起了解一下这一过程。

Server分页存储过程的五种方法及性能比较

创建数据库data_Test :

插入数据:

1、利用select top 和select not in进行分页

具体代码如下:

2、利用select top 和 select max(列键)

3、利用select top和中间变量

4、利用Row_number() 此方法为SQL server 2005中新的方法,利用Row_number()给数据行加上索引

5、利用临时表及Row_number

以上的五种方法中,网上说第三种利用select top和中间变量的方法是效率最高的。

关于SQL Server数据库分页的存储过程的五种方法及性能比较的知识就介绍到这里了,如果您想了解更多SQL Server数据库的知识可以看一下这里的文章:,相信一定可以带给您收获的!

【编辑推荐】


如何做SQL Server性能测试

对于DBA来讲,我们都会做新服务器的性能测试。 我会从TPC的基准测试入手,使用HammerDB做整体性能评估(前身是HammerOra),跟厂商数据对比。 再使用DiskSpd针对性的测试磁盘IO性能指标(前身是SQLIO),再到SQLIOSIM测试存储的完整性,再到ostress并发压力测试,对于数据库服务器迁移,我们还会收集和回放Profiler Trace,并收集期间关键性能计数器做对比。 下面我着重谈谈使用HammerDB的TPC-C来做SQL Server基准测试。 自己写负载测试代码很困难为了模拟数据库的负载,你想要有多个应用程序用户和混合数据读写的语句。 你不想总是对单一行更新相同的值,或者只是重复插入假的值。 自己动手使用Powershell、C#等语言写负载测试脚本也不是不可能,只是太消耗时间,你需要创建或者恢复数据库,并做对应的测试。 免费而简单的压测SQL Server:使用HammerDB模拟OLTP数据库负载HammerDB是一个免费、开源的工具,允许你针对SQL Server、Oracle、MySQL和PostgreSQL等运行TPC-C和TPC-H基准测试。 你可以使用HammerDB来针对一个数据库生成脚本并导入测试。 HammerDB也允许你配置一个测试运行的长度,定义暖机阶段,对于每个运行的虚拟用户的数量。 首先,HammerDB有一个自动化队列,让你将多个运行在不同级别的虚拟用户整合到一个队列--你可以以此获得在什么级别下虚拟用户性能平稳的结果曲线。 你也可以用它来模拟用于示范或研究目的的不同负载。 用于SQL Server上的HammerDB的优缺点HammerDB是一个免费工具,它也极易访问和快速的启动基准测试和模拟负载的方法。 它的自动程序特性也是的运行工作负载相当自动。 主要缺点是它有一个学习曲线。 用户界面不是很直观,需要花费时间去习惯。 再你使用这个工具一段时间之后,将会更加容易。 HammerDB也不是运行每一个基准测试。 它不运行TPC-E基准,例如,SQL Server更热衷于当前更具发展的OLTP基准TPC-E。 如果你用HammerDB运行一个TPC-C基准,你应该理解它不能直接与供应商提供的TPC-C基准结果相比较。 但是,它是免费的、快速的、易用的。 基准测试使用案例基准测试负载不能精确模拟你的应用程序的特点。 每个负载是唯一的,在不同的系统有不同的瓶颈。 对于很多使用案例,使用预定义的基准测试仍然是非常有效的,包括以下性能的比较:多个环境(例如:旧的物理服务器,新的虚拟环境)使用各种因素的不同及时点(例如:使用共享存储和共享主机资源的虚拟机的性能)在配置改变前后的点当然,对一个数据库服务器运行基准测试可以影响其他SQL Server数据库或者相同主机上其他虚拟机的性能,在生产环境你确保有完善的测试计划。 对于自学和研究来说,有预配置的负载非常棒。 开始使用基准测试你可以从阅读HammerDB官方文档的“SQL Server OLTP Load Testing Guide”开始。

用SQL语句怎么实现数据库分页?

CREATE PROC sp_PageView@tbname sysname, --要分页显示的表名@FieldKey nvarchar(1000),--用于定位记录的主键(惟一键)字段,可以是逗号分隔的多个字段@PageCurrent int=1,--要显示的页码@PageSize int=10,--每页的大小(记录数)@FieldShownvarchar(1000)=, --以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段@FieldOrdernvarchar(1000)=,--以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC用于指定排序顺序@Where nvarchar(1000)=,--查询条件@PageCountint OUTPUT --总页数ASSET NOCOUNT ON--检查对象是否有效IF OBJECT_ID(@tbname) IS NULLBEGINRAISERROR(N对象%s不存在,1,16,@tbname)RETURNENDIF OBJECTPROPERTY(OBJECT_ID(@tbname),NIsTABLE)=0AND OBJECTPROPERTY(OBJECT_ID(@tbname),NIsView)=0AND OBJECTPROPERTY(OBJECT_ID(@tbname),NIsTableFunction)=0BEGINRAISERROR(N%s不是表、视图或者表值函数,1,16,@tbname)RETURNEND--分页字段检查IF ISNULL(@FieldKey,N)=BEGINRAISERROR(N分页处理需要主键(或者惟一键),1,16)RETURNEND--其他参数检查及规范IF ISNULL(@PageCurrent,0)<1 SET @PageCurrent=1IF ISNULL(@PageSize,0)<1 SET @PageSize=10IF ISNULL(@FieldShow,N)=N SET @FieldShow=N*IF ISNULL(@FieldOrder,N)=NSET @FieldOrder=NELSESET @FieldOrder=NORDER BY +LTRIM(@FieldOrder)IF ISNULL(@Where,N)=NSET @Where=NELSESET @Where=NWHERE (+@Where+N)--如果@PageCount为NULL值,则计算总页数(这样设计可以只在第一次计算总页数,以后调用时,把总页数传回给存储过程,避免再次计算总页数,对于不想计算总页数的处理而言,可以给@PageCount赋值)IF @PageCount IS NULLBEGINDECLARE @sql nvarchar(4000)SET @sql=NSELECT @PageCount=COUNT(*)+N FROM +@tbname+N +@WhereEXEC sp_executesql @sql,N@PageCount int OUTPUT,@PageCount OUTPUTSET @PageCount=(@PageCount+@PageSize-1)/@PageSizeEND--计算分页显示的TOPN值DECLARE @TopN varchar(20),@TopN1 varchar(20)SELECT @TopN=@PageSize,@TopN1=@PageCurrent*@PageSize--第一页直接显示IF @PageCurrent=1EXEC(NSELECT TOP +@TopN+N +@FieldShow+N FROM +@tbname+N +@Where+N +@FieldOrder)ELSEBEGIN--生成主键(惟一键)处理条件DECLARE @Where1 nvarchar(4000),@s nvarchar(1000)SELECT @Where1=N,@s=@FieldKeyWHILE CHARINDEX(N,,@s)>0SELECT @s=STUFF(@s,1,CHARINDEX(N,,@s),N),@Where1=@Where1+N AND a.+LEFT(@s,CHARINDEX(N,,@s)-1)+N=+LEFT(@s,CHARINDEX(N,,@s)-1)SELECT @Where1=STUFF(@Where1+N AND a.+@s+N=+@s,1,5,N),@TopN=@TopN1-@PageSize--执行查询EXEC(NSET ROWCOUNT +@TopN1+N SELECT +@FieldKey+N INTO # FROM +@tbname+N +@Where+N +@FieldOrder+N SET ROWCOUNT +@TopN+N delete FROM #+N SELECT +@FieldShow+N FROM +@tbname+N a WHERE EXISTS(SELECT * FROM # WHERE +@Where1+N) +@FieldOrder)END

sql存储过程实例

CREATE OR REPLACEprocedure procedure_namebeginfor c in (select column_a_name from table_a_name)loopupdate table_b_name set column_b_name=_a_name loop;end;

本文版权声明本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请联系本站客服,一经查实,本站将立刻删除。

发表评论

热门推荐