sqlserver数据库查询执行慢的sql
查询数据库隔离级别
dbcc useroptions
修改数据库为并行机制(快照模式)
(需要关闭数据库所有连接 sqlserverManager只开启当前一个链接执行)
alter database bstjxt set READ_COMMITTED_SNAPSHOT on ;
设置后比如
begin transaction;
update TJ_TJDJB set XM='张在1' where TJBH='00001504000001'
commit;
在没有commit之前如果隔离级别是已提交读的 ,没commit是不能执行下面查询的,会一直堵塞;
但是设置 READ_COMMITTED_SNAPSHOT后可以执行 查询出来的 XM字段是没commit之前的原始数据,这就是所谓的快照模块,执行update前会把原记录存一个副本(称为快照)在查询时直接取快照的数据,不需要等待update执行提交后取最新的数据
-- 在上诉的update没commit;时 查询出原数据
select * from TJ_TJDJB where TJBH='00001504000001'
关于sqlserver的隔离级别
sqlserver数据库默认的就是 已提交读 并且没有全局配置为其他隔离级别的
我们执行
SET TRANSACTION ISOLATION LEVEL Read UnCommitted ;
其实只对当前连接有效
新建一个连接 执行 dbcc useroptions发现这个链接的 隔离级别还是已提交读
但是
alter database bstjxt set READ_COMMITTED_SNAPSHOT on;
设置我测试确是全局的.
sqlserver 判断text字段不为空
select * from TJ_TJJLMXB where TJBH='80021606000011' and datalength(JG)>0
sqlserver查询锁表
select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName
from sys.dm_tran_locks where resource_type='OBJECT'
查询锁表的语句
dbcc inputbuffer(spid)
sqlserver 解锁
-- 56为锁表的进程PID,根据实际的PID代入
declare @spid int
Set @spid = 56 --锁表进程
declare @sql varchar(1000)
set @sql='kill '+cast(@spid as varchar)
exec(@sql)
sqlserver查询当前开启的session连接数
select * from sys.dm_exec_sessions;
sqlserverManager使用事物
begin transAction
update TJ_TJDJB set XM='徐宝兴1' where TJBH='0216999900576'
commit;提交 or ROLLBACK Transaction; 回滚
sqlserver查询执行耗时的sql语句 需要选择数据库master执行
SELECT TOP 1000 ST.text AS '执行的SQL语句',QS.execution_count AS '执行次数',QS.total_elapsed_time AS '耗时', --单位(微秒) 1毫秒等于1000微秒QS.total_logical_reads AS '逻辑读取次数',QS.total_logical_writes AS '逻辑写入次数',QS.total_physical_reads AS '物理读取次数', QS.creation_time AS '执行时间' , QS.*
FROM sys.dm_exec_query_stats QSCROSS APPLY
sys.dm_exec_sql_text(QS.sql_handle) ST
WHERE QS.creation_time BETWEEN '2015-08-01 00:00:00' AND '2015-09-02 11:00:00'
ORDER BYQS.total_elapsed_time DESC
加上每次执行平均耗时时间
SELECT TOP 1000 ST.text AS '执行的SQL语句',QS.execution_count AS '执行次数',QS.total_elapsed_time AS '耗时', --单位(微秒) 1毫秒等于1000微秒
cast(QS.total_elapsed_time as decimal )/QS.execution_count '每次耗时' , QS.total_logical_reads AS '逻辑读取次数',QS.total_logical_writes AS '逻辑写入次数',QS.total_physical_reads AS '物理读取次数', QS.creation_time AS '执行时间' , QS.*
FROM sys.dm_exec_query_stats QSCROSS APPLY
sys.dm_exec_sql_text(QS.sql_handle) ST
WHERE QS.creation_time BETWEEN '2018-05-21 00:00:00' AND '2018-05-21 11:00:00'
ORDER BY cast(QS.total_elapsed_time as decimal )/QS.execution_count desc,QS.total_elapsed_time DESC