1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| function Get-SqlPerformanceReport {
param([string]$ServerInstance = "localhost")
Write-Host "========== SQL Server 性能报告 ==========" -ForegroundColor Cyan
$bufferPool = Invoke-Sqlcmd -ServerInstance $ServerInstance -Query @" SELECT CAST(COUNT(*) * 8 / 1024.0 AS DECIMAL(10,2)) AS 总缓存MB, CAST(SUM(CASE WHEN is_modified = 1 THEN 8 ELSE 0 END) / 1024.0 AS DECIMAL(10,2)) AS 脏页MB, CAST(SUM(CASE WHEN is_modified = 0 THEN 8 ELSE 0 END) / 1024.0 AS DECIMAL(10,2)) AS 干净页MB FROM sys.dm_os_buffer_descriptors "@ Write-Host "`n缓冲池:总 $($bufferPool.总缓存MB) MB, 脏页 $($bufferPool.脏页MB) MB"
$slowQueries = Invoke-Sqlcmd -ServerInstance $ServerInstance -Query @" SELECT TOP 10 SUBSTRING(st.text, (qs.statement_start_offset/2)+1, ((CASE qs.statement_end_offset WHEN -1 THEN DATALENGTH(st.text) ELSE qs.statement_end_offset END - qs.statement_start_offset)/2) + 1) AS 查询语句, qs.execution_count AS 执行次数, CAST(qs.total_elapsed_time / 1000000.0 AS DECIMAL(10,2)) AS 总耗时秒, CAST(qs.total_elapsed_time / 1000000.0 / qs.execution_count AS DECIMAL(10,4)) AS 平均耗时秒, qs.total_logical_reads AS 逻辑读取次数 FROM sys.dm_exec_query_stats qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st ORDER BY qs.total_elapsed_time DESC "@
$slowQueries | Select-Object 查询语句, 执行次数, 总耗时秒, 平均耗时秒 | Format-Table -AutoSize -Wrap
$blocking = Invoke-Sqlcmd -ServerInstance $ServerInstance -Query @" SELECT blocking.session_id AS 阻塞源ID, blocked.session_id AS 被阻塞ID, DB_NAME(blocked.database_id) AS 数据库, blocked.wait_type AS 等待类型, blocked.wait_time/1000 AS 等待秒数, blocking_sql.text AS 阻塞源语句 FROM sys.dm_exec_requests blocked JOIN sys.dm_exec_sessions blocking ON blocked.blocking_session_id = blocking.session_id CROSS APPLY sys.dm_exec_sql_text(blocked.sql_handle) blocked_sql CROSS APPLY sys.dm_exec_sql_text(blocking.most_recent_sql_handle) blocking_sql "@
if ($blocking) { Write-Host "`n阻塞会话:" -ForegroundColor Red $blocking | Format-Table -AutoSize } else { Write-Host "`n无阻塞会话" -ForegroundColor Green } }
Get-SqlPerformanceReport
|