每个数据库而不是每个服务器的 Azure SQL 数据库 DTU 计算器

问题描述

我发现了一个 amazing script online 可以让我们每个人在迁移之前确定我们需要多少 Azure 果汁:

Set-ExecutionPolicy -Scope Process -ExecutionPolicy Unrestricted -Force

$ErrorActionPreference = "Stop"
$VerbosePreference = "Continue"

cls

Write-Output "Collecting counters..."
Write-Output "Press Ctrl+C to exit."

$counters = @("\Processor(_Total)\% Processor Time","\Logicaldisk(_Total)\disk Reads/sec","\Logicaldisk(_Total)\disk Writes/sec","\sqlServer:Databases(_Total)\Log Bytes Flushed/sec") 

Get-Counter -Counter $counters -SampleInterval 1 -MaxSamples 3600 | 
    Export-Counter -FileFormat csv -Path "C:\sql-perfmon-log.csv" -Force

问题是这个脚本针对的是整个服务器,而不是特定的数据库

是否可以通过 PowerShell 或通过 PowerShell 运行 T-sql 查询并每秒检索这 4 个指标:

  • 处理器 - % 处理器时间
  • 逻辑磁盘 - 磁盘读取数/秒
  • 逻辑磁盘 - 磁盘写入数/秒
  • 数据库 - 刷新日志字节数/秒

目标是仅为 1 个数据库收集这 4 个指标。

解决方法

这些是系统范围的指标,无法将其范围缩小到单个数据库。

您可以使用 RML Utilities 捕获服务器上所有流量的 SQL 跟踪,并针对仅恢复目标数据库的实例重放它。

或者您可以采样连接到目标数据库的会话的资源利用率

select SYSDATETIME() sample_time,sum(cpu_time) cpu_time,sum(total_elapsed_time) total_elapsed_time,sum(reads) reads,sum(writes) writes
from sys.dm_exec_sessions
where database_id = db_id('AdventureWorks2017')

或者创建一个 XEvent 会话来在每次会话结束时记录这些数据:

CREATE EVENT SESSION [aw_logout] ON SERVER 
ADD EVENT sqlserver.logout(
    WHERE ([sqlserver].[database_name]=N'AdventureWorks2017'))
ADD TARGET package0.event_file(SET filename=N'aw_session_logout')