1、查詢出最近所有耗時最大的SQL語句
返回的是未關聯任何特定對象的最耗費資源的查詢信息,包括查詢的執行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,
last_worker_time '最后執行總耗時(毫秒)',
last_execution_time '最后執行時間',
total_worker_time '所有執行總耗時(毫秒)',
min_worker_time '執行最小耗時(毫秒)',
max_worker_time '執行最大耗時(毫秒)',
execution_count,
plan_generation_num,
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 last_worker_time DESC,
s1.sql_handle,
s1.statement_start_offset,
s1.statement_end_offset;
說明:
| |
| |
| |
| 通過sys.dm_exec_sql_text獲取的SQL語句文本 |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
● sys.dm_exec_query_stats AS s1:SQL Server中的系統視圖,提供了關于查詢統計信息,例如CPU時間、讀取次數和寫入次數等。
● CROSS APPLY sys.dm_exec_sql_text(s1.sql_handle) AS s2:使用CROSS APPLY運算符將s1.sql_handle傳遞給s2,以便從sys.dm_exec_sql_text視圖中檢索實際的SQL文本
2、查詢數據庫每個數據表存儲占用
查詢指定數據庫的記錄數、總工占用空間KB、總共占用空間MB、已使用空間KB、已使用空間MB、未使用空間KB、未使用空間MB,這對于分析磁盤占用非常有用。
SELECT
t.NAME AS 表名,
s.Name AS 架構,
p.rows AS 記錄數,
SUM ( a.total_pages ) * 8 AS 總工占用空間KB,
CAST ( ROUND( ( ( SUM ( a.total_pages ) * 8 ) / 1024.00 ), 2 ) AS NUMERIC ( 36, 2 ) ) AS 總共占用空間MB,
SUM ( a.used_pages ) * 8 AS 已使用空間KB,
CAST ( ROUND( ( ( SUM ( a.used_pages ) * 8 ) / 1024.00 ), 2 ) AS NUMERIC ( 36, 2 ) ) AS 已使用空間MB,
( SUM ( a.total_pages ) - SUM ( a.used_pages ) ) * 8 AS 未使用空間KB,
CAST (
ROUND( ( ( SUM ( a.total_pages ) - SUM ( a.used_pages ) ) * 8 ) / 1024.00, 2 ) AS NUMERIC ( 36, 2 )
) AS 未使用空間MB
FROM sys.tables t
INNER JOIN sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
INNER JOIN sys.allocation_units a ON p.partition_id = a.container_id
LEFT OUTER JOIN sys.schemas s ON t.schema_id = s.schema_id
WHERE t.NAME NOT LIKE 'dt%' AND t.is_ms_shipped = 0 AND i.OBJECT_ID > 0
GROUP BY t.Name,s.Name,p.Rows
ORDER BY 總共占用空間MB DESC;
3、當前正在執行的最耗時的前10個SQL語句
該語句適合排查生產環境實時SQL語句慢的情況。
SELECT TOP 10
r.session_id,
r.request_id,
r.start_time AS '開始時間',
r.status AS '狀態',
r.command AS '命令',
t.text AS 'sql語句',
DB_NAME(r.database_id) AS '數據庫名',
r.blocking_session_id AS '正在阻塞其他會話的會話ID',
w.wait_type AS '等待資源類型',
r.wait_time AS '等待時間',
r.wait_resource AS '等待的資源',
w.waiting_tasks_count AS '當前正在進行等待的任務數',
r.reads AS '物理讀次數',
r.writes AS '寫次數',
r.logical_reads AS '邏輯讀次數',
r.row_count AS '返回結果行數'
FROM sys.dm_exec_requests AS r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) AS t
LEFT JOIN sys.dm_os_wait_stats AS w ON r.wait_type = w.wait_type
WHERE r.session_id > 50 -- 排除系統進程
ORDER BY r.cpu_time DESC;
注意:sys.dm_exec_requests僅包含當前活動的會話信息,獲取過去一段時間內已經完成的慢查詢,可以使用擴展事件(XEvents)來記錄長時間運行的查詢,并將這些信息寫入一個跟蹤文件,然后分析這些文件來找出歷史某個時間段的慢查詢。
4、SQLServer查看鎖表和解鎖
如果遇到數據庫鎖表的情況,可以通過sql語句拿到鎖表進程id,然后執行殺掉進程語句,解決數據庫卡死的情況。-- 第一步查詢被鎖表
select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName
from sys.dm_tran_locks where resource_type='OBJECT';
--參數說明 spid 鎖表進程 ;tableName 被鎖表名
-- 第二步解鎖語句 需要拿到spid然后殺掉縮表進程
declare @spid int
Set @spid = 57 --鎖表進程
declare @sql varchar(1000)
set @sql='kill '+cast(@spid as varchar)
exec(@sql)
5、快速清理數據庫日志文件
數據庫日志文件隨著業務系統的長期使用會非常占用存儲空間,甚至占用超過幾百G甚至上T,如果不需要進行一直保留數據庫日志文件,可以建一個數據庫作業,定時清理數據庫日志文件,腳本如下:USE master
ALTER DATABASE DB SET RECOVERY SIMPLE WITH NO_WAIT
ALTER DATABASE DB SET RECOVERY SIMPLE --調整為簡單模式
USE DB
DBCC SHRINKFILE (N'DB_log' , 2, TRUNCATEONLY) --設置壓縮后的日志大小為2M,可以自行指定
USE master
ALTER DATABASE DB SET RECOVERY FULL WITH NO_WAIT
ALTER DATABASE DB SET RECOVERY FULL --還原為完全模式
該文章在 2024/9/4 15:48:55 編輯過