SQL SERVER性能分析

--阻塞
/***********************************************************************************************************************
阻塞:其中一个事务阻塞,其它事务等待对方释放它们的锁,同时会导致死锁问题。   

整理人:中国风(Roy)   

日期:2008.07.20
************************************************************************************************************************/   

--生成测试表Ta
if not object_id(‘Ta‘) is null
    drop table Ta
go
create table Ta(ID int Primary key,Col1 int,Col2 nvarchar(10))
insert Ta
select 1,101,‘A‘ union all
select 2,102,‘B‘ union all
select 3,103,‘C‘
go
生成数据:
/*
表Ta
ID          Col1        Col2
----------- ----------- ----------
1           101         A
2           102         B
3           103         C   

(3 行受影响)
*/   

将处理阻塞减到最少:
1、事务要尽量短
2、不要在事务中请求用户输入
3、在读数据考虑便用行版本管理
4、在事务中尽量访问最少量的数据
5、尽可能地使用低的事务隔离级别   

go
阻塞1(事务):
--测试单表   

-----------------------------连接窗口1(update/insert/delete)----------------------
begin tran
--update
    update ta set col2=‘BB‘ where ID=2
--或insert
begin tran
    insert Ta values(4,104,‘D‘)
--或delete
begin tran
    delete ta where ID=1   

--rollback tran   

------------------------------------------连接窗口2--------------------------------
begin tran
    select * from ta   

--rollback tran   

--------------分析-----------------------
select
    request_session_id as spid,
    resource_type,
    db_name(resource_database_id) as dbName,
    resource_description,
    resource_associated_entity_id,
    request_mode as mode,
    request_status as Status
from
    sys.dm_tran_locks
/*
spid        resource_type dbName resource_description resource_associated_entity_id mode  Status
----------- ------------- ------ -------------------- ----------------------------- ----- ------
55          DATABASE      Test   0                    S                             GRANT NULL
54          DATABASE      Test   0                    S                             GRANT NULL
53          DATABASE      Test   0                    S                             GRANT NULL
55          PAGE          Test   1:201                72057594040483840             IS    GRANT
54          PAGE          Test   1:201                72057594040483840             IX    GRANT
55          OBJECT        Test   1774629365           IS                            GRANT NULL
54          OBJECT        Test   1774629365           IX                            GRANT NULL
54          KEY           Test   (020068e8b274)       72057594040483840             X     GRANT --(spID:54请求了排它锁)
55          KEY           Test   (020068e8b274)       72057594040483840             S     WAIT  --(spID:55共享锁+等待状态)
(9 行受影响)
*/   

--查连接住信息(spid:54、55)
select connect_time,last_read,last_write,most_recent_sql_handle
from sys.dm_exec_connections where session_id in(54,55)   

--查看会话信息
select login_time,host_name,program_name,login_name,last_request_start_time,last_request_end_time
from sys.dm_exec_sessions where session_id in(54,55)   

--查看阻塞正在执行的请求
select
    session_id,blocking_session_id,wait_type,wait_time,wait_resource
from
    sys.dm_exec_requests
where
    blocking_session_id>0--正在阻塞请求的会话的 ID。如果此列是 NULL,则不会阻塞请求   

--查看正在执行的SQL语句   

select
    a.session_id,sql.text,a.most_recent_sql_handle
from
    sys.dm_exec_connections a
cross apply
    sys.dm_exec_sql_text(a.most_recent_sql_handle) as SQL   --也可用函数fn_get_sql通过most_recent_sql_handle得到执行语句
where
    a.Session_id in(54,55)
/*
session_id  text
----------- -----------------------------------------------
54          begin tran   update ta set col2=‘BB‘ where ID=2
55          begin tran   select * from ta
*/   

处理方法:
--连接窗口2
begin tran
    select * from ta with (nolock)--用nolock:业务数据不断变化中,如销售查看当月时可用。   

阻塞2(索引):   

-----------------------连接窗口1
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE    --针对会话设置了 TRANSACTION ISOLATION LEVEL
begin tran
    update ta set col2=‘BB‘ where COl1=102   

--rollback tran   

------------------------连接窗口2
insert into ta(ID,Col1,Col2) values(5,105,‘E‘)   

处理方法:   

create index IX_Ta_Col1 on Ta(Col1)--用COl1列上创索引,当更新时条件:COl1=102会用到索引IX_Ta_Col1上得到一个排它键的范围锁   

阻塞3(会话设置):   

-------------------------------连接窗口1   

begin tran
--update
    update ta set col2=‘BB‘ where ID=2
    select col2 from ta where ID=2   

--rollback tran   

--------------------------------连接窗口2   

SET TRANSACTION ISOLATION LEVEL READ COMMITTED --设置会话已提交读:指定语句不能读取已由其他事务修改但尚未提交的数据
begin tran
    select * from ta    

处理方法:
--------------------------------连接窗口2(善用会话设置:业务数据不断变化中,如销售查看当月时可用)   

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED --设置会话未提交读:指定语句可以读取已由其他事务修改但尚未提交的行
begin tran
    select * from ta
