加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql – DELETE命令在具有聚簇索引的表中太慢了

发布时间:2020-12-12 16:47:02 所属栏目:MsSql教程 来源:网络整理
导读:我有一个相当大的名为FTPLog的表,大约有3亿个记录,我想添加删除机制来删除旧的日志,但是delete命令需要很长时间.我发现聚簇索引删除需要很长时间. DECLARE @MaxFTPLogId as bigintSELECT @MaxFTPLogId = Max(FTPLogId) FROM FTPLog WHERE LogTime = DATEADD(d
我有一个相当大的名为FTPLog的表,大约有3亿个记录,我想添加删除机制来删除旧的日志,但是delete命令需要很长时间.我发现聚簇索引删除需要很长时间.
DECLARE @MaxFTPLogId as bigint
SELECT @MaxFTPLogId = Max(FTPLogId) FROM FTPLog WHERE LogTime <= DATEADD(day,-10,GETDATE())
PRINT @MaxFTPLogId
DELETE FROM FTPLog WHERE FTPLogId <= @MaxFTPLogId

我想知道如何提高删除的性能?

解决方法

这可能很慢,因为大的删除会生成一个大事务日志.尝试以块形式删除它,如:
WHILE 1 = 1
BEGIN
    DELETE TOP (256) FROM FTPLog WHERE FTPLogId <= @MaxFTPLogId
    IF @@ROWCOUNT = 0
        BREAK
END

这会生成较小的事务.并通过为其他进程创建呼吸空间来缓解锁定问题.

您也可以查看partitioned tables.这些可能允许您通过删除整个分区来清除旧条目.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读