史上最全的sqlserver运维分析工具,汇总都在这里了,适合sqlserver的dba人员

 比较常用的sqlserver运维分析语句


SELECT TOP 2000 
       ST.text AS '执行的SQL语句',
       QS.execution_count AS '执行次数',
       QS.total_elapsed_time AS '耗时',
       QS.total_logical_reads AS '逻辑读取次数',
       QS.total_logical_writes AS '逻辑写入次数',
       QS.total_physical_reads AS '物理读取次数',       
       QS.creation_time AS '执行时间' ,  
       QS.*
FROM   sys.dm_exec_query_stats QS
       CROSS APPLY 
sys.dm_exec_sql_text(QS.sql_handle) ST
WHERE  DATEDIFF(day,QS.creation_time,GETDATE())=0
ORDER BY
     QS.total_logical_reads DESC

上面筛选出比较耗资源的sql ,
下面的sql语句去分析


----mssql 判断sql语句的执行效率语句
SET STATISTICS io ON
SET STATISTICS time ON
go
--========此处为sql代码段===============
 

go
SET STATISTICS profile OFF
SET STATISTICS io OFF
SET STATISTICS time OFF



---各项指标是否正常,是否有阻塞,正常情况下搜索结果应该为空。
SELECT TOP 10
[session_id],
[request_id],
[start_time] AS '开始时间',
[status] AS '状态',
[command] AS '命令',
dest.[text] AS 'sql语句',
DB_NAME([database_id]) AS '数据库名',
[blocking_session_id] AS '正在阻塞其他会话的会话ID',
[wait_type] AS '等待资源类型',
[wait_time] AS '等待时间',
[wait_resource] AS '等待的资源',
[reads] AS '物理读次数',
[writes] AS '写次数',
[logical_reads] AS '逻辑读次数',
[row_count] AS '返回结果行数'
FROM sys.[dm_exec_requests] AS der
CROSS APPLY
sys.[dm_exec_sql_text](der.[sql_handle]) AS dest
WHERE [session_id]>50 AND DB_NAME(der.[database_id])='gposdb'
ORDER BY [cpu_time] DESC


--在SSM占用较大可以使用下面代码
SELECT TOP 10
dest.[text] AS 'sql语句'
FROM sys.[dm_exec_requests] AS der
CROSS APPLY
sys.[dm_exec_sql_text](der.[sql_handle]) AS dest
WHERE [session_id]>50
ORDER BY [cpu_time] DESC

---如果SQLSERVER存在要等待的资源,那么执行下面语句就会显示出会话中有多少个worker在等待
SELECT TOP 10
 [session_id],
 [request_id],
 [start_time] AS '开始时间',
 [status] AS '状态',
 [command] AS '命令',
 dest.[text] AS 'sql语句',
 DB_NAME([database_id]) AS '数据库名',
 [blocking_session_id] AS '正在阻塞其他会话的会话ID',
 der.[wait_type] AS '等待资源类型',
 [wait_time] AS '等待时间',
 [wait_resource] AS '等待的资源',
 [dows].[waiting_tasks_count] AS '当前正在进行等待的任务数',
 [reads] AS '物理读次数',
 [writes] AS '写次数',
 [logical_reads] AS '逻辑读次数',
 [row_count] AS '返回结果行数'
 FROM sys.[dm_exec_requests] AS der
 INNER JOIN [sys].[dm_os_wait_stats] AS dows
 ON der.[wait_type]=[dows].[wait_type]
 CROSS APPLY
 sys.[dm_exec_sql_text](der.[sql_handle]) AS dest
 WHERE [session_id]>50
 ORDER BY [cpu_time] DESC