<pre></pre>

[转自]:http://blog.csdn.net/roy_88/article/details/2682044
二、死锁检测数据库阻塞语句

--查看死锁情况

SELECTDISTINCT
‘进程ID‘=STR(a.spid, 4)
, ‘进程ID状态‘=CONVERT(CHAR(10), a.status)
, ‘死锁进程ID‘=STR(a.blocked, 2)
, ‘工作站名称‘=CONVERT(CHAR(10), a.hostname)
, ‘执行命令的用户‘=CONVERT(CHAR(10), SUSER_NAME(a.uid))
, ‘数据库名‘=CONVERT(CHAR(10), DB_NAME(a.dbid))
, ‘应用程序名‘=CONVERT(CHAR(10), a.program_name)
, ‘正在执行的命令‘=CONVERT(CHAR(16), a.cmd)
, ‘登录名‘= a.loginame
, ‘执行语句‘= b.text
FROM master..sysprocesses a CROSS APPLY
sys.dm_exec_sql_text(a.sql_handle) b
WHERE a.blocked IN ( SELECT blocked
FROM master..sysprocesses )
-- and blocked <> 0
ORDERBYSTR(spid, 4)

--查连接住信息(spid:57、58)
select connect_time,last_read,last_write,most_recent_sql_handle
from sys.dm_exec_connections where session_id in(57,58)
--查看会话信息
select login_time,host_name,program_name,login_name,last_request_start_time,last_request_end_time
from sys.dm_exec_sessions where session_id in(57,58)
--查看阻塞正在执行的请求
select
session_id,blocking_session_id,wait_type,wait_time,wait_resource
from
sys.dm_exec_requests
where
blocking_session_id>0--正在阻塞请求的会话的 ID。如果此列是 NULL,则不会阻塞请求
/*
session_id,blocking_session_id,wait_type,wait_time,wait_resource
58 57 LCK_M_S 2116437 KEY: 6:72057594039435264 (020068e8b274)
*/
--查看正在执行的SQL语句
select
a.session_id,sql.text,a.most_recent_sql_handle
from
sys.dm_exec_connections a
cross apply
sys.dm_exec_sql_text(a.most_recent_sql_handle) as SQL --也可用函数fn_get_sql通过most_recent_sql_handle得到执行语句
where
a.Session_id in(57,58)
--查询锁类型

select 进程id=a.req_spid
  ,数据库=db_name(rsc_dbid)
  ,类型=case rsc_type when1then‘NULL 资源(未使用)‘
  when2then‘数据库‘
  when3then‘文件‘
  when4then‘索引‘
  when5then‘表‘
  when6then‘页‘
  when7then‘键‘
  when8then‘扩展盘区‘
  when9then‘RID(行 ID)‘
  when10then‘应用程序‘
  end
  ,对象id=rsc_objid
  ,对象名=b.obj_name
  ,rsc_indid
from master..syslockinfo a leftjoin #t b on a.req_spid=b.req_spid

----查看SA用户执行的SQL
SELECT  ‘进程ID[SPID]‘=STR(a.spid, 4)
  , ‘进程状态‘=CONVERT(CHAR(10), a.status)
  , ‘分块进程ID‘=STR(a.blocked, 2)
  , ‘服务器名称‘=CONVERT(CHAR(10), a.hostname)
  , ‘执行用户‘=CONVERT(CHAR(10), SUSER_NAME(a.uid))
  , ‘数据库名‘=CONVERT(CHAR(10), DB_NAME(a.dbid))
  , ‘应用程序名‘=CONVERT(CHAR(10), a.program_name)
  , ‘正在执行的命令‘=CONVERT(CHAR(16), a.cmd)
  , ‘累计CPU时间‘=STR(a.cpu, 7)
  , ‘IO‘=STR(a.physical_io, 7)
  , ‘登录名‘= a.loginame
  , ‘执行sql‘= b.text
FROM    master..sysprocesses a CROSS APPLY
    sys.dm_exec_sql_text(a.sql_handle) b
WHERE   blocked <>0OR a.loginame=‘sa‘
ORDERBY spid

主要动态管理视图:

sys.sysprocesses(兼容sql2k)

sys.dm_exec_connections

sys.dm_exec_sessions

sys.dm_exec_requests

来源:http://www.cnblogs.com/ilovexiao/archive/2010/05/21/1740645.html
时间: 2024-10-10 02:08:26

SQL SERVER性能分析的相关文章

SQL SERVER性能分析--死锁检测数据库阻塞语句

工作中数据库经常出现内存,找了篇文章 参照CSDN,中国风(Roy)一篇死锁文章 阻塞:其中一个事务阻塞,其它事务等待对方释放它们的锁,同时会导致死锁问题. 整理人:中国风(Roy) 参照Roy_88的博客 http://blog.csdn.net/roy_88/archive/2008/07/21/2682044.aspx 日期:2008.07.20 ************************************************************************

sql server性能分析--执行sql次数和逻辑次数

