AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 166112
Accepted
Alf47
Alf47
Asked: 2017-03-04 08:47:36 +0800 CST2017-03-04 08:47:36 +0800 CST 2017-03-04 08:47:36 +0800 CST

使用 CHECKPOINT 与 GO

  • 772

通常,当其中一位开发人员或数据分析师需要执行非常大的数据更新或删除时(由于要保留的数据集太大,截断或截断/插入没有意义)我建议他们这样做类似于以下内容:

-- Delete 1 million rows 1 thousand at a time
DELETE TOP (1000) FROM TableA WHERE <condition>
WAITFOR DELAY '00:00:01'
GO 1000

对于处于完全恢复模式的数据库,这样做的结果是 1) 等待允许其他事务在需要时进行处理,以及 2) 当日志备份运行时,它能够在日志文件中将已经完成的操作标记为脏操作,因此它可以重新使用空间并防止日志增长过快。

我不想这样做,而是想知道是否有可能使用检查点来完成同样的事情。该声明是否会有效地导致相同情况的发生?

-- Delete 1 million rows 1 thousand at a time
WHILE EXISTS ( SELECT 1 FROM TableA WHERE <condition> )
BEGIN
DELETE TOP (1000) FROM TableA WHERE <condition>
WAITFOR DELAY '00:00:01'
CHECKPOINT
END

同样,这些是完全恢复模式下的数据库。

sql-server delete
  • 2 2 个回答
  • 1064 Views

2 个回答

  • Voted
  1. Best Answer
    Kin Shah
    2017-03-04T20:22:24+08:002017-03-04T20:22:24+08:00

    进行大量更新或删除时最重要的事情是避免事务日志增长失控。允许日志重用并避免膨胀到 Tlog(事务日志截断)

    • 在完全恢复模式下 - 进行日志备份
    • 在简单恢复模式下 - 做检查点。

    由于您使用的是完全恢复,因此您的删除逻辑应该是

    begin
     begin tran
       -- delete using batches 
       -- carefully choose batch size. SQL Server will do a lock escalation 
       -- for batch greater than 5000. (https://technet.microsoft.com/en-us/library/ms184286(v=sql.105).aspx)
     commit tran / rollback tran 
      -- since you are using Full recovery, take log backups
      -- with CHECKPOINT SQL Server still cannot reuse those portions of the log until you perform a log backup.
    end
    

    我waitfor delay特别喜欢。避免长时间阻塞。

    请参阅这篇金矿博文 - Aaron Bertrand将大型删除操作分成块。此外,Take Care When Scripting Batches是一篇非常有用的博文。

    • 2
  2. Cody Konior
    2017-03-05T00:37:08+08:002017-03-05T00:37:08+08:00

    两者是等价的,您将批处理与日志截断混淆了。

    重要的是代码分批运行,以便释放锁,其他会话可以跳入并读取表(并且当数据库处于简单恢复模型时日志文件可以清除)。

    但是 - 在您的第一个示例中, WAITFOR 可能不是必需的 - 所有会话都排队等待并且可能会在每次运行之间进入。

    第二个是等价的,只是它告诉 SIMPLE 模式数据库日志可以被清除,然而,这很可能每隔几秒发生一次!在 FULL 恢复模型中,两者都没有增加太多价值。

    • 1

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve