Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何比较SQL Server上的数据库I/O负载_Sql Server - Fatal编程技术网

Sql server 如何比较SQL Server上的数据库I/O负载

Sql server 如何比较SQL Server上的数据库I/O负载,sql-server,Sql Server,我们正在准备将我们的许多SQL服务器迁移到云。我想找到一种逻辑方法,在新的虚拟服务器上重新分配数据库。我想考虑的一个因素是数据库是多么繁忙。我的想法是从dm_io_virtual_stats DMV获取如下所示的信息,以获得一个可以跨服务器进行比较的数字。从本质上讲,它需要读取的字节数和写入的字节数之和除以示例数,以了解自上次启动系统以来每个数据库的平均I/O。我在多台服务器上运行这段代码,所以我希望除以示例,可以对不同的机器进行有效的比较。我读过几篇关于DMV的文章,但没有一篇涉及到这个特定的

我们正在准备将我们的许多SQL服务器迁移到云。我想找到一种逻辑方法,在新的虚拟服务器上重新分配数据库。我想考虑的一个因素是数据库是多么繁忙。我的想法是从dm_io_virtual_stats DMV获取如下所示的信息,以获得一个可以跨服务器进行比较的数字。从本质上讲,它需要读取的字节数和写入的字节数之和除以示例数,以了解自上次启动系统以来每个数据库的平均I/O。我在多台服务器上运行这段代码,所以我希望除以示例,可以对不同的机器进行有效的比较。我读过几篇关于DMV的文章,但没有一篇涉及到这个特定的用例

BEGIN

declare @DatabaseId as int
declare @FileId as int
declare @DatabaseStart as datetime2
declare @BytesIn bigint
declare @BytesOut as bigint
declare @BytesOnDisk as bigint

create table #FileInfo (
  ServerName varchar(128),
  DatabaseName varchar(128),
  UpTime bigint,
  InputBytes float,
  OutputBytes float,
  BytesOnDisk bigint )

DECLARE FileCursor CURSOR FOR
select database_id, file_id
from sys.master_files

open FileCursor
FETCH NEXT FROM FileCursor into @DatabaseId, @FileId
WHILE @@FETCH_STATUS = 0
   BEGIN
      select @BytesIn = num_of_bytes_read, 
             @BytesOut = num_of_bytes_written, 
             @BytesOnDisk = size_on_disk_bytes, 
             @DatabaseStart = sqlserver_start_time
      from sys.dm_io_virtual_file_stats(@DatabaseId, @FileId),
           sys.dm_os_sys_info

      insert into #FileInfo values ( @@SERVERNAME, 
                                     db_name(@DatabaseId),  
                                     datediff(second, @DatabaseStart, getdate()), 
                                     @Bytesin, 
                                     @BytesOut, 
                                     @BytesOnDisk )
      FETCH NEXT FROM FileCursor into @DatabaseId, @FileId
   END;
CLOSE FileCursor
DEALLOCATE FileCursor

select ServerName, 
       DatabaseName, 
       (SUM((InputBytes + OutputBytes) / UpTime))[AvgBytesPerSec], 
       SUM(BytesOnDisk)[DatabaseSize]
from #FileInfo 
where UpTime > 0 
group by ServerName, DatabaseName
order by ServerName, DatabaseName

Drop table #FileInfo
END
GO

考虑添加SUMNUMIFIFICALDSSNUMYOFFX写,因为I/O速率也是一个考虑因素。我认为磁盘性能计数器收集是执行此任务的更好工具,因为自实例启动以来的平均值将隐藏可能需要考虑的活动高峰和低谷。谢谢,Dan。我知道这是一个非常粗略的平均值,特别是如果服务器已经运行了很长时间。我还了解到,sample_ms只是一个int,过了一段时间后变为负数:我在sys.dm_os_sys_info DMV中计算了自sqlserver_启动以来的秒数,以用作分母。