目前在做一个项目优化时,想通过数据库层分析sql server系统性能,查了一下网上代码,修改了一下标题和DMVs代码,以下代码可以用来分析系统运行一段时间后,那些语句是系统忙的sql语句.做为参考. 另类使用: 一次在分析一个对账功能时,查看系统代码,看了半天,写得太不规范,又不写注释,看不明白.最后用了下面一个小技巧,和大家一起分享: 就是在测量功能时,先以下命令清除sql server的缓存: dbcc freeProcCache 在点击某个按钮,执行完后,在执行下面语句,就可以知道系统运

sql server 性能调优之 逻辑内存消耗最大资源分析1 (自sqlserver服务启动以后)

原文:sql server 性能调优之 逻辑内存消耗最大资源分析1 (自sqlserver服务启动以后) 一.概述 IO 内存是sql server最重要的资源,数据从磁盘加载到内存,再从内存中缓存,输出到应用端,在sql server 内存初探中有介绍.在明白了sqlserver内存原理后,就能更好的分析I/O开销,从而提升数据库的整体性能. 在生产环境下数据库的sqlserver服务启动后一个星期,就可以通过dmv来分析优化.在I/O分析这块可以从物理I/O和内存I/O二方面来分析, 重点分

sql server 性能调优之 当前用户请求分析 (1)

原文:sql server 性能调优之 当前用户请求分析 (1) 一. 概述 在生产数据库运行期间,有时我们需要查看当前用户会话状态或者是说数据库当前是否运行良好, 应用的场景比如:当运行的应用系统响应突然变慢时需要分析数据库的.或想分析当前的数据库是否繁忙,是否有长时间的等待, 又或者执行一个sql的回滚状态查看,想手动kill掉一个会话时 等等.都需要从当前的会话状态去分析. 这篇主要介绍sys.sysprocesses 函数,这里面包含了当前用户大量的信息,如会话进程有多少,等待时间,op

sql server 性能调优之 CPU消耗最大资源分析1 (自sqlserver服务启动以后)

原文:sql server 性能调优之 CPU消耗最大资源分析1 (自sqlserver服务启动以后) 一. 概述 上次在介绍性能调优中讲到了I/O的开销查看及维护,这次介绍CPU的开销及维护, 在调优方面是可以从多个维度去发现问题如I/O,CPU,  内存,锁等,不管从哪个维度去解决,都能达到调优的效果,因为sql server系统作为一个整体性,它都是紧密相连的,例如:解决了sql语句中I/O开销较多的问题,那对应的CPU开销也会减少,反之解决了CPU开销最多的,那对应I/O开销也会减少.解

SQL Server性能优化——等待——SLEEP_BPROOL_FLUSH

前言: 有一个用于历史归档的数据库(简称历史库),经过一定时间的积累,数据文件已经达到700多GB,后来决定某些数据可以不需要保留,就把这部分数据truncate了,空余出600多GB的空间,也就是说,经过收缩后,理论上数据库只有100多G.为此,我经过重建各个表(表数量不多,但单表数量还是有几千万)的聚集索引后,准备进行收缩. 但是当收缩开始时,即使把每次收缩的范围缩小到500MB,速度也极其慢,经常几个小时都没反应.经过查看等待信息之后发现有一个SPID=18的会话(SPID<=50的均为系

初涉SQL Server性能问题(4/4):列出最耗资源的会话

原文:初涉SQL Server性能问题(4/4):列出最耗资源的会话 在上3篇文章里,我们讨论了列出反映服务器当前状态的不同查询. 初涉SQL Server性能问题(1/4):服务器概况 初涉SQL Server性能问题(2/4):列出等待资源的会话 初涉SQL Server性能问题(3/4):列出阻塞的会话 这篇文章我们看下从计划缓存里列出执行状态. 1 /*********************************************************************

初涉SQL Server性能问题(2/4):列出等待资源的会话

原文:初涉SQL Server性能问题(2/4):列出等待资源的会话 在初涉SQL Server性能问题(1/4)里,我们知道了如何快速检查服务器实例上正运行的任务数和IO等待的任务数.这个是轻量级的脚本,不会给服务器造成任何压力,即使服务器在高负荷下,也可以正常获得结果. 问题检测的第2步是获取在进行任何资源等待的会话.下面的脚本会帮助我们获得这些信息.这个查询需要预建立一个函数,如果会话是由SQL Server代理启动的话,会显示具体的作业名. 1 /********************

初涉SQL Server性能问题(1/4):服务器概况

原文:初涉SQL Server性能问题(1/4):服务器概况 当你作为DBA时,很多人会向你抱怨:“这个程序数据加载和蜗牛一样,你看看是不是服务器出问题了?”造成这个问题的原因有很多.可能是程序应用服务器问题,网络问题,程序实现方式问题,数据库服务器负荷过重.不管是哪个问题,数据库总是第一个被抱怨的.我们DBA的职责就是找出问题所在,并解决它们. 问题解决第一步,诊断分析: 1 SELECT 2 parent_node_id AS Node_Id, 3 COUNT(*) AS [No.of CP