如何最大限度地减少\提前计划运行 sp_delete_backuphistory 的影响?也衡量收益!

Mar*_*lli 5 monitoring sql-server delete backup scripting

运行以下查询时:

-- DATEADD (datepart , number , date )  

DECLARE @dt DATETIME
SELECT @dt = DATEADD(month,-6,getdate())
select @dt
EXEC msdb.dbo.sp_delete_backuphistory @oldest_date = @dt 
Run Code Online (Sandbox Code Playgroud)

我收到很多锁和块,可能是因为该命令已经有一段时间没有运行了(如果有的话)。

在此输入图像描述

在我实际运行或计划运行此命令之前,有没有办法找出每个涉及的表中有多少要删除的内容?

我使用dateadd来计算 6 个月。

sp_delete_backuphistory中,以下表被修剪:

sp_delete_backuphistory 必须从 msdb 数据库运行并影响以下表:

备份文件

备份文件组

备份媒体家族

备份媒体集

备份集

恢复文件

恢复文件组

恢复历史

Eri*_*ing 5

我对这个过程的抱怨可以追溯到很久以前:

删除大量数据时遇到的问题是从表变量中获得的蹩脚估计。

我很幸运地使用临时表创建了新版本的过程。您也可以尝试仅添加重新编译提示,但是嘿,这样我们就可以获得有用的索引。

附带说明:如果由于运行时间较长而仍然遇到此阻塞,您可以尝试删除事务代码,或更改它以封装每个单独的删除(尽管此时的好处可以忽略不计)。

CREATE   PROCEDURE [dbo].[sp_delete_backuphistory_pro]
   @oldest_date datetime
 AS
 BEGIN
   SET NOCOUNT ON

   CREATE TABLE #backup_set_id      (backup_set_id INT PRIMARY KEY CLUSTERED)
   CREATE TABLE #media_set_id       (media_set_id INT PRIMARY KEY CLUSTERED)
   CREATE TABLE #restore_history_id (restore_history_id INT PRIMARY KEY CLUSTERED)

   INSERT INTO #backup_set_id WITH (TABLOCKX) (backup_set_id)
   SELECT DISTINCT backup_set_id
   FROM msdb.dbo.backupset
   WHERE backup_finish_date < @oldest_date

   INSERT INTO #media_set_id WITH (TABLOCKX) (media_set_id)
   SELECT DISTINCT media_set_id
   FROM msdb.dbo.backupset
   WHERE backup_finish_date < @oldest_date

   INSERT INTO #restore_history_id WITH (TABLOCKX) (restore_history_id)
   SELECT DISTINCT restore_history_id
   FROM msdb.dbo.restorehistory
   WHERE backup_set_id IN (SELECT backup_set_id
                           FROM   #backup_set_id)

   BEGIN TRANSACTION

   DELETE FROM msdb.dbo.backupfile
   WHERE backup_set_id IN (SELECT backup_set_id
                           FROM   #backup_set_id)
   IF (@@error > 0)
     GOTO Quit

   DELETE FROM msdb.dbo.backupfilegroup
   WHERE backup_set_id IN (SELECT backup_set_id
                           FROM   #backup_set_id)
   IF (@@error > 0)
     GOTO Quit

   DELETE FROM msdb.dbo.restorefile
   WHERE restore_history_id IN (SELECT restore_history_id
                                FROM   #restore_history_id)
   IF (@@error > 0)
     GOTO Quit

   DELETE FROM msdb.dbo.restorefilegroup
   WHERE restore_history_id IN (SELECT restore_history_id
                                FROM   #restore_history_id)
   IF (@@error > 0)
     GOTO Quit

   DELETE FROM msdb.dbo.restorehistory
   WHERE restore_history_id IN (SELECT restore_history_id
                                FROM   #restore_history_id)
   IF (@@error > 0)
     GOTO Quit

   DELETE FROM msdb.dbo.backupset
   WHERE backup_set_id IN (SELECT backup_set_id
                           FROM   #backup_set_id)
   IF (@@error > 0)
     GOTO Quit

   DELETE msdb.dbo.backupmediafamily
   FROM msdb.dbo.backupmediafamily bmf
   WHERE bmf.media_set_id IN (SELECT media_set_id
                              FROM   #media_set_id)
     AND ((SELECT COUNT(*)
           FROM msdb.dbo.backupset
           WHERE media_set_id = bmf.media_set_id) = 0)
   IF (@@error > 0)
     GOTO Quit

   DELETE msdb.dbo.backupmediaset
   FROM msdb.dbo.backupmediaset bms
   WHERE bms.media_set_id IN (SELECT media_set_id
                              FROM   #media_set_id)
     AND ((SELECT COUNT(*)
           FROM msdb.dbo.backupset
           WHERE media_set_id = bms.media_set_id) = 0)
   IF (@@error > 0)
     GOTO Quit

   COMMIT TRANSACTION
   RETURN

 Quit:
   ROLLBACK TRANSACTION

 END
Run Code Online (Sandbox Code Playgroud)