数据库问题排查总结

来源:互联网 发布:拍照搞怪表情软件 编辑:程序博客网 时间:2024/06/06 05:20

*******************sp_who, sp_who2和sp_who3*********************

sp_who可以返回如下信息: (可选参数LoginName, 或active代表活动会话数)
Spid         (系统进程ID)
status      (进程状态)
loginame  (用户登录名)
hostname(用户主机名)
blk           (阻塞进程的SPID)
dbname   (进程正在使用的数据库名)
Cmd        (当前正在执行的命令类型)

sp_who2除了显示上面sp_who的输出信息外,还显示下面的信息:  (可选参数LoginName, 或active代表活动会话数)
CPUTime           (进程占用的总CPU时间)
DiskIO              (进程对磁盘读的总次数)
LastBatch         (客户最后一次调用存储过程或者执行查询的时间)
ProgramName  (用来初始化连接的应用程序名称,或者主机名)

 

 sp_who3是某牛人自定义的存储过程,(可选参数spid),显示“非系统会话,且是活动的会话”的详细情况。

CREATE PROCEDURE sp_who3 

(  @SessionID int = NULL ) 

AS

BEGIN

SELECT

    SPID                = er.session_id 

    ,Status             = ses.status 

    ,[Login]            = ses.login_name 

    ,Host               = ses.host_name 

    ,BlkBy              = er.blocking_session_id 

    ,DBName             = DB_Name(er.database_id) 

    ,CommandType        = er.command 

    ,SQLStatement       = st.text 

    ,ObjectName         = OBJECT_NAME(st.objectid) 

    ,ElapsedMS          = er.total_elapsed_time 

    ,CPUTime            = er.cpu_time 

    ,IOReads            = er.logical_reads + er.reads 

    ,IOWrites           = er.writes 

    ,LastWaitType       = er.last_wait_type 

    ,StartTime          = er.start_time 

    ,Protocol           = con.net_transport 

    ,ConnectionWrites   = con.num_writes 

    ,ConnectionReads    = con.num_reads 

    ,ClientAddress      = con.client_net_address 

    ,Authentication     = con.auth_scheme 

FROM sys.dm_exec_requests er 

OUTER APPLY sys.dm_exec_sql_text(er.sql_handle) st 

LEFT JOIN sys.dm_exec_sessions ses 

ON ses.session_id = er.session_id 

LEFT JOIN sys.dm_exec_connections con 

ON con.session_id = ses.session_id 

WHERE er.session_id > 50 

    AND @SessionID IS NULL OR er.session_id = @SessionID 

ORDER BY

    er.blocking_session_id DESC

    ,er.session_id 

END

go



***************************索引缺失*************************


use *******--要查看的数据库所提供的索引使用情况


SELECT DISTINCT db_name(database_id) as N'数据库名称',
       object_name(a.object_id) as N'表名称',
       b.name N'索引名称',
       user_seeks N'用户索引查找次数',
       user_scans N'用户索引扫描次数',
       last_user_seek N'最后查找时间',
       last_user_scan N'最后扫描时间',
       rows as N'表中的行数'
from sys.dm_db_index_usage_stats a join 
     sys.indexes b
     on a.index_id = b.index_id
     and a.object_id = b.object_id
     join sysindexes c
     on c.id = b.object_id
where database_id=db_id('SFCGaeaSPK')   ---改成要查看的数据库
and object_name(a.object_id) not like 'sys%'
order by rows DESC,user_seeks,user_scans,object_name(a.object_id)




--查询提供缺失索引的数据库、架构和表的名称。它还提供应该用于索引键的列的名称
USE ******
GO
SELECT migs.group_handle, mid.*
FROM sys.dm_db_missing_index_group_stats AS migs
INNER JOIN sys.dm_db_missing_index_groups AS mig
ON (migs.group_handle = mig.index_group_handle)
INNER JOIN sys.dm_db_missing_index_details AS mid
ON (mig.index_handle = mid.index_handle)
WHERE migs.group_handle = 2


--要查询索引缺失的数据库
USE ******
GO
SELECT * FROM sys.[dm_db_missing_index_details]
SELECT * FROM sys.[dm_db_missing_index_groups]
SELECT * FROM sys.[dm_db_missing_index_group_stats]
SELECT * FROM sys.[dm_db_missing_index_columns](1) --1 :1是根据dm_db_missing_index_details查出来的



查询锁

select   request_session_id  ,OBJECT_NAME(resource_associated_entity_id)tableName  ,program_name,sp.hostname,a.[Text]AS[TextData]

from   sys.dm_tran_locks,sys.sysprocessesASspOUTERAPPLYsys.dm_exec_sql_text(sp.sql_handle)ASA

where resource_type='OBJECT'

AND request_session_id=spid



*********************阻塞查询**************************


1.整体阻塞情况,阻塞时间超过1000毫秒
select T.session_id AS waiting_session_id,
DB_NAME(L.resource_database_id) AS DatabaseName,
T.wait_duration_ms/60000 AS Duration_in_minutes,
T.waiting_task_address,
L.request_mode,
L.resource_type,
L.resource_associated_entity_id,
L.resource_description AS lock_resource_description,
T.wait_type,
T.blocking_session_id,
T.resource_description AS blocking_resource_desctiption


from sys.dm_os_waiting_tasks AS T 


join sys.dm_tran_locks AS L on T.resource_address=L.lock_owner_address
where T.wait_duration_ms>1000
and T.session_id>50;


2.阻塞语句,阻塞时间超过1000毫秒
select T.session_id as waiting_session_id,
DB_NAME(L.resource_database_id) AS DatabaseName,
T.wait_duration_ms/60000 AS duration_in_minutes,
T.waiting_task_address,
L.request_mode,
(select substring(Q.text,(R.statement_start_offset/2)+1,
((CASE R.statement_end_offset 
when -1 then datalength(Q.text)
else R.statement_end_offset
END -R.statement_start_offset)/2)+1)
from sys.dm_exec_requests AS R
CROSS APPLY sys.dm_exec_sql_text(R.sql_handle) AS Q
where R.session_id=L.request_session_id
)AS  waiting_query_text,
L.resource_type,
L.resource_associated_entity_id,
T.wait_type,
T.blocking_session_id,
T.resource_description AS blocking_resource_description,
CASE when T.blocking_session_id>0
then (select ST2.text 
from sys.sysprocesses AS P
cross APPLY
sys.dm_exec_sql_text(P.sql_handle) AS ST2
where P.spid=T.blocking_session_id)
ELSE NULL
END AS blocking_query_text
FROM sys.dm_os_waiting_tasks AS T
join sys.dm_tran_locks  AS L on T.resource_address=L.lock_owner_address
where T.wait_duration_ms>1000
and T.session_id>50;


****************常用***************



1、select DB_ID('')

2、修改列名

      exec sp_rename ‘Table.OldName’,'NewName','column';

3、添加自增长列

    alter table T add  ID bigint Identity(1,1)


0 0
原创粉丝点击