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 / 问题 / 6512
Accepted
Onion-Knight
Onion-Knight
Asked: 2011-10-05 10:53:27 +0800 CST2011-10-05 10:53:27 +0800 CST 2011-10-05 10:53:27 +0800 CST

行级和页级锁定的区别和后果

  • 772

尝试运行维护计划时,我收到以下错误:

执行查询“”失败,出现以下错误:“无法重新组织表“”上的索引“”(分区 1),因为禁用了页级锁定。”

我们目前在此索引上启用了行级别锁定。我可以启用页面级别锁定,但我不确定会产生什么影响。

我的问题是:这两种锁定方案有什么区别,它们在现实世界(生产中)的后果是什么?

sql-server maintenance
  • 2 2 个回答
  • 21725 Views

2 个回答

  • Voted
  1. Best Answer
    Mark Storey-Smith
    2011-10-05T17:01:25+08:002011-10-05T17:01:25+08:00

    执行查询“”失败,出现以下错误:“无法重新组织表“”上的索引“”(分区 1),因为禁用了页级锁定。”

    维护计划必须尝试 ALTER INDEX REORGANIZE,这是一个在线操作。要删除碎片(页面不按顺序),必须锁定和移动页面,如果页面锁定已禁用,则这是不可能的。在没有页面锁的情况下进行碎片整理的唯一方法是锁定整个分区,这对于 REORGANIZE 是不可能的,因为它只在线。

    这两种锁定方案有什么区别,它们在现实世界(生产中)的后果是什么?

    您需要掌握记录和页面是什么来评估禁止特定锁定类型的影响。如果您不熟悉 SQL Server 存储内部结构,请从Anatomy of a Record和Anatomy of a Page开始。简单地说:

    • 行 = 记录
    • 行存储在 8kb 的页面中

    如果您要更改允许的锁类型:

    • 禁用页锁 = 仅行锁和表锁
    • 禁用行锁 = 仅页锁和表锁
    • 两者都禁用 = 仅表锁

    我知道在两种情况下禁止锁定类型是有益的。并不意味着没有其他人,希望其他人会举例说明。

    一个经常访问的查找表,但不经常更改- 通过禁用页级和行级锁,所有读取器都将获取共享表锁。这更快/更便宜,而不是通常在表上的意图共享,然后是页面上的意图共享,最后是特定行或行上的共享锁。

    防止特定的死锁情况- 如果您遇到由并发进程获取经常在同一页上的锁而导致的死锁,则不允许行锁会导致取而代之的是页锁。然后一次只有一个进程可以访问该页面,另一个必须等​​待。

    第一个例子是微优化,不太可能在典型系统上产生可衡量的收益。第二个将解决特定的死锁场景,但可能会引入意想不到的副作用,例如在不同的代码部分中杀死并发。难以全面评估影响,谨慎接近!

    默认情况下两者都启用,并且不应在没有正当理由的情况下更改此设置。

    • 16
  2. gbn
    2011-10-05T11:53:48+08:002011-10-05T11:53:48+08:00

    大概什么都没有。我敢肯定 MS 比你我更了解

    我曾在大容量 OLTP 系统上工作过,但从未觉得需要更改设置。应该重试死锁,因为无论如何它们都会发生

    引用SQL Server 存储引擎博客“SQL2005 中的锁升级”无论如何都值得一读。

    默认情况下,我们同时启用了 ROW 和 PAGE 锁...SQL Server 在大多数情况下选择 ROW 锁粒度,但可以在适当的情况下选择 PAGE 锁。因此,对于您指定的情况,很可能是 ROW 锁。无法在数据库或实例级别关闭 PAGE 锁定。您是否因 PAGE 锁而遇到阻塞?

    我认为,如果您只强制行锁,那么您将消耗可以在其他地方更有效地使用的资源。如果您的负载足够高,这很重要,那么为什么要消耗内存?博客文章对此进行了介绍

    我怀疑这背后有一些迷信,就像这些:

    • “避免基于递增键创建聚集索引”是 SQL Server 2000 天的神话吗?
    • 并行最佳实践
    • 9

相关问题

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

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

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

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

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

Sidebar

Stats

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

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

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

    • 4 个回答
  • Marko Smith

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

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +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
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +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