Sqlserver性能分析
文章目录sqlserver性能分析一、查看执行计划(SHOWPLAN_ALL)二、查看磁盘使用率(STATISTICS IO)三、查询时间耗时较长的语句四 死锁处理sqlserver性能分析提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考一、
·
文章目录
sqlserver性能分析
当数据库服务器出现IO占用较高时,就可以检查一下是否时某些sql语句查询的时候没有走索引,或者时某些表的索引建立得不对
提示:以下是本篇文章正文内容,下面案例可供参考
一、查看执行计划(SHOWPLAN_ALL)
显示查询计划是SQL Server将显示在执行查询的过程中连接表时所采取的每个步骤,以及是否选择及选择了哪个索引,从而帮助用户分析有哪些索引被系统采用。
通常在查询语句中设置SHOWPLAN_ALL选项,可以选择是否让SQL Server显示查询计划。
SET SHOWPLAN_ALL ON ︳OFF 或 SET SHOWPLAN_TEXT ON | OFF
例题:在book数据库中的User表上查询“学号=123“的学生,并分析哪些索引被系统采用。
USE book
GO
SET SHOWPLAN_ALL ON
GO
SELECT * FROM User
WHERE 学号= '123'
GO
SET SHOWPLAN_ALL OFF
GO
二、查看磁盘使用率(STATISTICS IO)
数据检索语句所花费的磁盘活动量也是用户比较关心的性能之一。通过设置STATISTICS IO选项,可以是SQL Server显示磁盘IO信息。
设置是否显示磁盘IO统计的命令为:
SET STATISTICS IO ON| OFF
USE book
GO
SET STATISTICS IO ON
GO
SELECT * FROM book1
WHERE 编号 = 'YBZT246'
GO
SET STATISTICS IO OFF
GO
三、查询时间耗时较长的语句
SELECT TOP 20
total_worker_time/1000 AS [总消耗CPU 时间(ms)],execution_count [运行次数],
qs.total_worker_time/qs.execution_count/1000 AS [平均消耗CPU 时间(ms)],
last_execution_time AS [最后一次执行时间],max_worker_time /1000 AS [最大执行时间(ms)],
SUBSTRING(qt.text,qs.statement_start_offset/2+1,
(CASE WHEN qs.statement_end_offset = -1
THEN DATALENGTH(qt.text)
ELSE qs.statement_end_offset END -qs.statement_start_offset)/2 + 1)
AS [使用CPU的语法], qt.text [完整语法],
dbname=db_name(qt.dbid),
object_name(qt.objectid,qt.dbid) ObjectName
FROM sys.dm_exec_query_stats qs WITH(nolock)
CROSS apply sys.dm_exec_sql_text(qs.sql_handle) AS qt
WHERE execution_count>1
ORDER BY total_worker_time DESC
四、 死锁处理
select
request_session_id spid,
OBJECT_NAME(resource_associated_entity_id) tableName
from
sys.dm_tran_locks
where
resource_type='OBJECT'
--杀死死锁进程
kill 354
--显示死锁相关信息
exec sp_who2 354
五、sqlserver 自动杀死锁
GO
SELECT * FROM master.dbo.sysdatabases WHERE name = 'posserver'
GO
IF EXISTS (SELECT * FROM sysobjects WHERE name = 'Up_AutoKillBlocked')
DROP PROCEDURE Up_AutoKillBlocked
GO
CREATE PROCEDURE Up_AutoKillBlocked
WITH ENCRYPTION
AS
BEGIN
DECLARE @blockid smallint
DECLARE @proc_name varchar(200)
SET @blockid = 0
WHILE 1 > 0
BEGIN
WHILE EXISTS(SELECT blocked FROM master.dbo.sysprocesses WHERE blocked > 0 AND dbid = 100)
BEGIN
SELECT TOP 1 @blockid = blocked FROM master.dbo.sysprocesses WHERE blocked > 0 AND dbid = 100
IF ISNULL(@blockid,0) > 0
BEGIN
SET @proc_name = 'KILL ' + CONVERT(VARCHAR(10), @blockid)
EXEC @proc_name
END
WAITFOR DELAY '00:00:01'
END
WAITFOR DELAY '00:00:05'
END
END
GO
EXEC Up_AutoKillBlocked
GO
更多推荐
所有评论(0)