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