Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

SQL Server 2008 Penggunaan CPU yang tinggi

Anda dapat mengidentifikasi kueri yang mahal (dan database yang terkait dengannya) menggunakan DMV, mis. dari artikel TechNet ini :

SELECT TOP 50
 [Average CPU used] = total_worker_time / qs.execution_count,
 [Total CPU used] = total_worker_time,
 [Execution count] = qs.execution_count,
 [Individual Query] = SUBSTRING (qt.text,qs.statement_start_offset/2, 
         (CASE WHEN qs.statement_end_offset = -1 
            THEN LEN(CONVERT(NVARCHAR(MAX), qt.text)) * 2 
          ELSE qs.statement_end_offset END - 
qs.statement_start_offset)/2)
,[Parent Query] = qt.text
,DatabaseName = DB_NAME(qt.dbid)
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt
ORDER BY [Average CPU used] DESC;

Ini akan memberi tahu Anda tentang kueri pemukul berat, tetapi sayangnya itu tidak akan menunjukkan dengan tepat database yang mungkin memiliki volume kueri kecil yang sangat tinggi yang menggunakan bit kecil CPU secara individual tetapi bit besar secara agregat. Anda dapat melakukannya dengan kueri ini dari kueri DMV Glenn Allan Berry :

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]
FROM DB_CPU_Stats
WHERE DatabaseID > 4 -- system databases
AND DatabaseID <> 32767 -- ResourceDB
ORDER BY row_num OPTION (RECOMPILE);

Tak satu pun dari kueri ini mengidentifikasi aplikasi yang menjalankannya, dan DMV yang digunakan tidak menyimpan informasi tersebut (Anda harus menangkap kueri dalam tindakan dan mencatat nama aplikasi di sys.dm_exec_sessions, atau meninjau jejak).

Tentu saja Anda dapat mengotomatiskan pekerjaan ini dengan berbagai alat kinerja pihak ke-3 di pasar (penafian:Saya bekerja untuk salah satunya, SQL Sentry, yang menghasilkan Penasihat Kinerja , yang melakukan semua hal di atas, termasuk melacak kueri berbiaya tinggi dan memelihara informasi tentang basis data mana yang mereka jalankan dan aplikasi apa yang memanggilnya).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server ODBC Driver tidak memunculkan kesalahan

  2. Pernyataan WHERE bersyarat SQL Server

  3. Bagaimana cara menyimpan nilai desimal di SQL Server?

  4. Bagaimana Stuff dan 'For Xml Path' bekerja di SQL Server?

  5. Hapus data dari tabel dependen