SQLServer运维实用的几个脚本
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
|
● sys.dm_exec_query_stats AS s1:SQL Server中的系统视图,提供了关于查询统计信息,例如CPU时间、读取次数和写入次数等。
查询指定数据库的记录数、总工占用空间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;

该语句适合排查生产环境实时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;

-- 第一步查询被锁表
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)
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 --还原为完全模式