SQL Server Backup 是单线程还是多线程?

Lee*_*DBA 3 performance sql-server backup

如果您执行...

BACKUP DATABASE [DB_Name] TO DISK=N'c:\backups\db_name.bak' WITH STATS=10
Run Code Online (Sandbox Code Playgroud)

这将执行单线程还是多线程写入?

我们的服务器支持公司建议我们,如果我们对备份进行多线程处理,我们将获得更好的磁盘写入性能。他们建议我们 SQL 备份是多线程的,但我认为上面的语句是单线程的。如果我们指定要写入的多个磁盘,那么它将跨多个设备对备份进行条带化,因此根据我的理解是多线程的。

如果我在备份处理时执行以下 T-SQL,我可以看到执行备份的 SPID 有多个进程,但似乎只有一个进程写入磁盘,我认为其他进程正在读取和执行其他操作。这只是我提到问题的写线程。

USE MASTER
GO

SELECT *
FROM sys.sysprocesses p
INNER JOIN sys.dm_exec_requests r ON p.spid = r.session_id
WHERE spid=(spid of backup T-SQL)
Run Code Online (Sandbox Code Playgroud)

提前致谢。

Mar*_*ith 5

备份到多个文件可能也是您的顾问所指的内容。如果您在单个磁盘/阵列上备份多个文件,您会经常看到改进(尽管通常不大),直到您明显使源和目标 IO 路径饱和为止。

BACKUP DATABASE [MyDatabase] 
TO 
  DISK = N'Z:\backup\MyDatabase_File1.bak'
  , DISK = N'Z:\backup\MyDatabase_File2.bak'
  , DISK = N'Z:\backup\MyDatabase_File3.bak'
  , DISK = N'Z:\backup\MyDatabase_File4.bak'
WITH 
    NAME = N'MyDatabase - Full Backup'
    , INIT
    , STATS = 10
Run Code Online (Sandbox Code Playgroud)

如果您使用的是 2008+,压缩是明显的补充。如果没有,尝试使用 BUFFERCOUNT、BLOCKSIZE 和 MAXTRANSFERSIZE 选项会有所收获。Paul Randall 关于高级备份和还原选项的文章是一个很好的起点。