Senaste inläggen 

Taggar 

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

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