SQL Server 的各种查询和要申请的锁
前期准备:
1、建表
create table T_Btree(X int primary key,Y nvarchar(4000));
create table T_Heap(X int,Y nvarchar(4000));
go
2、插入数据
declare @i as int =1;
while @i<4
begin
insert into T_Btree(X,Y) values(@i,REPLICATE(cast(@i as nchar(1)),4000));
insert into T_Heap(X,Y) values(@i,REPLICATE(cast(@i as nchar),4000));
set @i = @i +1;
end
go
内容输出:
表格1、
select 'T_Btree'as table_name,X,Y from T_Btree;
go

表格2、
select 'T_Heap' as table_name ,X,Y from T_Heap;
go

连接的隔离级别设置为:
repeatable read。
set transaction isolation level repeatable read;
设置为这个级别的原因:
repeatable read。
会一直持有锁直到事务完成。
用于查看事务锁的SQL:
select lock.request_type,lock.resource_description,lock.resource_associated_entity_id,lock.request_mode,lock.request_status
from sys.dm_tran_locks as lock;
go
-------------------------------------------------------------------------------------------------------------------------------------------------------------
1、
对于 select:
A、聚集索引的情况:
begin transaction;
select 'T_Btree' as table_name ,X,Y from T_Btree;
go
锁申请情况:

锁申请情况分析:
1、database S:是为了防止在读取数据期间database被别的事务删除。
2、page IS: 是为了防止在读取数据期间page被别的事务拆分。
3、key S:是为了防止在读取数据期间key(index)被别的事务删除。
4、object IS:是为了防止在读取数据期间table定义被别的事务修改。
B、非聚集索引的情况:
begin transaction;
select 'T_Heap'as table_name,X,Y from T_Heap
with (index(ix_nuc_for_THeap_X));---这里是为了使用索引ix_nuc_for_THeap_X、这样就可以看使用它会加一些什么锁。
go
索引使用情况:

1、database S:是为了防止在读取数据期间database被别的事务删除。
2、page IS: 是为了防止在读取数据期间page被别的事务拆分。
3、key S: 是为了防止在读取数据期间key(index)被别的事务删除。
4、object IS: 是为了防止在读取数据期间table定义被别的事务修改。
5、RID S:是为了防止在读取数据期间RID被别的事务删除。
2、
对于 update
SQL server 先可把目标数据找到、然后在做修改。打目标数据要加 S 、然后加 U 、 最后升级到 X;
A聚集索引的情况:
begin transaction
update T_Btree
set Y = 'AAA';
go

1、Key X :索引的叶子结点就是数据、要修改数据所以要加X锁。
B非聚集索引的情况:
begin transaction
update T_Heap
set Y = 'AAA';
go

1、RID X :修改后行号马上就变了、所以要加 X 锁。
2、key U :索引就要更新了 U 锁。
3、
delete:
A聚集索引的情况:

B聚集索引的情况:

4、
insert、
A聚集索引的情况:
begin tran;
insert into T_Btree(X,Y) values(4,'44444');
go

B聚集索引的情况:
begin tran;
insert into T_Heap(X,Y) values(4,'44444');
go

