理解SQL Server中的锁—T-SQL查询进阶(2)
来源:未知 责任编辑:责任编辑 发表时间:2014-01-26 22:00 点击:次
图5.在Profiler中捕捉锁信息
但默认如果不过滤的话,Profiler所捕捉的锁信息包含SQL Server内部的锁,这对于我们查看锁信息非常不方便,所以往往需要筛选列,如图6所示。
图6.筛选掉数据库锁的信息
所捕捉到的信息如图7所示。
图7.Profiler所捕捉到的信息
锁的粒度
锁是加在数据库对象上的。而数据库对象是有粒度的,比如同样是1这个单位,1行,1页,1个B树,1张表所含的数据完全不是一个粒度的。因此,所谓锁的粒度,是锁所在资源的粒度。所在资源的信息也就是前面图3中以Resource开头的信息。
对于查询本身来说,并不关心锁的问题。就像你开车并不关心哪个路口该有红绿灯一样。锁的粒度和锁的类型都是由SQL Server进行控制的(当然你也可以使用锁提示,但不推荐)。锁会给数据库带来阻塞,因此越大粒度的锁造成更多的阻塞,但由于大粒度的锁需要更少的锁,因此会提升性能。而小粒度的锁由于锁定更少资源,会减少阻塞,因此提高了并发,但同时大量的锁也会造成性能的下降。因此锁的粒度对于性能和并发的关系如图8所示。
图8.锁粒度对于性能和并发的影响
SQL Server决定所加锁的粒度取决于很多因素。比如键的分布,请求行的数量,行密度,查询条件等。但具体判断条件是微软没有公布的秘密。开发人员不用担心SQL Server是如何决定使用哪个锁的。因为SQL Server已经做了最好的选择。
在SQL Server中,锁的粒度如表1所示。
资源
说明
RID
用于锁定堆中的单个行的行标识符。
KEY
索引中用于保护可序列化事务中的键范围的行锁。
PAGE
数据库中的 8 KB 页,例如数据页或索引页。
EXTENT
一组连续的八页,例如数据页或索引页。
HoBT
堆或 B 树。 用于保护没有聚集索引的表中的 B 树(索引)或堆数据页的锁。
TABLE
包括所有数据和索引的整个表。
FILE
数据库文件。
APPLICATION
应用程序专用的资源。
METADATA
元数据锁。
ALLOCATION_UNIT
分配单元。
DATABASE
整个数据库。
表1.SQL Server中锁的粒度
锁的升级
前面说到锁的粒度和性能的关系。实际上,每个锁会占96字节的内存,如果有大量的小粒度锁,则会占据大量的内存。
下面我们来看一个例子,当我们选择几百行数据时(总共3W行),SQL Server会加对应行数的Key锁,如图9所示
相关新闻>>
最新推荐更多>>>
- 发表评论
-
- 最新评论 更多>>