掘金 后端 ( ) • 2022-09-22 17:23

我正在参加「掘金·启航计划」

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