月度归档:2017年12月

mssql sql server 查看被锁的表和解锁的方法


摘要:
由于开发人员的水平参差不齐,当系统在高并发的情况下,非常容易产生死锁,
下午将讲述,如何查看被锁定(阻塞)的表和解锁



mssql sql server查看被锁表涉及系统表
select * from sys.dm_tran_locks


1 查看被锁定的表及对应的db-进程ID

  select a.request_session_id as [spId],b.name as [表名] from sys.dm_tran_locks a 
left join sysobjects b on a.resource_associated_entity_id = b.id 
where a.resource_type='OBJECT'
and    db_Name(a.resource_database_id) = '指定数据库名称' 

2 通过以下名称获取 进程ID所对应的sql语句

 dbcc inputbuffer(spid)

3 通过kill命令关闭 spid ,及可释放被锁表所占用的资源

 kill spid 

mssql sql server sys.sysprocesses 系统表简介

摘要
下文主要介绍 sysprocesses的功能及返回字段说明及应用场景



目录
1. sys.sysprocesses 系统表功能简介
2. sys.sysprocesses 系统表返回字段说明
3. sys.sysprocesses 系统表应用场景



1. sys.sysprocesses 系统表功能简介

sys.sysprocesses 是mssql数据库中一个非常重要的视图,主要用于返回当前db服务器中的运行中的进程ID



2. sys.sysprocesses 系统表返回字段说明

  select * from  sys.sysprocesses 
  

返回列说明:
2.1 spid:返回smallint类型,此列值为sql server session Id
2.2 kpid:返回samllint类型,此列值为window线程ID
2.3 blocked:返回smallint类型
如果此列为 null ,则代表此进程非阻塞,正常运行中,否则此列放置的为 被阻塞的进程spId
-2 被阻塞的进程为分布式事务
-3 资源阻塞导致
-4
2.4 waittype:返回binary类型 保留字段
2.5 waittime:返回bigint 当前进程等待时间 毫秒
0代表 进程未等待
2.6 lastwaittype:返回nchar 等待的类型
2.7 waitresource: 返回nchar 等待的资源位置 通常返回键锁定位置 RID: 12:1:1101210:0 2.8 dbId 返回smallint 返回当前进程所属的 数据库Id
2.9 uid 返回smallint 用户ID
2.10 cpu 返回进程所占用的Cpu 时间 毫秒 ,我们也可以通过打开 SET STATISTICS TIME on 属性 ,在查询分析器中查看cpu时间
2.11 physical_io 返回bigint 此进程累计使用硬盘的读和写
2.12 memusage 返回int 此进程所消耗的内存页数
2.13 login_time 返回datetime 此进程登陆服务器的时间
2.14 last_batch 返回datetime 此进程最后执行的时间,也可以理解为此进程执行完毕的时间
2.15 ecid 返回smallInt 通过此ID可以标识上下文的进程ID
2.16 open_tran 返回smallint 标识是否打开事务 此处值为1时,代表使用了 begin tran
2.17 status 返回nchar(30) 返回当前进程的状态

dormat:sql server重置了此session
running:此会话正在运行(运行完毕等待提交事务的进程 此处状态不为running)
background:此会话后台正在运行,例 死锁
rollback:此会话正在回滚
pending:此会话正在等待工作线程变为可用
suspended:此会话被其它进程阻塞需等待 ,例 事务未提交 I/o阻塞

sid:全球唯一用户标识
hostname:返回nchar 工作站名称
program_name 返回生成此会话的程序名称
hostprocess 返回工作站进程标识号
cmd:当前会话的命令描述 AWAITING COMMAND (等待命令)
nt_domain:当前客户端的作用域
nt_userName:当前客户端作用域的用户名
nt_address:此进程所对应用户的网络ID标识
net_library:此进程所对应的网络库
loginname:登陆sql所使用的用户名
context_info:
sql_handle:sql句柄 可关联其它系统函数,获取此进程所对应的sql脚本
note:
stmt_start:
stmt_end:
request_id:



3. sys.sysprocesses 系统表应用场景

检测系统当前被阻塞的进程ID

 select * from sys.sysprocesses where waittime >0 
 and blocked >0  ---获取进程被阻塞的ID 

检测指定数据库上的进程数

 select  *   from master..SysProcesses  where db_Name(dbID) = '指定数据库名称'    and spId <> @@SpId    and dbID <> 0

mssql sql server in exists关键字的应用


摘要:
下文主要讲述 in exists关键字的应用场景

例:
我们需要比对数据库中某一列的值是否包含指定的某些值,最笨的办法我们可以将待必定的多个值,分别使用
select [列名1],[列名2],[列名3]… from [表名] where [列名*] = ‘值1’ union all
select [列名1],[列名2],[列名3]… from [表名] where [列名*] = ‘值2’ union all
select [列名1],[列名2],[列名3]… from [表名] where [列名*] = ‘值3’


下文我们将讲述 使用 in 和 exists 关键字来进行比对
in 操作符用法

select [列名1],[列名2],[列名3]... from [表名]  where [列名*]  in ('值1','值2','值3') 

exists 操作符用法

create table #t([列名*] [列类型])
insert into #t values('值1'),('值2'),('值3')
select [列名1],[列名2],[列名3]... from [表名]  where exists(
select null from #t where #t.[列名*] = [表名].[列名*]
)
truncate table #t
drop table #t