AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 228561
Accepted
Kimo
Kimo
Asked: 2019-02-01 05:45:01 +0800 CST2019-02-01 05:45:01 +0800 CST 2019-02-01 05:45:01 +0800 CST

为什么索引重建需要 Sch-M 锁?

  • 772

我不明白为什么索引重建需要给定索引上的 Sch-M 锁。

sql-server database-internals
  • 2 2 个回答
  • 1425 Views

2 个回答

  • Voted
  1. Paul White
    2019-02-01T06:19:46+08:002019-02-01T06:19:46+08:00

    How Online Index Operations Work的文档说:

    SCH-M(架构修改)如果任何源结构(索引或表)被删除。*

    * 索引操作等待任何未提交的更新事务完成,然后再获取表上的 S 锁或 SCH-M 锁。

    那是专门针对在线操作的。如果你问的是离线操作,逻辑是一样的:没有什么可以访问一个即将被删除的结构,甚至不能Sch-S只在系统事务中使用,也不能在系统事务中使用。还要注意那里的“(索引或表)”,因此这适用于所有索引(包括聚集)和堆表。

    前段时间,Sch-M在创建索引视图时应用了限制。这被指出是不必要的(连接链接不再可用),因为没有结构被删除,只是被创建,所以行为被改变了(只接受Sch-S和Tab-S)。

    也与文档相关:

    ALTER TABLE获取表上的模式修改 ( SCH-M) 锁,以确保在更改期间没有其他连接引用甚至表的元数据...

    在同一个链接中,SQL Server 2012 引入了添加NOT NULL列的功能,Sch-M只要默认值为运行时常量即可。我提到这一点是因为它显示了 SQL Server 如何发展以尽可能减少不必要的限制性锁定。如果您发现某个特定情况Sch-M确实没有必要,您可以在Microsoft 反馈站点上提出建议。

    此外,在Unicorns、rainbows 和在线索引操作中,Paul Randal 说:

    当索引操作完成时,就更新而言,新旧索引处于锁定状态。需要模式修改锁(SCH_M 锁模式)才能完成操作。您可以将其视为超级表 X 锁——它需要增加表的主版本号——无法在表上运行任何操作,并且在持有锁时无法编译任何计划。

    相关链接:

    • Michael J Swart的 Sch-M 锁是邪恶的
    • 11
  2. Best Answer
    sepupic
    2019-02-01T06:23:48+08:002019-02-01T06:23:48+08:00

    当发生任何元数据更改时,将获取模式修改 ( Sch-M) 锁。

    在index rebuild(online或offline) 的情况下,将构建 an 的新副本,并删除index旧的。index在删除旧索引之前,需要更新表元数据。

    所以在索引重建的最后阶段,Sch-M锁被用来替换metadata.

    更新

    回复评论

    在线添加(不是重建!)一个新的非聚集索引不需要 Sch-M。– 保罗·怀特

    好的。这是我的新复制品:

    use tempdb;
    go
    
    create table dbo.t (id int);
    insert into dbo.t values (1);
    go
    
    begin tran;
    create index IX_t on dbo.t (id) with (online = on);
    
    select l.request_mode, 
           l.resource_type, 
           l.resource_subtype, 
           l.resource_associated_entity_id, 
           object_name(p.object_id), 
           p.index_id
    from sys.dm_tran_locks l 
         left join sys.partitions p 
            on p.hobt_id = l.resource_associated_entity_id
    where l.request_session_id = @@spid and l.request_mode = N'Sch-M';
    
    commit;
    go
    

    在此处输入图像描述

    • 4

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve