-- 查看性能記數器
SELECT * FROM sys.dm_os_performance_counters
-- 執行過的線程所遇到的所有等待(不是當前正在運行的線程, 爲自上次重置統計信息或啓動服務器以來累積的數據),可分析靠前的幾個等待較高的事件。
select * from sys.dm_os_wait_stats order by wait_time_ms desc
該動態視圖的細節,請查看幫助文檔.
-- 重置該動態視圖
DBCC SQLPERF ('sys.dm_os_wait_stats', CLEAR);
GO
-- 正在等待某些資源的任務的等待隊列
select * from sys.dm_os_waiting_tasks order by wait_duration_ms desc
內存使用:
查看當前由 SQL Server 分配的內存對象(KB): select sum((page_size_in_bytes/1024)*max_pages_allocated_count) from sys.dm_os_memory_objects;
查看系統內存當前信息: select * from sys.dm_os_sys_memory (這個動態視圖只在sql 2008中才有)
select
cpu_count,
hyperthread_ratio,
scheduler_count,
physical_memory_in_bytes / 1024 / 1024 as physical_memory_mb,
virtual_memory_in_bytes / 1024 / 1024 as virtual_memory_mb,
bpool_committed * 8 / 1024 as bpool_committed_mb,
bpool_commit_target * 8 / 1024 as bpool_target_mb,
bpool_visible * 8 / 1024 as bpool_visible_mb
from sys.dm_os_sys_info
限制SQL Server使用的最小,最大內存(MB):
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'min server memory', 300;
GO
sp_configure 'max server memory', 850;
GO
RECONFIGURE;
GO
CPU使用情況:
SELECT TOP 50
total_worker_time/execution_count AS '每次執行佔用CPU(微秒)',
execution_count as '執行次數',
total_worker_time as '總共佔用CPU(微秒)',
creation_time as '創建時間',
last_execution_time as '最後執行時間',
min_worker_time as '最低每次佔用CPU',
max_worker_time as '最高每次佔用cpu',
total_physical_reads as '總共io物理讀取次數',
total_logical_reads as '總共邏輯讀取次數',
total_logical_writes as '總共邏輯寫次數',
total_elapsed_time as '完成此計劃的執行所佔用的總時間(微秒)',
(SELECT SUBSTRING(text,statement_start_offset/2,(CASE WHEN statement_end_offset = -1 then LEN(CONVERT(nvarchar(max), text)) * 2 ELSE statement_end_offset end -statement_start_offset)/2) FROM sys.dm_exec_sql_text(sql_handle)) AS 'SQL內容'
FROM sys.dm_exec_query_stats
ORDER BY 1 DESC
--下面的查詢顯示SQL 等待分析和前10 個等待的資源
select top 10 *
from sys.dm_os_wait_stats
where wait_type not in ('CLR_SEMAPHORE','LAZYWRITER_SLEEP','RESOURCE_QUEUE','SLEEP_TASK','SLEEP_SYSTEMTASK','WAITFOR')
order by wait_time_ms desc;
SQL Server中的活動會話數:
exec sp_who 'active'
print @@rowcount
SQL Server等待情況
select * from sys.dm_os_waiting_tasks ; --當前等待事件
select * from sys.dm_os_wait_stats --歷史等待次數,是sqlserver啓動後的累計值,需使用下一條語句清空
DBCC SQLPERF ('sys.dm_os_wait_stats', CLEAR);
找出進程阻塞:
運行下面的查詢可確定阻塞的會話
select blocking_session_id, wait_duration_ms, session_id from
sys.dm_os_waiting_tasks
where blocking_session_id is not null
spid 正在阻塞另一個 spid,可在數據庫中創建以下存儲過程,然後執行該存儲過程。此存儲過程會報告此阻塞情況。鍵入 sp_who 可找出 @spid;@spid 是可選參數。
create proc dbo.sp_block (@spid bigint=NULL)
as
select
t1.resource_type,
'database'=db_name(resource_database_id),
'blk object' = t1.resource_associated_entity_id,
t1.request_mode,
t1.request_session_id,
t2.blocking_session_id
from
sys.dm_tran_locks as t1,
sys.dm_os_waiting_tasks as t2
where
t1.lock_owner_address = t2.resource_address and
t1.request_session_id = isnull(@spid,t1.request_session_id)
以下是使用此存儲過程的示例。
exec sp_block
exec sp_block @spid = 7
select sum((page_size_in_bytes/1024)*max_pages_allocated_count) from sys.dm_os_memory_objects;
select * from sys.dm_os_sys_info;
select * from sys.dm_os_performance_counters
A. 獲取有關按平均 CPU 時間排在最前面的五個查詢的信息
以下示例返回前五個查詢的 SQL 語句文本和平均 CPU 時間。
SELECT TOP 5 total_worker_time/execution_count AS [Avg CPU Time],
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 statement_text
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
ORDER BY total_worker_time/execution_count DESC;
B. 提供批處理執行統計信息
以下示例返回按批執行的 SQL 查詢的文本,並提供有關它們的統計信息。
SELECT s2.dbid,
s1.sql_handle,
(SELECT TOP 1 SUBSTRING(s2.text,statement_start_offset / 2+1 ,
( (CASE WHEN statement_end_offset = -1
THEN (LEN(CONVERT(nvarchar(max),s2.text)) * 2)
ELSE statement_end_offset END) - statement_start_offset) / 2+1)) AS sql_statement,
execution_count,
plan_generation_num,
last_execution_time,
total_worker_time,
last_worker_time,
min_worker_time,
max_worker_time,
total_physical_reads,
last_physical_reads,
min_physical_reads,
max_physical_reads,
total_logical_writes,
last_logical_writes,
min_logical_writes,
max_logical_writes
FROM sys.dm_exec_query_stats AS s1
CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS s2
WHERE s2.objectid is null
ORDER BY s1.sql_handle, s1.statement_start_offset, s1.statement_end_offset;
-- 數據庫文件性能,文件io性能統計(必須重啓sql server服務,才能清零該計數器)
select DB_NAME(database_id) DB_NAME, file_id,io_stall_read_ms ,num_of_reads
,cast(io_stall_read_ms/(1.0+num_of_reads) as numeric(10,1)) as 'avg_read_stall_ms'
,io_stall_write_ms,num_of_writes
,cast(io_stall_write_ms/(1.0+num_of_writes) as numeric(10,1)) as 'avg_write_stall_ms'
,io_stall_read_ms + io_stall_write_ms as io_stalls
,num_of_reads + num_of_writes as total_io
,cast((io_stall_read_ms+io_stall_write_ms)/(1.0+num_of_reads + num_of_writes) as numeric(10,1)) as 'avg_io_stall_ms'
from sys.dm_io_virtual_file_stats(null,null)
order by avg_io_stall_ms desc;
-- 查看分區表money,各個分區的行數和邊界值.
select partition = $partition.分區函數名(userid)
,rows = count(*)
,minval = min(userid)
,maxval = max(userid)
from dbo.money with(nolock)
group by $partition.分區函數名(userid)
order by partition;