查看: 94|回复: 1

SQL Server删除大量数据

[复制链接]

4

主题

9

帖子

16

积分

新手上路

Rank: 1

积分
16
发表于 2022-12-4 19:23:41 | 显示全部楼层 |阅读模式
方法一:直接Delete,效率最低;
delete from table1;
方法二:批量删除,效率次之;
SET STATISTICS TIME ON;
DECLARE @Timer DATETIME = GETDATE();

SET ROWCOUNT 100000;

WHILE 1 = 1
BEGIN
    BEGIN TRAN
    DELETE FROM [dbo].[Employee];
    COMMIT
    IF @@ROWCOUNT = 0
        BREAK;
END

SET ROWCOUNT 0;

SELECT DATEDIFF(MS, @Timer, GETDATE()) AS [执行时间(毫秒)];
SET STATISTICS TIME OFF;方法三:Truncate,效率最高;
Truncate table1;

  • TRUNCATE太快了,清除10W数据一点没压力,批量删除次之,最后的DELTE太慢了;
  • TRUNCATE快是因为它属于DDL语句,只会产生极少的日志,普通的DELETE不仅会产生日志,而且会锁记录
<hr/>工作中经常会遇到要删除大表中的数据,或者只保留部分数据,此时,可使用批量导入需要保留的数据到第三个表中,再将原来的表Truncate实现,效率会比在原表中删除数据要高。步骤如下:(如果临时表只做暂时存放数据,第一步也可以不用做,直接使用SELECT..INTO的方式)
  1. CREATE TABLE #tmp1 AS (xxx) xxx
  2. INSERT #tmp1 SELECT * FROM Original where clause(也可直接select..Into实现,不用创建表结构)
  3. DROP TBALE Original
  4. EXEC SP_RENAME '#keep','Original'
       5.添加Original原有索引信息
转自:
回复

使用道具 举报

2

主题

5

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2025-3-27 21:39:03 | 显示全部楼层
锄禾日当午,发帖真辛苦。谁知坛中餐,帖帖皆辛苦!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表