Senaste inläggen 

Taggar 

performance     Microsoft     central management server     CTP1     SQL server codename Denali     virtuell     connection     Trace Flag     Activity Monitor     AcquireConnection     2008     Business Intelligence     temp table     error     transactions     platsannons SQL utvecklare     #am_get_querystats     bugs     SQL Server     sp1     sql browser     CU3     history     2005     CMS     Datawarehouse     sp_MSForEachDB     SSIS     HADR     login error     SQL2008     filter     rebuild     Logins     access denied     page splits     HEAP     SQL Denali     CTE     CU1     BOL     features     resource governor     dbmail     SSRS     XP_cmdshell     constraint     concatenation     create index     package load     DECIMAL     function     profile     improve     2000     Extended Event     sql 2005     data warehouse     gratis verktyg     reorganize index     sql 2008     security     Säkerhet     parallelism     undocumented procedures     parameters     2011     connect     Cluster     SQL Server 2012     SSAS     DTA     SSRS 2008     Techdays     0xC0202009     T-SQL     Page life expectancy     Reports     0xC0010014     clean up     feedback

Get CPU utilization by database

Skrivet den 13 juli 2012 i T-SQL, Statistik, Level 300, Göran Rönnbäck, SQL Server, sv

När man analyserar och felsöker en server som innehåller flera databaser är det väldigt intressant att veta vilken av dessa databaser som förbrukar mest CPU resurser. Då använder man som reglel dmv'en dm_exec_query_stats. Problemet med informationen som då får är att den är ackumelerad sedan SQL Servern startades om. Ofta vill man istället se nuläget och då kan man använda nedanstående SQL som härstämmar från ett av Glen Berrys skript. Helt enkelt sparar man resultatet i en temptabell, väntar en tid t.ex. 1 minut, sparar resultatet i en ny temptabell och sedan jämför dessa värden, istället för att bara presentera utnyttjandet sedan servern startades om. Nedan får man båda dessa värden i procent som ger en bättre bild av verkligheten just nu.

-- Get CPU utilization by database

WITH DB_CPU_Stats AS (SELECT DatabaseID, DB_Name(DatabaseID) AS [DatabaseName], SUM(total_worker_time) AS [CPU_Time_Ms]  FROM sys.dm_exec_query_stats AS qs  CROSS APPLY (SELECT CONVERT(int, value) AS [DatabaseID]               FROM sys.dm_exec_plan_attributes(qs.plan_handle)               WHERE attribute = N'dbid') AS F_DB  GROUP BY DatabaseID) SELECT ROW_NUMBER() OVER(ORDER BY [CPU_Time_Ms] DESC) AS [row_num],        DatabaseName, [CPU_Time_Ms],        CAST([CPU_Time_Ms] * 1.0 / SUM([CPU_Time_Ms]) OVER() * 100.0 AS DECIMAL(5, 2)) AS [CPUPercent] INTO #tmpDB_CPU_Stats_1 FROM DB_CPU_Stats WHERE DatabaseID > 4 -- system databases AND DatabaseID <> 32767 -- ResourceDB ORDER BY row_num OPTION (RECOMPILE);

WAITFOR DELAY '00:01:00';

WITH DB_CPU_Stats AS (SELECT DatabaseID, DB_Name(DatabaseID) AS [DatabaseName], SUM(total_worker_time) AS [CPU_Time_Ms]  FROM sys.dm_exec_query_stats AS qs  CROSS APPLY (SELECT CONVERT(int, value) AS [DatabaseID]               FROM sys.dm_exec_plan_attributes(qs.plan_handle)               WHERE attribute = N'dbid') AS F_DB  GROUP BY DatabaseID) SELECT ROW_NUMBER() OVER(ORDER BY [CPU_Time_Ms] DESC) AS [row_num],        DatabaseName, [CPU_Time_Ms],        CAST([CPU_Time_Ms] * 1.0 / SUM([CPU_Time_Ms]) OVER() * 100.0 AS DECIMAL(5, 2)) AS [CPUPercent] INTO #tmpDB_CPU_Stats_2 FROM DB_CPU_Stats WHERE DatabaseID > 4 -- system databases AND DatabaseID <> 32767 -- ResourceDB ORDER BY row_num OPTION (RECOMPILE);

SELECT  #tmpDB_CPU_Stats_1.DatabaseName,  #tmpDB_CPU_Stats_1.CPUPercent,

 CAST((#tmpDB_CPU_Stats_2.CPU_Time_Ms - #tmpDB_CPU_Stats_1.CPU_Time_Ms) * 1.0 / SUM((#tmpDB_CPU_Stats_2.CPU_Time_Ms - #tmpDB_CPU_Stats_1.CPU_Time_Ms)) OVER() * 100.0 AS DECIMAL(5, 2)) AS [Current_CPUPercent] FROM          #tmpDB_CPU_Stats_1 INNER JOIN  #tmpDB_CPU_Stats_2 ON #tmpDB_CPU_Stats_1.DatabaseName = #tmpDB_CPU_Stats_2.DatabaseName ORDER BY #tmpDB_CPU_Stats_2.CPU_Time_Ms - #tmpDB_CPU_Stats_1.CPU_Time_Ms DESC

DROP TABLE #tmpDB_CPU_Stats_1 DROP TABLE #tmpDB_CPU_Stats_2

Skriv en kommentar

  • Fick ett fel

    Fick ett felmeddelande när jag körde skriptet...

    (2 row(s) affected)

    (3 row(s) affected)

    Msg 8134, Level 16, State 1, Line 47

    Divide by zero error encountered.

    By Tobias