-------------------------------------------------------------------------------------------------------------------------------------------------------
总结:
select
1、 查询运行中每一条读到的记录或键值加 S 锁,如果记录不用返回就马上释放锁,如果用就根据隔离级别而定。
2、对于每一个索引都会在上面的键值加 S 锁
3、对于每个读过的页面,都加 I(意向) 锁。
4、查询要扫描的页记录越多、锁的数目也越多、查询用到的索引越多,锁的数目也越多。
所以、
1、尽量减小记录集
2、尽量使用 index scan 避免全表扫描
3、尽量设计好index ,力求一个索引就可以完成一个查询任务
upate
1、对于每个索引都会加 U 锁
2、只对要修改的记录和键加 X 锁
3、与目标列相关的索引越多,锁的数目也会越多。
4、扫描过的数据页面越多、意向锁也就越多,在扫描的过程中,对所有扫描到的记录加锁,哪怕上面没有修改。
所以、
1、尽量减小记录集
2、尽量减少无用的索引
3、尽量使用 index scan 避免全表扫描
delete
1、第一步先要找到要删除的数据、第二步删除目标数据。数据有好的索引第一步申请的锁就会少一些。
2、 delete不只是要删除数据本身,还要删除索引键,所以一张表上的索引越多,删除时要加的锁就越多,
就越容易阻塞。
所以、
只有那些有必要的索引我们才创建。
SQL Server 的各种查询和要申请的锁的更多相关文章
- 【转】SQL Server T-SQL高级查询
SQL Server T-SQL高级查询 高级查询在数据库中用得是最频繁的,也是应用最广泛的. Ø 基本常用查询 --select select * from student; //查询student ...
- SQL SERVER中XML查询:FOR XML指定PATH
SQL SERVER中XML查询:FOR XML指定PATH 前言 在SQL SERVER中,XML查询能够指定RAW,AUTO,EXPLICIT,PATH.本文用一些实例介绍SQL SERVER中指 ...
- Sql Server 存储过程中查询数据无法使用 Union(All)
原文:Sql Server 存储过程中查询数据无法使用 Union(All) 微软Sql Server数据库中,书写存储过程时,关于查询数据,无法使用Union(All)关联多个查询. 1.先看一段正 ...
- SQL Server数据库————连接查询和分组查询
SQL Server数据库————连接查询和分组查询 分组查询 select 列from <表名> where …… group by 列 注意:跟order by一样group ...
- (4.21)sql server中复制查询结果集
在查询结果窗口中复制列标题似乎是一项简单的任务,但对于业余爱好者来说,这可能是一场噩梦. 没有可见的指令/链接/按钮,其中一个可以使用列标题单击和复制所选数据.让我们看看如何在SQL Server M ...
- SQL Server跨服务器查询的实现方法,OpenDataSource
SQL Server跨服务器查询的方法我们经常需要用到,下面就为您介绍两种SQL Server跨服务器查询的方法,如果您感兴趣的话,不妨一看. SQL Server跨服务器查询方法一:用OPENDAT ...
- SQL Server多条件查询的实现
SQL Server多条件查询的实现 SQL Server多条件查询我们经常会用到,下面就教您如何使用存储过程实现SQL Server多条件查询,希望对您学习SQL Server多条件查询方面有所帮助 ...
- sql server block如何查询并kill
本帖提供两种做法,可避免在 SQL Server 事务锁定时产生的不正常或长时间阻塞,让用户和程序也无限期等待,甚至引起 connection pooling 连接数超过容量. 所谓的「阻塞」,是指当 ...
- SQL Server查询优化方法(查询速度慢的原因很多,常见如下几种) .
今天看到一位博友的文章,觉得不错,转载一下,希望对大家有帮助,更多文章,请访问:http://blog.haoitsoft.com 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺 ...
随机推荐
- [TYVJ] P1049 最长不下降子序列
最长不下降子序列 描述 Description 求最长不下降子序列的长度 输入格式 InputFormat 第一行为n,表示n个数第二行n个数 输出格式 OutputFormat 最长不下降子 ...
- VS2010常用的调试方法
1.一直以来都没用过command window, F5以后可以这样用,直接对一个函数,或者变量做模块测试 以下还有一些常用的技巧: 1 悬停鼠标查看表达式值 调试是很有挑战性的.比如在函数内逐步运行 ...
- 图片旋转+剪裁js插件(兼容各浏览器) « 张鑫旭-鑫空间-鑫生活
图片旋转+剪裁js插件(兼容各浏览器) « 张鑫旭-鑫空间-鑫生活 图片旋转+剪裁js插件(兼容各浏览器) by zhangxinxu from http://www.zhangxinxu.com 本 ...
- linux 安装gcc和g++
linux中安装gcc和g++ 今天在linux的服务器上安装C/C++的编译器gcc和g++,运行了如下两条命令: 1 yum install gcc yum install g++ 然后发现gcc ...
- 多线程并发 synchronized对象锁的控制与优化
本文针对用户取款时多线程并发情境,进行相关多线程控制与优化的描述. 首先建立用户类UserTest.业务操作类SynchronizedTest.数据存取类DataStore,多线程测试类MultiTh ...
- LINUX下 Udev详解
如果你使用Linux比较长时间了,那你就知道,在对待设备文件这块,Linux改变了几次策略.在Linux早期,设备文件仅仅是是一些带有适当的属性集的普通文件,它由mknod命令创建,文件存放在/dev ...
- windows下启动/关闭Sybase数据库服务器
启动.关闭Sybase数据库服务器 一.启动Sybase服务器 在windows下介绍两种方法启动Sybase数据库服务器. 1.通过服务器管理器 依次打开控制面板>管理工具>服务 管理窗 ...
- mysql 分库分表的方法
分表后怎么做全文搜索 1.merge方式分表(不好) 2. 使用 sql union 3 使用Sphinx全文检索引擎 一,先说一下为什么要分表 当一张的数据达到几百万时,你查询一次所花的时间会变多, ...
- onvif规范 中文介绍
什么是ONVIF ? ONVIF规范描述了网络视频的模型.接口.数据类型以及数据交互的模式.并复用了一些现有的标准,如WS系列标准等. ONVIF规范的目标是实现一个网络视频框架协议,使不同厂商所生产 ...
- Android studio教程:[4]真机测试
有了Android studio这么好用的软件,自然要有一部不错的安卓手机,然后在真机上测试自己的程序,那样才能更好的发现程序中存在的问题,毕竟模拟器不是真正的手机嘛. 工具/原料 Android s ...