Analyze and Improve SQL Server Backup Schedule

By:   |   Comments   |   Related: > Backup


A centralized backup server to support SQL Server can sometimes become a resource bottleneck in the backup stream if you have many servers writing database backups as the same time. It usually happens when you have a large SQL Server database inventory and all of your database servers have similar backup schedules. In this tip, we will look into SQL Server backup schedules and how you can use this to reduce backup server contention and possibly making SQL Server backups faster by simply rescheduling backup jobs.


It is considered a best practice to have a separate backup server from where your database files reside to avoid a single point of failure. When you have a large inventory of SQL Server database servers and all of them are backing up at or around the same time, it may overwhelm the backup server and become sluggish. In turn, backups will run for a longer period and will likely impact transaction log backups and other processing on the server during that time window. If transaction log backups take longer, the transaction log can grow and become large and possibly fill up the drive on the server and may not comply with your RPO agreement either.

If you don’t have a very strict maintenance window, you can stagger the backup operations and spread them out across weekdays and times. You can use the below script to audit the full backup schedule. The script is created in the context to run it on CMS to get a nice overview of backup schedule for the entire server inventory. The query result should give you a clear understanding of how to stagger the backup jobs to reduce overlapping time windows.

Potentially, spreading out backup operations will make backups faster across the board. In our environment, we were able reduce backup duration by 30-50% on servers with large and lots of database(s) by simply avoiding an overlapping schedule. You can use the same script below to monitor your SQL Server differential backups schedule with a minor update of changing the code below from this bs.type to 'd' to this bs.type to 'i'.

The below script will also inform you about databases with uncompressed backups. To use compressed backups, make sure to turn on the server level configuration ‘backup compression default’ if it was missed during server setup. Backup compression has been around for since SQL Server 2008 and is available in both Standard and Enterprise editions since SQL Server 2008 R2.

Here is the script to run.

  COUNT(*) AS total_dbs,
  DATEDIFF(MINUTE, MIN(bkup.backup_start_date), MAX(bkup.backup_finish_date)) AS duration_minutes,
  AVG(speed_mb_sec) avg_mb_sec,
  MIN(bkup.backup_start_date) AS backup_began,
  MAX(bkup.backup_finish_date) AS backup_finished
  DATENAME(WEEKDAY, bs.backup_start_date) AS [weekday],
  speed_mb_sec = (bs.compressed_backup_size / 1048576.0) /
    WHEN DATEDIFF(SECOND, bs.backup_start_date, bs.backup_finish_date) > 0 THEN DATEDIFF(SECOND, bs.backup_start_date, bs.backup_finish_date)
    ELSE 1
    WHEN (bs.backup_size % bs.compressed_backup_size) > 0 THEN '1'
    ELSE '0'
  END [compressed],
  RANK() OVER (PARTITION BY bs.database_name ORDER BY bs.backup_start_date DESC) AS rank
FROM msdb..backupset bs (NOLOCK)
WHERE 1 = 1
AND bs.type = 'd' --full backups
AND bs.is_copy_only = 0
AND bs.database_name NOT IN ('master', 'msdb', 'model') --excludes server with no user dbs
AND bs.backup_start_date > DATEADD(DAY, -7, GETDATE()) --backups in last one week
--and datename(weekday,bs.backup_start_date) = 'Monday' -- filter by day
) bkup
WHERE bkup.rank = 1 -- latest full backup 
GROUP BY bkup.compressed,

Here is sample output.  This shows the last time full backups were run on the server.  I shows how many backups are compressed, number of backups, overall time for the backups and when the backups started and finished.

database backup information
Next Steps

sql server categories

sql server webinars

subscribe to mssqltips

sql server tutorials

sql server white papers

next tip

About the author
MSSQLTips author Aakash Patel Aakash Patel is a Senior SQL Server DBA for a software firm in Connecticut with 10+ years of experience.

This author pledges the content of this article is based on professional experience and not AI generated.

View all my tips

Comments For This Article

get free sql tips
agree to terms