SQLServer 表选项 LOCK_ESCALATION 对分区的影响

2023年 8月 12日 85.3k 0

SQLServer 使用锁管理器跟踪数据库对象是否被锁住,通常一个查询将锁住一行或者一页。当锁超过一定范围之后,SQLServer 尝试将锁升级为表锁来保证对内存的使用,锁升级有时会导致堵塞或者死锁。在SQL Server profiler中我们可以用 [Lock:Escalation] 事件来跟踪锁的升级。

在SQL Server 2005 中,可以使用跟踪标志 1211 来禁用整个实例中的锁升级。而在SQL Server 2008中,可以使用新的选择来禁止某个表的锁升级。

    ALTER TABLE SET (LOCK_ECALATION = AUTO | TABLE | DISABLE)

    AUTO 此选项允许 SQL Server 数据库引擎选择适合于表架构的锁升级粒度。
    (AUTO:如表已分区,将使用分区的hobt锁,但并发情况增加。)
    如果该表已分区,则允许将锁升级到分区。锁升级到分区级别之后,该锁以后将不会升级到 TABLE  粒度。
    如果该表未分区,则会将锁升级到 TABLE 粒度
    TABLE 无论表是否已分区,都会在表级粒度完成锁升级。 默认值为 TABLE
    DISABLE 在大多数情况下禁止锁升级。 表级别的锁未完全禁止。
    例如,当扫描在可序列化隔离级别下没有聚集索引的表时,数据库引擎必须使用表锁来保证数据的完整性。

    经过几次插入数据测试,使我要更改的这个条件的数据达到6500行,这样才进行锁升级。否则键锁和页锁非常多。

      --分区1:6500行

      select COUNT(*) from dbo.AABB where $partition.pf_sid(sid)=1

      --先测试表:TABLE

      ALTER TABLE dbo.AABB SET (LOCK_ESCALATION = TABLE);

      --查看锁

      begin tran

      update dbo.AABB set num=1

      where sid=0x0105000000000005150000002B5CA2768377FDF37E993215F4010000

      SELECT resource_type,resource_subtype,resource_description,request_mode,resource_associated_entity_id

      from sys.dm_tran_locks

      where resource_database_id=DB_ID() and request_session_id=@@SPID

      order by resource_type,resource_description

      rollback tran

      图一

      可以看到,对象表使用了排他锁,这样整个表都不能访问了!

        --再测试表:AUTO

        ALTER TABLE dbo.AABB SET (LOCK_ESCALATION = AUTO);

        图二

        这才是正常的!!只锁定其中1个分区,其他分区还可以访问和修改!(关联的分区id不一样,因测试换了几次表)。当我们把表分区的时候,设置表选项 ALTER TABLE dbo.[tableName] SET (LOCK_ESCALATION = AUTO),这样可以在不同分区并行访问!

        其他说明:

        • 触发锁升级:(数据库引擎不会将行锁或键范围锁升级到页锁,而是将它们直接升级到表锁)

        • 单个 Transact-SQL 语句在单个无分区表或索引上获得至少 5,000 个锁

        • 单个 Transact-SQL 语句在已分区表的单个分区上获得至少 5,000 个锁,并且 ALTER TABLE SET LOCK_ESCALATION 选项设为 AUTO

        • 数据库引擎实例中的锁的数量超出了内存或配置阈值

        • 如果由于锁冲突导致无法升级锁,则数据库引擎每当获取 1,250 个新锁时便会触发锁升级

        相关文章

        SQL数据库触发器语法详解 (sql数据库触发器语法)

        2023-08-06
        数据库
        语法
        触发器

        快速简单的删除Oracle数据库字段方法 (删除oracl数据库字段)

        2023-08-06
        数据库
        字段
        删除

        如何打开社工数据库bak文件 (社工数据库bak怎么打开)

        2023-08-06
        数据库
        打开
        社工

        实现数据库按拼音排序的方法和技巧 (数据库按拼音排序)

        2023-08-06
        数据库
        排序
        按拼音

        探究Sybase数据库的性能和功能特点 (sybase数据库怎么样)

        2023-08-06
        数据库
        性能
        探究

        SQL Server 如何成功建立自己的数据库? (sql server 建立数据库)

        2023-08-06
        数据库
        自己的
        建立

        如何在Oracle中查看数据库触发器? (oracle查看数据库触发器)

        2023-08-06
        数据库
        查看
        触发器

        数据库表数据量千万级,对性能影响有多大? (数据库表千万级数据量多吗)

        2023-08-06
        数据库
        级数
        有多大

        如何使用Oracle按时间导出表数据库? (oracle按时间导出表数据库)

        2023-08-06
        数据库
        导出
        如何使用

        数据库存储:帖子长期保存,信息永不丢失 (帖子存数据库)

        2023-08-06
        数据库
        丢失
        帖子

        小米六数据库:全方位数据保障和优化方案 (小米六数据库)

        2023-08-05
        数据库
        优化
        小米

        简易教程:使用dbe数据库实现数据连接 (dbe数据库 数据连接)

        2023-08-05
        数据
        数据库
        连接

        Oracle实现多个数据库链接的简便方法 (oracle链接多个数据库)

        2023-08-05
        数据库
        多个
        链接

        数据库索引:用哪种方法建立? (数据库索引用什么建的)

        2023-08-05
        索引
        数据库
        哪种

        实现高效缓存同步:Redis数据库技巧大全 (redis 数据库缓存同步)

        2023-08-05
        数据库
        缓存
        同步

        如何利用数据库实现高效的模糊匹配查询? (数据库实现模糊查询)

        2023-08-05
        查询
        数据库
        模糊

        数据库有哪些安装方式和位置? (数据库是装在什么上)

        2023-08-05
        数据库
        位置
        装在

        Lactmed数据库:妈妈们必备的喂养指南 (lactmed 数据库)

        2023-08-05
        数据库
        必备
        喂养

        数据库设计中的主属性定义及作用 (数据库主属性是什么)

        2023-08-05
        数据库
        定义
        属性

        数据库分区操作不当常常造成分区不清的问题 (分区不清数据库)

        2023-08-05
        数据库
        分区
        不清

        相关文章

        Oracle如何使用授予和撤销权限的语法和示例
        Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
        下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
        社区版oceanbase安装
        Oracle 导出CSV工具-sqluldr2
        ETL数据集成丨快速将MySQL数据迁移至Doris数据库

        发布评论