使用OUTPUT从句从SQL Server表删除和归档大量记录

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介:

英文原文:

http://blog.extreme-advice.com/2013/01/08/delete-and-archive-bulk-record-from-sql-server-table-with-output-clause/


我Facebook上的一个朋友和老同事,他是一个财务产品的团队领导,问我他有一个几百万记录的表,想去从这个表归档一些记录,他该如何做?


简单的DELETE语句会产生大量的日志文件(如果数据库不是简单恢复模式),会锁住该表非常长时间,并消耗大量资源而极其影响性能。


通常保持简短的事务是非常好的,我总是喜欢批量DELETE/UPDATE记录,尤其是当有大量的记录在生产环境中,因为在达赖那个事务环境删除大量记录需要很长时间,如果你取消DELETE操作可能需要数小时或一天时间,一切将会被回滚,也将会花费很长时间,如果你小批量删除,像每次1000行,而你停止执行,你将只回滚最大1000行,而不用多长时间。


让我们通过创建一个示例数据库来展示如何实现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
--Create sample database
CREATE  DATABASE  ExtremeAdvice
GO
USE ExtremeAdvice
GO
--create sample table along with 100,000 rows
IF OBJECT_ID( 'orders' 'U' IS  NOT  NULL  BEGIN
DROP  TABLE  orders
END
GO
CREATE  TABLE  orders (OrderID  INT  IDENTITY, OrderDate DATETIME, Amount MONEY, Refno  INT )
GO
INSERT  INTO  orders (OrderDate, Amount, Refno)
SELECT  TOP  100000
DATEADD( minute ABS (a.OBJECT_ID % 50000 ),  CAST ( '2012-02-01'  AS  DATETIME)),
ABS (a.OBJECT_ID % 10),
CAST ( ABS (a.OBJECT_ID)  AS  VARCHAR )
FROM  sys.all_objects a
CROSS  JOIN  sys.all_objects b
GO
IF OBJECT_ID( 'ordersArchive' 'U' IS  NOT  NULL  BEGIN
DROP  TABLE  ordersArchive
END
GO
CREATE  TABLE  ordersArchive (OrderID  INT , OrderDate DATETIME, Amount MONEY, Refno  INT )
GO


现在我们已经准备好了示例环境,让我们创建一个存储过程,基于我们提供的条件删除记录。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
USE [ExtremeAdvice]
GO
CREATE  PROCEDURE  [dbo].[SPordersArchive]
AS
SET  NOCOUNT  ON
DECLARE  @cnt  INT , @ rows  INT
SELECT  @cnt = 1
DECLARE  @msg  VARCHAR (1024)
DECLARE  @dt DATETIME
--creating infinite loop which will break itself whenever all record gets deleted based on condition given
WHILE 1=1
BEGIN
SELECT
@dt = GETDATE(),
@ rows  = 0
--Deleting records in bunch
DELETE  TOP  (1000) o
OUTPUT
deleted.OrderID,
deleted.OrderDate,
deleted.Amount,
deleted.RefNo
INTO  ordersArchive(
OrderID
,OrderDate
,Amount
,RefNo
)
FROM  Orders  AS  o (NOLOCK)
WHERE  o.OrderID <=50000
SELECT  @ rows  = @@ROWCOUNT
SELECT  @cnt = @cnt + 1
SELECT  @msg =  'Lap : '  CAST (@cnt  AS  VARCHAR ) +  ' ARCHIVED '  cast (@ rows  AS  VARCHAR ) +  ' rows in '  cast (DATEDIFF( second , @dt, GETDATE())  as  varchar ) +  ' seconds'
RAISERROR(@msg, 0, 1)  WITH  NOWAIT
IF @ rows  = 0 BREAK;
WAITFOR DELAY  '00:00:00.100'
END


让我们现在执行这个存储过程,它会需要一些时间,你会在屏幕上看到如下信息。

1DeleteMessage




















本文转自UltraSQL51CTO博客,原文链接:http://blog.51cto.com/ultrasql/1733043 ,如需转载请自行联系原作者








相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
相关文章
|
13天前
|
SQL 人工智能 算法
【SQL server】玩转SQL server数据库:第二章 关系数据库
【SQL server】玩转SQL server数据库:第二章 关系数据库
52 10
|
1月前
|
SQL 数据库 数据安全/隐私保护
Sql Server数据库Sa密码如何修改
Sql Server数据库Sa密码如何修改
|
1月前
|
SQL 关系型数据库 MySQL
【MySQL】— —熟练掌握用SQL语句实现数据库和基本表的创建。熟练掌握MySQL的安装、客户端登录方法;熟练掌握MySQL的编码、数据类型等基础知识;掌握实体完整性的定义和维护方法、掌握参照完整性
【MySQL】— —熟练掌握用SQL语句实现数据库和基本表的创建。熟练掌握MySQL的安装、客户端登录方法;熟练掌握MySQL的编码、数据类型等基础知识;掌握实体完整性的定义和维护方法、掌握参照完整性
101 1
|
23天前
|
SQL
启动mysq异常The server quit without updating PID file [FAILED]sql/data/***.pi根本解决方案
启动mysq异常The server quit without updating PID file [FAILED]sql/data/***.pi根本解决方案
17 0
|
13天前
|
SQL 算法 数据库
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
78 6
|
1月前
|
SQL
现有用户成就统计需求,每个用户有多个成就,某一个成就会被多人拥有,写出数据表设计方案,用一条sql查出每个成就(B.ach_name)下的男生(sex=0)和女生(sex=1)分别有多少?
现有用户成就统计需求,每个用户有多个成就,某一个成就会被多人拥有,写出数据表设计方案,用一条sql查出每个成就(B.ach_name)下的男生(sex=0)和女生(sex=1)分别有多少?
41 0
|
1天前
|
SQL 关系型数据库 MySQL
:“You have an error in your SQL syntax; check the manual that corresponds to your MySQL server versi
:“You have an error in your SQL syntax; check the manual that corresponds to your MySQL server versi
6 0
|
8天前
|
SQL 安全 网络安全
IDEA DataGrip连接sqlserver 提示驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接的解决方法
IDEA DataGrip连接sqlserver 提示驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接的解决方法
19 0
|
13天前
|
SQL 存储 数据挖掘
数据库数据恢复—RAID5上层Sql Server数据库数据恢复案例
服务器数据恢复环境: 一台安装windows server操作系统的服务器。一组由8块硬盘组建的RAID5,划分LUN供这台服务器使用。 在windows服务器内装有SqlServer数据库。存储空间LUN划分了两个逻辑分区。 服务器故障&初检: 由于未知原因,Sql Server数据库文件丢失,丢失数据涉及到3个库,表的数量有3000左右。数据库文件丢失原因还没有查清楚,也不能确定数据存储位置。 数据库文件丢失后服务器仍处于开机状态,所幸没有大量数据写入。 将raid5中所有磁盘编号后取出,经过硬件工程师检测,没有发现明显的硬件故障。以只读方式将所有磁盘进行扇区级的全盘镜像,镜像完成后将所
数据库数据恢复—RAID5上层Sql Server数据库数据恢复案例
|
17天前
|
SQL 数据安全/隐私保护
SQL Server 2016安装教程
SQL Server 2016安装教程
19 1