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.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺 ...
随机推荐
- git merge 分支
把master merge到apple_campus1.git stash2.git checkout master3.git pull4.git checkout apple_campus5.git ...
- ZendFramework2 文件结构
Application |__ config // 配置文件目录 |__ language // 语言包目录 |__ src |__ Application |__ Controller // 控制器 ...
- NET Core开发-获取所有注入(DI)服务
NET Core开发-获取所有注入(DI)服务 获取ASP.NET Core中所有注入(DI)服务,在ASP.NET Core中加入了Dependency Injection依赖注入. 我们在Cont ...
- [TYVJ] P1030 乳草的入侵
乳草的入侵 背景 Background USACO OCT09 6TH 描述 Description Farmer John一直努力让他的草地充满鲜美多汁的而又健康的牧草.可惜天不从人愿,他在植物 ...
- HttpClient post中文乱码解决
在javase方式下使用HttpClient没有进行任何编码设置,本地从服务端获取到数据不存在中文乱码. 但是将此段代码部署到Tomcat下面出现了中文乱码,此时设置: post.getParams( ...
- 理解JMS规范中消息的传输模式和消息持久化
http://blog.csdn.net/aitangyong/article/category/2175061 http://blog.csdn.net/aitangyong/article/det ...
- 8051_asm.uew
/L20"8051 Assembly" AASM_LANG Line Comment = ; Nocase String Chars = ' File Extensions = S ...
- 关于《平安iOS面试》小结
面了下平安好医生iOS职位,结果不是很理想,也就是GG.写此文的目的在于,时刻提醒自己应该学到老,不要安于现状.也给那些以后去面试的coder一些"剧透"! 一.第一轮 妹子 面试 ...
- 【Samza系列】实时计算Samza中文教程(二)——概念
希望上一篇背景篇让大家对流式计算有了宏观的认识,本篇依据官网是介绍概念,先让我们看看有哪些东西呢? 概念一:Streams Samza是处理流的.流则是由一系列不可变的一种相似类型的消 ...
- 淘宝开源任务调度框架tbschedule
背景 分布式任务调度是非常常见的一种应用场景,一般对可用性和性能要求不高的任务,采用单点即可,例如linux的crontab,spring的quarz,但是如果要求部署多个节点,达到高可用的效果,上面 ...