Senaste inläggen 

Taggar 

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

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