----查询CPU占用最高的SQL语句
SELECT TOP 10
   total_worker_time/execution_count AS avg_cpu_cost, plan_handle,
   execution_count,
   (SELECT SUBSTRING(text, statement_start_offset/2 + 1,
      (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 query_text
FROM sys.dm_exec_query_stats
ORDER BY [avg_cpu_cost] DESC


----索引缺失查询
SELECT
    DatabaseName = DB_NAME(database_id)
    ,[Number Indexes Missing] = count(*)
FROM sys.dm_db_missing_index_details
GROUP BY DB_NAME(database_id)
ORDER BY 2 DESC;
SELECT  TOP 10
        [Total Cost]  = ROUND(avg_total_user_cost * avg_user_impact * (user_seeks + user_scans),0)
        , avg_user_impact
        , TableName = statement
        , [EqualityUsage] = equality_columns
        , [InequalityUsage] = inequality_columns
        , [Include Cloumns] = included_columns
FROM        sys.dm_db_missing_index_groups g
INNER JOIN    sys.dm_db_missing_index_group_stats s
       ON s.group_handle = g.index_group_handle
INNER JOIN    sys.dm_db_missing_index_details d
       ON d.index_handle = g.index_handle
ORDER BY [Total Cost] DESC;





SELECT TOP 2000 
       ST.text AS '执行的SQL语句',
       QS.execution_count AS '执行次数',
       QS.total_elapsed_time AS '耗时',
       QS.total_logical_reads AS '逻辑读取次数',
       QS.total_logical_writes AS '逻辑写入次数',
       QS.total_physical_reads AS '物理读取次数',       
       QS.creation_time AS '执行时间' ,  
       QS.*
FROM   sys.dm_exec_query_stats QS
       CROSS APPLY 
sys.dm_exec_sql_text(QS.sql_handle) ST
WHERE  DATEDIFF(day,QS.creation_time,GETDATE())=0
ORDER BY
     QS.total_elapsed_time DESC
-- 查询SqlServer总体的内存使用情况
select      type
        , sum(virtual_memory_reserved_kb) VM_Reserved
        , sum(virtual_memory_committed_kb) VM_Commited
        , sum(awe_allocated_kb) AWE_Allocated
        , sum(shared_memory_reserved_kb) Shared_Reserved
        , sum(shared_memory_committed_kb) Shared_Commited
        --, sum(single_pages_kb)    --SQL2005、2008
        --, sum(multi_pages_kb)        --SQL2005、2008
from    sys.dm_os_memory_clerks
group by type
order by type

--查看每个数据库对内存的占用
SELECT 
    ISNULL(DB_NAME(DATABASE_ID),'RESOURCEDB') AS DATABASENAME,
    CAST(COUNT(ROW_COUNT) * 8.0 /(1024.0) AS DECIMAL(28,2)) AS 'SIZE(MB)'
FROM SYS.dm_os_buffer_descriptors
GROUP BY database_id
ORDER BY DATABASENAME


-- 查询当前数据库缓存的所有数据页面,哪些数据表,缓存的数据页面数量
-- 从这些信息可以看出,系统经常要访问的都是哪些表,有多大?
select p.object_id, object_name=object_name(p.object_id), p.index_id, buffer_pages=count(*) 
from sys.allocation_units a, 
    sys.dm_os_buffer_descriptors b, 
    sys.partitions p 
where a.allocation_unit_id=b.allocation_unit_id 
    and a.container_id=p.hobt_id 
    and b.database_id=db_id()
group by p.object_id,p.index_id 
order by buffer_pages desc 


-- 查询缓存的各类执行计划,及分别占了多少内存
-- 可以对比动态查询与参数化SQL(预定义语句)的缓存量
select    cacheobjtype
        , objtype
        , sum(cast(size_in_bytes as bigint))/1024 as size_in_kb
        , count(bucketid) as cache_count
from    sys.dm_exec_cached_plans
group by cacheobjtype, objtype
order by cacheobjtype, objtype


-- 查询缓存中具体的执行计划,及对应的SQL
-- 将此结果按照数据表或SQL进行统计,可以作为基线,调整索引时考虑
-- 查询结果会很大,注意将结果集输出到表或文件中
SELECT  usecounts ,
        refcounts ,
        size_in_bytes ,
        cacheobjtype ,
        objtype ,
        TEXT
FROM    sys.dm_exec_cached_plans cp
        CROSS APPLY sys.dm_exec_sql_text(plan_handle)
ORDER BY objtype DESC ;
GO










-----------查询缓存的表----------------------
SELECT count(*)*8 AS cached_pages_kb,obj.name ,obj.index_id,b.type_desc,b.name 
FROM sys.dm_os_buffer_descriptors AS bd 
INNER JOIN(SELECT object_name(object_id) AS name,index_id ,allocation_unit_id,object_id
   FROM sys.allocation_units AS au 
            INNER JOIN sys.partitions AS p ON au.container_id = p.hobt_id AND (au.type = 1 OR au.type = 3)
         UNION ALL 
   SELECT object_name(object_id) AS name,index_id, allocation_unit_id,object_id 
   FROM sys.allocation_units AS au 
   INNER JOIN sys.partitions AS p ON au.container_id = p.partition_id AND au.type = 2) AS obj 
        ON bd.allocation_unit_id = obj.allocation_unit_id 
LEFT JOIN sys.indexes b on b.object_id = obj.object_id AND b.index_id = obj.index_id  
WHERE database_id = db_id()  --and obj.name='StoreOut'
GROUP BY obj.name, obj.index_id ,b.name,b.type_desc 
ORDER BY cached_pages_kb DESC; 




-------------如果要查询是否连接没有释放引起的, 你可以用查询分析器连接到你的数据库服务器, 执行下面的代码:-----------------------------
select * from master.dbo.sysprocesses
where spid>50
and waittype = 0x0000
and waittime = 0
and status = 'sleeping'
and last_batch < dateadd(minute, -10, getdate())
and login_time < dateadd(minute, -10, getdate())





----mssql 判断sql语句的执行效率语句
SET STATISTICS io ON
SET STATISTICS time ON
go
--========此处为sql代码段===============
select count(1) from ProductInfo mb  where (1=1    and	charindex('53875-027',mb.SeachKey)>=1 And mb.FactName in ('丰田','品牌') And mb.Status=1) 
select count(1) from ProductInfo mb  where (1=1    and	exists(select *  from f_split('品牌,丰田',',') t where t.col=mb.FactName))

go
SET STATISTICS profile OFF
SET STATISTICS io OFF
SET STATISTICS time OFF


------------------------查询索引------------------------------------------------
SELECT CASE
           WHEN t.[type] = 'U' THEN
               '表'
           WHEN t.[type] = 'V' THEN
               '视图'
       END AS '类型',
       SCHEMA_NAME(t.schema_id) + '.' + t.[name] AS '(表/视图)名称',
	'drop index [' + i.name + '] ON [' + t.name + ']' AS DropIndexCommand,

       i.[name] AS 索引名称,
       SUBSTRING(column_names, 1, LEN(column_names) - 1) AS '列名',
       CASE
           WHEN i.[type] = 1 THEN
               '聚集索引'
           WHEN i.[type] = 2 THEN
               '非聚集索引'
           WHEN i.[type] = 3 THEN
               'XML索引'
           WHEN i.[type] = 4 THEN
               '空间索引'
           WHEN i.[type] = 5 THEN
               '聚簇列存储索引'
           WHEN i.[type] = 6 THEN
               '非聚集列存储索引'
           WHEN i.[type] = 7 THEN
               '非聚集哈希索引'
       END AS '索引类型',
       CASE
           WHEN i.is_unique = 1 THEN
               '唯一'
           ELSE
               '不唯一'
       END AS '索引是否唯一'
FROM sys.objects t
    INNER JOIN sys.indexes i
        ON t.object_id = i.object_id
    CROSS APPLY
(
    SELECT col.[name] + ', '
    FROM sys.index_columns ic
        INNER JOIN sys.columns col
            ON ic.object_id = col.object_id
               AND ic.column_id = col.column_id
    WHERE ic.object_id = t.object_id
          AND ic.index_id = i.index_id
    ORDER BY col.column_id
    FOR XML PATH('')
) D(column_names)
WHERE t.is_ms_shipped <> 1
      AND index_id > 0
ORDER BY i.[name];


----------------查询索引碎片----------------------------------------
SELECT DB_NAME(ips.database_id) DBName,
	   OBJECT_NAME(ips.object_id) ObjName,
	   i.name IndexName,
	   ips.avg_fragmentation_in_percent
FROM sys.dm_db_index_physical_stats(DB_ID('AppsDB'),
	DEFAULT,DEFAULT,DEFAULT,default) ips
INNER JOIN sys.indexes i
ON	ips.index_id = i.index_id AND
	ips.object_id = i.object_id
WHERE 
	ips.object_id>99 AND
	ips.avg_fragmentation_in_percent>=10 AND
    ips.index_id>0


备份数据库和还原数据库方式方法



--获取每张表的行数
SELECT a.name, b.rows
FROM sysobjects AS a INNER JOIN sysindexes AS b ON a.id = b.id
WHERE (a.type = 'u') AND (b.indid IN (0, 1))
ORDER BY b.rows DESC

--清空日志文件
ALTER DATABASE dbname SET RECOVERY SIMPLE   --简单模式
DBCC SHRINKFILE (N'dbname_log' , 11, TRUNCATEONLY)
ALTER DATABASE dbname SET RECOVERY FULL  --还原为完全模式


--删除备份文件
DECLARE @oldDate DATETIME
SET @oldDate =dateadd(DAY,-5, GETDATE())
EXECUTE MASTER.dbo.xp_delete_file 
    0,                            --0: 备份文件,1: 维护计划文本报告
    N'E:\Backup\',          --文件路径
    N'bak',                       --文件扩展名
    @oldDate,                     --在此时间之前的文件一律删除
    1                             --删除子文件夹中的文件


-- 备份数据库命令
declare @name varchar(250) 
set @name='D:\Backup\dbname_'+ convert(varchar(50),getdate(),112)+cast(cast( rand()*1000 as int) as varchar)+'.bak'
BACKUP DATABASE Baichuang TO  DISK = @name
WITH NOFORMAT, NOINIT,  NAME = N'dbname_-完整 数据库 备份', SKIP, NOREWIND, NOUNLOAD



---------------自动还原数据库--------------
use master
go
---声明变量
declare @dbName nvarchar(max)='dbname';
declare @dbFullName nvarchar(max)='D:\Backup\dbname.bak';
--1.1修改为单用模式
 exec(N'ALTER DATABASE '+@dbName+' SET SINGLE_USER WITH ROLLBACK IMMEDIATE');
--1.2结束链接进程
	DECLARE @kid varchar(max)  
	SET @kid=''  
	SELECT @kid=@kid+'KILL '+CAST(spid as Varchar(10))  FROM master..sysprocesses  
	WHERE dbid=DB_ID(@dbName)  ;
	EXEC(@kid) ;
--2.执行还原语句
   restore database @dbName from  disk=@dbFullName
   with replace  --覆盖现有的数据库
--3.重置数据库为多用户模式
 exec(N'ALTER DATABASE '+@dbName+' SET MULTI_USER WITH ROLLBACK IMMEDIATE');







 

  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL Server是一种关系型数据库管理系统,用于存储和管理大量结构化数据。作为一个运维人员,你需要负责确保SQL Server的正常运行和高可用性。以下是SQL Server运维的一些重要方面: 1. 安装和配置:你需要了解如何正确安装SQL Server,并进行必要的配置,包括设置数据库引擎、安全性、网络连接等。 2. 数据库备份和恢复:备份是保护数据免受意外损坏或丢失的重要手段。你需要定期执行数据库备份,并确保备份文件的安全存储。同时,当需要恢复数据时,你需要熟悉不同的恢复策略和方法。 3. 性能优化:SQL Server的性能对于应用程序的响应时间和用户体验至关重要。你需要监控数据库的性能指标,如CPU利用率、内存使用、磁盘IO等,并进行性能调优,如索引优化、查询优化等。 4. 安全管理:保护数据库的安全性是运维作中的重要任务。你需要设置合适的访问权限,确保只有授权用户可以访问数据库。此外,你还需要定期更新数据库服务器和相关软件的补丁,以防止安全漏洞被利用。 5. 高可用性和灾备:对于关键业务系统,你需要确保SQL Server的高可用性和灾备能力。这包括设置数据库镜像、复制、Always On可用性组等技术,以及定期测试和验证灾备方案。 6. 监控和故障排除:你需要使用监控工具来实时监测SQL Server的运行状态,并及时发现和解决潜在的故障。当出现问题时,你需要进行故障排除,分析日志和错误信息,并采取适当的措施进行修复。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值